[Cyphers] Player 이동구현(New Input System) + 카메라 컨트롤
2023. 9. 25.

New Input System 사용

패키지 매니저에서 input system 설치 후 재시작/ 확인

-Player Settings> Other Settings 에서 설치가 잘되었는지 확인한다.

 

플레이어의 Action을 만들어준다.

-Assets>Create>Input Actions로 새로운 Action을 생성. Move의 Action Type은 Value, Control Type은 Vector2로 해준다.

액션 생성 / 바인딩 추가

-플레이어의 이동은 WASD로 가능하다. 바인딩을 추가해주었다.

-Player 오브젝트에 PlayerInput 컴포넌트를 추가하고 Actions에 액션을 넣어준다.

Player Input 컴포넌트 추가

-Behavior 속성은 Inovke Unity Events로 해주었다. 액션 별로 이벤트 연결 인터페이스가 생성된다.

-ClareController.cs를 작성해 public으로 OnMove 메서드를 작성하고, 이벤트를 추가했다. 이벤트를 추가하지 않으면 함수를 작성하더라도 호출되지 않으므로 주의하자.

PlayerInput에 이벤트 추가
ClareController의 OnMove 메서드

-다만 사이퍼즈 캐릭터의 이동은 일반적인 캐릭터의 이동과는 조금 다르다.

-보통은 이동할 방향으로 몸을 돌리고 앞으로 이동하게했다면 사이퍼즈의 경우에는 앞으로 이동할때는 동일하지만 뒤로 이동할때에도 캐릭터는 앞을 바라본다.(앞을 보고 뒷걸음질 치는 느낌이다.)

-그러나 진행방향에 따라 애니메이션은 달라진다.(다리의 움직이는 방향이 달라진다.)

-플레이어가 뒤로 이동할때는 앞을 쳐다본채로 이동하게 하기 위해 Vector3.forward로 회전하게 했다. forward일때와 backward일 때를 잘 비교해야한다.

-그냥 좌, 우로 이동할때(전, 후의 움직임 없을 때)의 애니메이션도 달라 추가해주었다. 나중에 다른 애니메이션 괜찮은 걸 구한다면 바꿀 필요가 있을 것 같다. 

-카메라를 클레어의 자식으로 넣고 움직이는 것을 확인해보았다.

이동 결과

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

public class ClareController : MonoBehaviour
{
    private Vector3 moveDir;
    private Animator anim;
    // Start is called before the first frame update
    void Start()
    {
        this.anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if(moveDir != Vector3.zero)
        {
            if(this.moveDir.z > 0)//forward
            {
                //this.transform.rotation = Quaternion.LookRotation(moveDir); ;//진행방향으로 회전
                this.transform.Translate(Vector3.forward * 4.0f * Time.deltaTime);//이동
                if(this.moveDir.x == 0)//forward
                {
                    this.anim.SetInteger("State", 1);//move forward
                }
                else if (this.moveDir.x > 0)
                {
                    this.anim.SetInteger("State", 2);//move forward rightCross
                }
                else if (this.moveDir.x < 0)
                {
                    this.anim.SetInteger("State", 4);//move forward leftCross
                }
            }
            else if(this.moveDir.z < 0)//backward
            {
                this.transform.Translate(this.moveDir * 4.0f * Time.deltaTime);//이동
                if (this.moveDir.x == 0)//backward
                {
                    this.anim.SetInteger("State", 3);//move backward
                }
                else if (this.moveDir.x > 0)
                {
                    this.anim.SetInteger("State", 7);//move backward rightCross
                }
                else if (this.moveDir.x < 0)
                {
                    this.anim.SetInteger("State", 8);//move backward leftCross
                }
            }
            else
            {//stay but press left or right
                this.transform.Translate(this.moveDir * 4.0f * Time.deltaTime);//이동
                if (this.moveDir.x < 0)
                {
                    this.anim.SetInteger("State", 5);//move left
                }
                else
                {
                    this.anim.SetInteger("State", 6);//move right
                }
            }
        }
        else
        {
            this.anim.SetInteger("State", 0); //idle
        }
    }

    public void OnMove(InputAction.CallbackContext ctx)
    {
        Vector2 dir = ctx.ReadValue<Vector2>();
        this.moveDir = new Vector3(dir.x, 0,dir.y);//2차원 좌표를 3차원 좌표로 변환
    }
}
myoskin