본문 바로가기

Unity (유니티)/Unity 3D

Humanoid를 이용한 조준모드(aimMode) - 유니티3D

Humanoid를 이용한 상체 조준 모드

보통적으로 FPS 또는 TPS를 하면 플레이어는 조준을 할경우 상체만 움직이게 되는것을 많이 보게된다.
이러한 기능은 유니티 휴머노이드의 기능을 통해 구현이 가능하다.
*본인은 상체만 사용하는 법을 알려주기 위해 작성했기 떄문에 기본적인 조준모드 스크립트에 대해선 자세히 적지 않았다.

1. 아바타 마스크(avatar mask)를 통해 상체 하체 나눠주기

일단 프로젝트창 위에서 create로 avatar mask 2개를 생성한다

애니메이션 실행에 있어 하나는 하체 하나는 상체로 사용할 것이다.




생성한 상체용 하체용 아바타마스크 휴머노이드에 들어가 각 아바타마스크를 켜주자

이렇게 마스크를 지정해주면 상체는 조준 애니메이션을 하체는 이동 애니메이션을 섞어 사용 할 수가 있다. 


2. 애니메이션의 지정



weight는 애니메이션의 점유율을 나타낸다 높을수록 우선순위가 높게 애니메이션이 실행된다고 보면된다.
본인은 우클릭을 줌을 눌렀을떄 mask를 이용해 상체는 pistol 애니메이션을 하체는 strafing 애니메이션을 실행 할 수 있도록 지정을 해주었다. 
(IK는 사용하지 않았음으로 꺼도 무방함)

3. 중간 테스트

애니메이션이 분리되서 실행되는지 확인하기




확인결과 상체와 하체의 애니메이션이 구분 되는 것을 확인했다 하지만 에임에 따라 상체가 위 아래로 따라 가지 않는다.
이제 스크립트를 추가하여 원하는 결과를 만들어 보자.

4. 바라볼 빈 오브젝트 생성

이 빈오브젝트는 플레이어가 바라볼 목표이자 조준점이다.

카메라의 자식으로 이 빈오브젝트를 넣어주면 카메라가 보는 방향을 바꿔도 계속 가운대에 위치하게 된다.


5. 조준 스크립트 만들기


//소스코드
using System.Collections;
using UnityEngine;

public class AimScript : MonoBehaviour {

    public Transform target; // 바라볼 타겟
    public Vector3 relativeVec; //물체에 대한 상대적인 백터

    private Animator anim; // 애니메이션
    private Transform spine; // 아바타의 상체
    bool aimMode = false;
	// Use this for initialization
	void Start () {
        anim = GetComponent();
        spine = anim.GetBoneTransform(HumanBodyBones.Spine); // 상체값 가져오기 (허리 위)
	}
    void LateUpdate()
    {
       if(Input.GetMouseButtonDown(1)) // 좌클릭 눌리는 동안
       { 
            Debug.Log("바라보기");
            StartCoroutine(aimModeOn());
        }
       else if(Input.GetMouseButtonUp(1)) // 좌클릭을 떄면
       {
            Debug.Log("해제");
           StartCoroutine(aimModeOff());
       }
       if(aimMode == true) //에임모드가 활성화 되면
        {
            spine.LookAt(target.position); //플레이어의 상체부분이 타겟 위치 보기           
            spine.rotation = spine.rotation * Quaternion.Euler(relativeVec); // 타겟으로 회전
        }
    }
  
    IEnumerator aimModeOn() // 에임모드가 켜지면 지정대기시간 이후 aimMode = true
    {
        Debug.Log("조준");
        yield return new WaitForSeconds(0.07f);
        aimMode = true;
    }

    IEnumerator aimModeOff() //에임모드가 꺼지면 지정대기시간이후 aimMode = false
    {
        yield return new WaitForSeconds(1.0f);
        aimMode = false;
    }
}

대부분은 주석으로 써놧지만 자세히 설명할 부분은 상체를 받아오는 부분이다.

spine = anim.GetBoneTrasnsform(HumanBodyBones.Spine) 는 플레이어의 상체를 가져오는 휴머노이드 전용 함수 입니다.

이렇게 되면 상체 부분만 따로 lookat을 지정한 전 단계에서 지정한 오브젝트를 타겟 부분에 넣게 상체만 그 타겟을 바라보게 된다. 회전 부분도 상체만 지정햇기떄문에 상체만 회전하게 된다.


6. 최종 결과물


이제 에임에 따라 상체가 위아래로 움직이는걸 볼 수 있다.

이 스크립트에서 배운 것을 통해 하체 또는 상체 부분만 가져와 원하는 대로 움직이게 응용 할 수도 있을 것이다.