유니티 상호작용 가능한 대상을 바라보는 LookAt
오늘의 키워드
- LookAt
- 머리 회전
- Animator
안녕하세요 오늘은 상호 작용 대상을 3D 캐릭터가 바라보는 기능에 대해서 포스팅을 해볼까 합니다.
내용은 구체적은 구현은 없으며, 작업하다가 발생한 문제점 등을 포스팅 할겸 가볍게 포스팅 해보겠습니다.
https://www.youtube.com/watch?v=hAQRk8s0Oo8
제가 오늘 구현할 내용은 이 유튜브에 정확히 구현되어 있기에,
만약 해당 내용을 구현하고 싶으신 분들은 윗 유튜브 영상을 보시고 따라하시는 것을 추천드립니다.
제가 구현하려는 내용은 원신에서 상호 작용이 가능한 엔티티가 근처에 존재할 때
고개를 돌려 바라보게 하는 기능입니다.
상세 내용
보통 3D 캐릭터의 구조는
1. 리깅으로 Bone의 정보를 담고 있는 Amature 오브젝트
2. 시각적인 정보를 보여주는 렌더링 되는 오브젝트
로 이루어져있습니다.
그리고 저희가 구현할 기능은 특정 사물을 바라보는 기능입니다.
이럴 때 유니티를 처음 접하시는 분들은,

'그냥 머리 오브젝트를 돌려서 바라보게 하면 되는거 아닌가?'
라고 생각해서 머리 오브젝트를 GameObject 필드에 넣어서 돌려주거나 하실 겁니다.
하지만 실제로 저희는 캐릭터에게 애니메이터를 부여하고,
애니메이터를 통해서 애니메이션을 재생하기 때문에
런타임 시에는 본을 움직여도 제어가 되지 않습니다.
하지만 Unity에서는 각 부위 별로 가중치를 주고 transform.LookAt()과 같은 기능을 Animator에서 제공해줍니다.
animator.SetLookAtWeight(1f, 0.3f, 0.6f);
애니메이터에서는 기본적인 가중치와 Body, Head 등의 가중치를 수치화해서 모션에 영향의 차이를 줄 수 있습니다.
animator.SetLookAtPosition(lookAtTarget.transform.position);
가중치를 0 초과로 준 후에 SetLookAtPosition(대상)을 실행하면
해당 대상을 향해서 캐릭터가 실행 중인 애니메이션을 Override하여 바라보게 됩니다.
주의 사항
1. 해당 기능은 OnAnimatorIK 또는 OnStateIK 함수에서만 작동합니다.
Update | FixedUpdate 등에서 호출하여도 실행되지 않습니다.
2. Script를 반드시 Animator가 있는 오브젝트에 부착해야 합니다.
이걸 몰랐기에 2시간을 낭비...
OnAnimatorIK는 애니메이터에 접근하여 실행되는 함수라고 생각하면 됩니다.
그런데 만약 자식 오브젝트에 Animator가 존재하고, 스크립트는 부모 오브젝트에 부착할 경우
이는 작동하지 않습니다.
결과
이 기능은 굳이 필요한 기능은 아니지만 디테일한 게임을 구현할 때는 추가해보면 좋은 기능입니다.
원신 말고도 사일런트 힐 등 퍼즐 요소가 있고 상호 작용이 중시되는 게임이라면 좋은 기능입니다.
좀 더 디테일한 구현을 바라시는 분은
FOV를 통한 시야각과
Physics.OverlapCircle을 사용하여 주변 오브젝트를 인지하는 범위를 추가해보시는 것은 어떨까요?
감사합니다.