새소식

🎮 Game Dev (게임개발)/PC (데스크탑, 노트북, 터치패널)

[3D 액션게임] 20. TPS 시점으로 바꾸기

  • -

🔔 유튜브 크리에이터 골든메탈님의 유니티강의 3D 쿼터뷰 액션게임 [BE5] 를 보고 공부하여 작성한 게시글입니다! 🔔

 

🧷 1. 카메라 오브젝트 설정

- 카메라 시점

  • Camera Arm 이란 빈 오브젝트를 플레이어의 목 정도 위치를 잡아주었습니다.
  • 이후, 이미 만들어 둔 Game Camera를 위와 같은 위치로 플레이어의 시점을 잡아주었습니다.
  • 그 다음 Player 자식 오브젝트에 빈 오브젝트로 Follow Cam 오브젝트를 두어서, 플레이어를 따라다닐 수 있게 하였습니다.

 

- 카메라 스크립트

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

public class CameraMove : MonoBehaviour
{

    [SerializeField]
    private Transform cameraArm;

    [SerializeField]
    private Transform target;

    public float followSpeed;
    public float Sensitivity;

    void Update()
    {
        LookAround();
        followCam();
    }

    private void LookAround()
    {
        Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")) * Sensitivity;
        Vector3 camAngle = cameraArm.rotation.eulerAngles;
        float x = camAngle.x - mouseDelta.y;
        
        if(x < 180f)
        {
            x = Mathf.Clamp(x, -1f, 70f);
        }
        else
        {
            x = Mathf.Clamp(x, 325f, 361f);
        }

        cameraArm.rotation = Quaternion.Euler(x, camAngle.y + mouseDelta.x, camAngle.z);
    }

    private void followCam()
    {
        transform.position = Vector3.MoveTowards(transform.position, target.position, followSpeed * Time.deltaTime);
    }
  • Camera Arm 오브젝트에 스크립트를 넣어줍니다.
  • LookAround() 함수로 마우스의 위치에 따라서 cameraArm의 rotation을 바꿔주도록 합니다.
  • 변수 x로 위 아래 회전을 결정하는데, 이때도 제한을 하여 딱 원하는 위치까지만 고개를 돌릴 수 있도록 합니다.

🧷 2. 플레이어 이동 설정

- 플레이어 이동 기능

// Player Script의 수정 부분만 코드로 올렸습니다.
public class Player : MonoBehaviour
{
    public Transform cameraArm;

    void Move()
    {
        Vector2 moveInput = new Vector2(hAxis, vAxis).normalized;
        
        // 고칠점
        isMove = moveInput.magnitude != 0;

        if (isMove)
        {
            Vector3 lookForward = new Vector3(cameraArm.forward.x, 0f, cameraArm.forward.z).normalized;
            Vector3 lookRight = new Vector3(cameraArm.right.x, 0f, cameraArm.right.z).normalized;
            Vector3 moveDir = lookForward * moveInput.y + lookRight * moveInput.x;

            // x y z
            moveVec = moveDir;
            //moveVec = transform.rotation * new Vector3(hAxis, 0, vAxis).normalized;
            //transform.forward = moveDir;
            
        }

        // 회피 시 업데이트 안되게
        if (isDodge)
            moveVec = dodgeVec;

        // 스왑 및 공격 시 못움직이게
        if (isSwap || !isFireReady || isDead)
            moveVec = Vector3.zero;

        // transform + 벽뚫방지
        if (!isBorder && isMove)
            transform.position += moveVec * (rDown ? 1.3f : 1f) * speed * Time.deltaTime;

        // animator
        anim.SetBool("isWalk", isMove);
        anim.SetBool("isRun", rDown);

        // sound
        if (soundControl.walkSound.isPlaying == false && isMove && !isJump && !isDodge && !isDead)
        {
            soundControl.walkSound.volume = Random.Range(0.1f, 0.2f);
            if (rDown)
                soundControl.walkSound.pitch = Random.Range(2.6f, 2.65f);
            else
                soundControl.walkSound.pitch = Random.Range(2.1f, 2.2f);
            soundControl.walkSound.Play();
        }
    }

기존의 moveVec에 cameraArm의 transform을 받아와서, 

 

y축 이동은 vAxis(방향키 위아래) * lookForward(카메라가 앞을 보는 방향)

x축 이동은 hAxis(방향키 좌우)* lookRight(카메라의 좌우 방향) 을 하여

 

moveVec를 이동 기능을 바꿔주었습니다.

 

- 마우스 키 고정

void Esc()
{
    bool escDown = Input.GetButtonDown("Cancel");

    if (escDown && !isCancle)
    {
        CursorOn();
        isCancle = true;
    }
    else if (escDown && isCancle)
    {
        CursorOff();
        isCancle = false;
    }
}

void CursorOff()
{
    // 마우스 커서
    Cursor.visible = false;
    Cursor.lockState = CursorLockMode.Locked;
}    
void CursorOn()
{
    // 마우스 커서
    Cursor.visible = true;
    Cursor.lockState = CursorLockMode.None;
}

 

마우스 커서 고정하는 on off 기능을 만들어, 각각 필요한 상황에 넣어주었습니다.

 

예를 들면, Game Start 버튼을 누른 후, 게임 속으로 들어갈 때는 CursorOn()

상점을 이용할 때는, CursorOff()

 

esc키를 누를 때는 마우스키가 켜지거나 꺼지도록 만들어 주었습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.