본문 바로가기

Unity/제로부터 구현

3D 플레이어 이동 구현(마우스로 방향전환, 키보드로 방향전환)

728x90

오늘의 구현

캐릭터의 forward는 그대로 두고 캐릭터만 회전시켜 방향 전환 시켜주기.

1. 마우스 포인터로 캐릭터의 방향을 정해주기

2. 단순 키보드로 캐릭터의 방향을 지정.

 

1. 마우스 포인터로 캐릭터의 방향을 정해주기

  • 마우스 포인터로 캐릭터의 방향을 정해줄 것이기 때문에 마우스 포인터의 위치값을 가져옵니다. 마우스의 포지션은 기본으로 스크린 좌표를 가져오며 마우스 포지션의 z값은 무시 되기 때문에 마우스의 z좌표를 설정해 줘야 합니다. 마우스의 z좌표는 메인카메라의 y - 플레이어의 y 값 입니다.(스크린의 z 축은 화면을 바라보는 사용자와의 거리를 나타냅니다.)
  • 마우스 좌표를 수정해주고 월드 좌표로 변환해줍니다.
  • 월드 좌표로 변환해준 마우스 포지션과 플레이어의 포지션을 빼주고 normalized해주면 마우스 포지션의 방향을 알 수 있습니다.
  • 캐릭터가 위를 보면 안되기때문에 y값을 0으로 만들어줍니다
  • Quaternion.LookRotation() 으로 마우스 포지션까지의 방향으로 얼마 만큼 rotation을 줘야하는지 확인합니다.
  • 플레이어의 rotation을 lerp함수를 이용해 해당 방향으로 서서히 회전시켜줍니다.
  • isMovingBackwards 는 플레이어가 바라보는 방향과 진행 방향이 다를경우를 확인하기 위한 변수 입니다. 이를 통해 캐릭터를 뒷걸음질 치게 만들 수 있습니다.
    • Vector3.Dot(vector1 , vector2) 은 벡터 사이의 내적을 계산하는 함수입니다.
      • dot > 0: 두 벡터가 같은 방향을 가지고 있음을 나타냅니다. (둘 다 양수이거나 둘 다 음수)
      • dot < 0: 두 벡터가 반대 방향을 가지고 있음을 나타냅니다. (하나는 양수이고 다른 하나는 음수)
      • dot = 0: 두 벡터가 수직이거나 한 벡터가 영벡터인 경우를 나타냅니다.
    public void PlayerMove_MouseMain()
    {
        Vector3 playerVector = Vector3.zero;
        playerVector = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));

        Vector3 mousePot = Input.mousePosition;
        mousePot.z = Camera.main.transform.position.y - transform.position.y;
        mousePot = Camera.main.ScreenToWorldPoint(mousePot);
        Vector3 mouseDir = (mousePot - transform.position).normalized;
        mouseDir.y = 0;
        Quaternion mouseQuaternion = Quaternion.LookRotation(mouseDir);
        transform.rotation = Quaternion.Lerp(transform.rotation,mouseQuaternion,rotationRate*Time.deltaTime);

        isMovingBackwards = Vector3.Dot(playerVector.normalized, mouseDir.normalized) < 0;

        Debug.Log(isMovingBackwards);

        if (playerVector != Vector3.zero)
        {
            SetAnimationWalk(true);
            
            player.transform.position += playerVector.normalized * player.playerMoveSpeed * Time.deltaTime;
        }
        else
        {
            SetAnimationWalk(false);
        }

    }

 

2. 단순 키보드로 캐릭터의 방향을 지정.

  • 키보드로 입력한 값이 캐릭터의 방향을 결정해 줌으로 키입력으로 받은 값을 normalized 해 방향을 찾아주고, Quaternion.LookRotation()으로 얼마나 회전해야 하는지 구해줍니다.
  • Quaternion.Lerp()로 캐릭터를 회전시켜줍니다.
    public void PlayerMove_KeyboardMain()
    {
        Vector3 playerVector = Vector3.zero;
        playerVector = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));

        if (playerVector != Vector3.zero)
        {
            SetAnimationWalk(true);

            playerDir = playerVector.normalized;
            Quaternion playerQuaternion = Quaternion.LookRotation(playerDir);
            //playerMovement
            player.transform.position += playerVector.normalized * player.playerMoveSpeed * Time.deltaTime;
            //player rotation
            transform.rotation = Quaternion.Lerp(transform.rotation, playerQuaternion, rotationRate * Time.deltaTime);
        }
        else
        {
            SetAnimationWalk(false);
        }
    }

 

728x90