[Unity] Final IK를 사용해 물체를 향해 손뻗게 하기

John Jean·2024년 12월 9일

Lazy Sweeper

목록 보기
5/9

많이 허접한 프로젝트지만 조금의 디테일이라도 살리기 위해 쓰레기를 주울때 쓰레기 오브젝트를 향해 손을 뻗도록 해봤다.

Final IK 에셋을 썼고, 에셋을 제대로 써보는건 처음이라 조금 난감했지만, 도큐먼트와 튜토리얼이 상당히 잘되어 있어서 어찌저찌 성공했다.

캐릭터 컴포넌트에 Full Body Biped IK 추가. 인간 형태의 본을 사용한다면 가장 많이 쓰인다는 컴포넌트라고 함.

using RootMotion.FinalIK;

...


// rightHandTarget은 오른손이 향할 오브젝트로 캐릭터의 자식 오브젝트로 추가했다.
public FullBodyBipedIK ik;
public Transform rightHandTarget;

...

void Update()
{
		...
        
        // 조준한 쓰레기 위치로 rightHandTarget 이동
        rightHandTarget.position = hit.transform.position;
}

...

IEnumerator IncreaseIKWeight()
{
    float duration = 1.3f;
    float elapsed = 0f;

    // IK target 설정
    ik.solver.rightHandEffector.target = rightHandTarget;

    while (elapsed < duration)
    {
        elapsed += Time.deltaTime;
        float t = elapsed / duration;

        ik.solver.rightHandEffector.positionWeight = Mathf.Lerp(0f, 1f, t);
        ik.solver.rightHandEffector.rotationWeight = Mathf.Lerp(0f, 1f, t);

        yield return null;
    }

    CompletePickup();
}
...

우선, 레이캐스팅으로 조준한 쓰레기의 위치로 rightHandTarget을 이동시킨다.

그 다음 IK에 방금 추가한 컴포넌트를, Right Hand Target에 생성해놓은 자식 오브젝트를 추가하면 간단하게 완성된다.

IncreaseIKWeight()가 호출되면, 오른손이 rightHandTarget의 위치로 이동한다.

IK가 완료된 시점에서 PickupTrash()가 호출되는데, 쓰레기를 플레이어의 손에 있는 TrashPosition의 자식에 추가해 고정한다.

currentTrash.transform.SetParent(trashPosition);

반대로 던질때는, 던지고자하는 애니메이션 시점의 프레임에 던지는 메서드를 추가하면 되는데,

currentTrash.transform.SetParent(null); 이걸로 손에서 떼고
rb.AddForce(throwDirection * throwForce, ForceMode.Impulse); 이 부분에서 임팩트를 준다.

profile
크래프톤 6기 정글러

0개의 댓글