Unity/엔진프로그래밍

0415_좀비슈터 단계별 테스트 _ IK 사용하여 총에 손 달기

minquu 2021. 4. 15. 10:34
반응형

테스트를 하기 위해서는 최대한 간략하게 기능만 봐야한다.

 

새로운 씬 만들기 

 

0. 캐릭터 생성 및 건 피봇, 건 생성하기 

 

 

1. IK를 사용하려면 먼저 캐릭터에 애니메이터에서 IK를 체크를 해줘야한다,.

 

틀린방법

{

2.  캐릭터와 총을 새로운 게임오브젝트에 자식으로 넣고 IKTest 스크립터(IK 테스트를 할)를 넣어준다.

 

 

}

 

3. 스크립터를 작성하고, 핸들에 손을 붙여준다..

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IKTest : MonoBehaviour
{
    public Animator anim;
    public Transform leftHandMount;
    public Transform rightHandMount;

    private void OnAnimatorIK(int layerIndex)
    {
        // 0..1 범위의 가중치 값을 설정하여 IK가 조준 할 시작 위치와 목표 위치 사이의 거리를 결정합니다. 
        anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
        anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
        //위치 자체는 SetIKPosition을 사용하여 별도로 설정됩니다 .
        anim.SetIKPosition(AvatarIKGoal.LeftHand, leftHandMount.position);
        anim.SetIKRotation(AvatarIKGoal.LeftHand, leftHandMount.rotation);

        anim.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
        anim.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);
        anim.SetIKPosition(AvatarIKGoal.RightHand, rightHandMount.position);
        anim.SetIKRotation(AvatarIKGoal.RightHand, rightHandMount.rotation);
    }
}

 

이렇게 했는데 안된다...

 

문제해결 -> 2.  캐릭터와 총을 새로운 게임오브젝트에 자식으로 넣고 IKTest 스크립터(IK 테스트를 할)를 넣어준다. 

이부분이 새로운 오브젝트에 자식으로 넣는게 아니라, 기존 캐릭터에 넣는것이다. (즉, 애니메이터가 안에 있어야한다.)

 

--->>

 

2. (수정) 기존 우먼에 건피봇과 건을 넣어주고, 안에 스크립터를 넣어준다.

이런식으로 제일 상위계층(woman)안에 건을 넣고, 스크립터를 달아줘야한다.

즉. 애니메이터가 안에 있어야한다.

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IKTest : MonoBehaviour
{
    public Animator anim;
    public Transform leftHandMount;
    public Transform rightHandMount;

    private void OnAnimatorIK(int layerIndex)
    {
        // 0..1 범위의 가중치 값을 설정하여 IK가 조준 할 시작 위치와 목표 위치 사이의 거리를 결정합니다. 
        anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
        anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
        //위치 자체는 SetIKPosition을 사용하여 별도로 설정됩니다 .
        anim.SetIKPosition(AvatarIKGoal.LeftHand, leftHandMount.position);
        anim.SetIKRotation(AvatarIKGoal.LeftHand, leftHandMount.rotation);

        anim.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
        anim.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);
        anim.SetIKPosition(AvatarIKGoal.RightHand, rightHandMount.position);
        anim.SetIKRotation(AvatarIKGoal.RightHand, rightHandMount.rotation);
    }
}

SetIKPositionWeight() 는 목표지점과 목표 위치 사이의 거리를 결정을 함

 

 

 

 

SetIKPosition() 는 현재 IK의 goal (손, 팔꿈치 등등)을 value -> Vecter3의 위치로 옮겨주는 것을 뜻함

 

 

 

 

---

 

 

 

반응형