본문 바로가기

Unity/Portfolio Daily Log

캐주얼 슈팅 액션 대전 게임 (모바일) - 1 이동로직 및 이동 애니메이션

1. 캐릭터 에셋과 Joystick Pack 에셋을 임포트 해준다.

2. 왼쪽의 조이스틱은 프리팹에 있던 Variable Joystick을 그대로 사용했고, 이것은 움직임을 담당할 것이다.

 

3. 오른쪽의 조이스틱은 Joystick을 상속받는 AttackJoystick을 만들었다. 오른쪽 조이스틱의 방향대로 총알을 날릴 예정이다.

 

에셋에 애니메이션도 다 들어 있고 체력바랑 캐릭터 이름 UI도 있다. 와우...

 

4. 간단하게 체력바랑 캐릭터 이름 UI를 이걸 빌보드 시켜주자

 

UI 빌보드

public class BillBoard : MonoBehaviour
    {
        private Transform target;

        void Start()
        {
            target = Camera.main.transform;
        }

        void Update()
        {
            transform.forward = -target.forward;
        }
    }

Movement 애니메이션과 이동로직

 

1. Blend Tree를 생성하고 float 파라미터 두개를 생성해 각각 horizontal, vertical로 명명한다.

2. Blend Type 을 2D Simple Directional로 설정해주고 파라미터를 horizontal과 vertical로 설정한다.

3. +버튼을 눌러 Motion Field를 5개 추가해주고 Idle (0,0 ), 상(0,1), 하(0,-1), 좌(-1,0), 우(0,1)를 세팅해준다. 

Input 클래스 PlayerInput

public interface IPlayerInput
{
    public Vector3 GetMoveDirection();
}

public class PlayerInput : MonoBehaviour, IPlayerInput
{
	private VariableJoystick moveJoyStick;
    	void Start()
    	{
        	moveJoyStick = GetComponentInChildren<VariableJoystick>();
    	}
    
	public Vector3 GetMoveDirection() => new Vector3(moveJoyStick.Horizontal + Input.GetAxis("Horizontal"), 0, moveJoyStick.Vertical + Input.GetAxis("Vertical"));
}

1. 인터페이스 IPlayerInput을 상속받는 PlayerInput 스크립트를 만들었다.

2. 인터페이스에 정의한 GetMoveDirection을 PlayerInput 클래스에 구현을 한다.

 

3. 왼쪽 조이스틱의 값을 받기 위해 VariableJoystick을 moveJoyStick으로가져오고,  moveJoyStick의 Horizontal 값을 x에 vertical 값을 z에 넣고 반환 했다.

+ Input.GetAxis("Horizontal)과 ("Vertical")은 컴퓨터 환경에서 편하게 키보드로도 움직일 수 있게끔 하려고 넣어뒀다.

 

Animation 클래스 AnimationController

public class AnimationController : MonoBehaviour
{
    Animator ani;
    private void Start()
    {
        ani = GetComponent<Animator>();
        stateInfo = ani.GetCurrentAnimatorStateInfo(0);
    }
    
    public void OnMovement(float horizontal, float vertical)
    {
        ani.SetFloat("horizontal", horizontal);
        ani.SetFloat("vertical", vertical);
    }
}

1. 애니메이션 블랜드로 만든 Movement 애니메이션을 재생할 수 있게 SetFloat의 값을 넣어주는 함수를 AnimationController클래스에 만든다.

 

Player 클래스 PlayerMediator

public class PlayerMediator : MonoBehaviour
{
    private CharacterController charCtrl;
    private AnimationController aniCtrl;
    private PlayerInput input;
    
    private Vector3 lookDir;
    private Vector3 attackDir;
    private Vector3 dodgeDir;
    
    public float speed;
    
    void Start()
    {
        charCtrl = GetComponent<CharacterController>();
        input = GetComponent<PlayerInput>();
        aniCtrl = GetComponent<AnimationController>();
    }
    void FixedUpdate()
    {
        Move();
    }
    
    private void Move()
    {
        LookAt();
        charCtrl.Move(lookDir * speed * Time.deltaTime);
    }
    private void LookAt()
    {
        lookDir = input.GetMoveDirection();
        lookDir.Normalize();
        aniCtrl.OnMovement(lookDir.x, lookDir.z);
        
        Quaternion dirQuat = Quaternion.LookRotation(lookDir);
        transform.rotation = Quaternion.Slerp(transform.rotation, dirQuat, 0.3f);
    }
}

1. 우선 캐릭터의 이동은 CharacterController를 사용하기 위해 캐릭터에 CharacterController 컴포넌트를 붙였다.

 

2. LookAt() 함수에서 lookDir은 PlayerInput 클래스에서 정의했던 GetMoveDirection의 vector3값을 가지고 오고 대각선 방향으로 갈 때 값이 커지는 것을 막기 위해 Normalize를 한다.

 

3. AnimationController의 OnMovement 함수에 lookDir.x와 lookDir.z를 넣어 애니메이터에게 SetFloat값을 전달해준다.

 

4. 회전은 Quaternion.LookRotation으로 바라보고 있는 방향의 값을 두고, transform.rotation을 Quaternion.Slerp으로 부드럽게 움직이게끔 했다.