함수
마네킹의 컨트롤릭 에셋 CR_Mannequin_BasicFoot 의 로직을 보면 FootTrace라는 지역 함수가 보인다.

이 노드의 입력 파라메터는 ik Foot Bone이라는 이름의 구조체 변수이며 변수의 멤버 변수 중 Type은 Bone이고 Name은 IK_foot_L임이 보인다. 해당 뼈를 입력인자로 전달중인 것.
아웃핀은 Offset이라는 이름의 3차원 벡터이다.
해당 노드를 더블클릭 하면 아래와 같은 함수 내용이 나온다.

함수는 Entry노드에서 시작 -> Return 노드로 끝나며 여기에 앞서 보았던 input 파라메터(변수)와 리턴값 Offset이 보인다.
input 파라메터로 발뼈가 들어왔으므로 화면상단 첫번째 Get Transform – Bone노드에서는 발뼈의 위치(Transform)을 확보(Get)한다.
두번째 Get Transform – Bone 노드에서는 최상위 뼈인 Root본의 위치를 확보(Get)한다.
참고로 이 Get Transform – Bone 노드들은 로컬좌표를 다룬다. 노드 하단 Space 핀에 Global Space라는 옵션이 있는데, 이는 글로벌 로컬좌표를 의미한다.
캐릭터의 각 뼈들은 저마다의 local 좌표를 가지고 있기 때문에 모든 뼈들이 공유하는 글로벌 로컬좌표가 또 존재하는 Global Space는 이를 지칭한다.
트레이스(Trace, 추적)
Sphere Trace By Trace Channel 노드는 트레이스를 수행한다.
유니티에서는 캐스트(Cast)라고도 하며 아래 상황과 같다.

이는 가운데 그림을 기준으로 위에서 구체(스피어, Sphere)를 떨어트리는데 벽과 충돌하는 시점에 구의 색이 초록색으로 바뀐 상황.
이런 트레이스 동작은 충돌한 위치를 감지함으로서 해당 벽의 높이를 알 수 있다.
우리는 캐릭터의 발이 딛게될 바닥의 높이를 이 스피어 트레이스로 찾고있다.
이 스피어 트레스 노드가 사용할 시작 점과 끝점을 정하기 위해 Add 노드와 Subtract 노드가 사용되고 있으며 아래와 같은 설정을 하고 있다.
- 발이 디뎌야 할 바닥의 높이가 현재 발뼈의 위치보다 높을수 있다 이땐 발을 올려야 한다. 이를 체크하기 위해 스피어 트레이스의 시작점은 현재 발의 높이보다 30 높다.
- 발이 디뎌야 할 바닥은 높이는 낮으수 있으며 이땐 발을 내려야 한다. 이를 체크하기 위해 스피어스 트레이스의 체크 종료 지점은 발의 높이보다 50 낮다.
- 발뼈의 위치는 사실 발목쪽에 가깝다(맨위의 그림 참고) 발목 앞 5정도의 위치가 실제 가장 낮은 발바닥일 것이다. 이를 위해 스피어 트레이스 위치를 발뼈보다 y축으로 5정도 앞당겨 사용하고 있다.
트레이스 채널
게임상에는 여러 오브젝트(화살, UI창, 대지)들이 존재할 것이다. 이중 화살이 유저인터페이스(UI)인 인벤토리 창과 부딪히면 안될 것이다.
또 아군의 화살의 경우 같은 아군과 충돌하지 않으며, 종종 주변 환경의 나무 바위와도 충돌하지 않기도 하다.
때문에 오브젝트들은 저마다의 충돌 채널을 가질수 있으며, 원하는 오브젝트들 채널과 충돌처리를 할 수 있다.
그림상에 보이는 Sphere Trace by Trace Channel은 사용하는 스피어를 Visibility 채널에 속하도록 한다.

참고로 우리의 마네킹 캐릭터는 Visibility 채널의 물체를 무시하도록 설정되어있다.

그래서 스피어 트레이싱을 할때 구체는 마네킹의 발등과 충돌하지 않는다.
이후 Sphere Trace by Trace Channel는 스피어트레이싱의 성공여부와 충돌한 곳의 위치정보를 리턴한다.
참고로 충돌한 곳의 위치좌표는 로컬 좌표(컴포넌트 좌표)이다. 로컬 좌표계는 마네킹 캐릭터의 양발 사이즈음 0,0,0으로 하는 좌표로 보면 된다, 그래서 이 히트 로케이션은 설령 캐릭터가 월드 좌표상 매우 높은 곳이나 낮은 곳에 있다 해도 상대적으로 작은 양수나 음수가 나온다. Offset인것.
이 충돌위치는 이 함수 FootTrace의 외부로 리턴되고 있다.