유니티 믹사모 이용한 3d리깅 방법 및 두가지 이상 애니메이션 적용하기

JHO·2023년 8월 16일
1

유니티 3D

목록 보기
1/14
post-thumbnail

1. 준비 단계


1-1. 믹사모 사이트 접속.

1-2. obj 또는 fbx파일 준비.

  • 본인이 애니메이션을 적용하고 싶은 캐릭터 obj이나 fbx파일을 올림.
  • 올리고 나서, 사이트가 하라는대로 따라서 자동 리깅을 위한 턱, 손목, 팔꿈치, 무릎, 사타구니위치를 마우스로 클릭.

2. 애니메이션 가져오기.


2-1. 애니메이션 다운.

  • 먼저, T-Pos Avatar을 먼저 따오자.
    -> T-Pos가 관절구조상 다른 애니메이션이 잘 적용되기 때문에, Avatar를 T- Pos로 꼭 사용하자
    -> 아래에 Idle을 Avatar로 사용했으나, T-Pos로 하자.
  • 저자는 가만히 있을때의 애니메이션과 Jump하는 애니메이션을 가져옴.
    (Idle 애니메이션)
    (Jump 애니메이션)
  • Idle의 경우는 With Skin으로 하여 애니메이션 및 아바타도 가져오고, Jump의 경우는 Without Skin으로 하여 애니메이션만 가지고옴.(Idle파일에는 아바타와 애니메이션이 함께 있고, Jump파일에는 애니메이션만 있는 모습)

3. 유니티에서 적용하기.


3-1. 세팅 수정하기

  • 먼저, With Skin으로 아바타까지 가져온 Idle파일의 Rig에서 Animation TypeHumanoid로 바꿔주고, Avatar Definition Create From This Model로 수정.
  • 애니메이션만 가져온 Jump파일의 경우 마찬가지로 Rig에서 Animation TypeHumanoid로 바꿔주고, Avatar DefinitionCopy From Other Avatar로 바꿔주어 SourceIdle Avatar로 지정.
  • Jump의 경우 자연스로운 모습을 위해 loop timeoff(반복해서 jump하는 모습은 이상하기에)
  • Idle파일을 그대로 Hierarchy에 추가.
  • RootTransformRotation의 BackIntoPose를 true(이거는 완전 필수는..아닌듯?),
    BasedUpon을 Original로 바꿔주자.
    -> 보통의 3d모델은 골반을 기준으로 하지만, 유니티 애니메이션은 발을 기준으로 한다.
  • Body Orientation: 골반기준
  • Origininal: 발기준
  • RootTransformPosition의 y와 XZ의 경우 애니메이션 마다 자연스롭게 조정할필요ㅇ.
  • RootTransformPositionY - Bake Into Pose를 true하면, 점프하는 즉 y축이동 애니메이션도 땅바닥에서 실행된다.

3-2.애니메이터 생성.

  • 추가한 objectAnimator 추가한 뒤, 새로운 Controller을 생성하여 추가하고, Idle Avatar적용.
  • 그리고 꼭! Apply Root Motion을 false!
    -> 애니메이션 동작에 회전 및 움직임을 맡기는 기능.
  • 스페이스 바를 누를때 Jump하여 Jump애니메이션이 작동하도록, Isjump변수 생성.(Idle 에서 Jump로 갈땐 true, 반대는 false로 설정.)

3-3. 점프 스크립트

Rigidbody rigid;
    Animator anim;
    public bool isjump = false;
    public float jump_power;
    void Start()
    {
        rigid = GetComponent<Rigidbody>();
        anim = GetComponent<Animator>();
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Jump") && isjump == false)
        {
            anim.SetBool("Isjump", true);
            rigid.AddForce(Vector3.up * jump_power);
            isjump = true;
        }
    }
    void OnCollisionEnter(Collision collision)
    {
      if(collision.gameObject.tag == "floor")
        {
            isjump = false;
            anim.SetBool("Isjump", false);
        }  
    }
  • 점프 도중에 점프 방지.

4. 시연모습


(Jump 및 Idle 상태가 잘 보이는 모습.)
(점프가 좀 부자연스럽게 보이는 부분은 점프 애니메이션을 중간부분부터 짤라서 가져오거나 하면 되는데 그냥 그대로 사용을 했기때문. -> 이부분은 믹사모의 다른 애니메이션 많으니 적절한 애니메이션을 가져오거나 짤라서 사용하면 문제x)


profile
개발노트

0개의 댓글