본문 바로가기

Unity

[Unity] 카메라가 바라보는 기준으로 캐릭터 이동 (1인칭)

 해당 포스팅은 크레이 님의 itadventure.tistory.com/390 포스팅을 참고하여 작성하였습니다. 1인칭 이동에 대한 자세한 설명이 필요하신 분은 이 포스트를 먼저 읽는 것을 추천드립니다.

 

유니티3D(Unity3D) 1인칭 시점 조작 #2

이번 시간에는 지난 시간에 이어 1인칭 시점 조작의 이동편에 대해 다루어 보겠습니다. 3D 가상공간에서 1인칭 시점으로 거리를 걷는 것은 현실과 아주 유사합니다. 만일 내가 바라보는 방향이

itadventure.tistory.com

 

 기본적인 틀은 크레이님의 마지막 코드와 같으나, 중력과 충돌 구현 부분을 추가한 코드입니다. 스크립트의 이름은

Mouse_Camera_Action입니다.

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

public class Mouse_Camera_Action : MonoBehaviour
{
    // 마우스 회전
    public float turnSpeed = 4.0f; // 마우스 회전 속도    
    private float xRotate = 0.0f; // 내부 사용할 X축 회전량은 별도 정의 ( 카메라 위 아래 방향 )
    public float moveSpeed = 4.0f; // 이동 속도
    public float jumpForce = 10.0f; // 점프하는 힘
    private bool isGround = true; // 땅에 붙어있는가?
    Rigidbody body; // Rigidbody를 가져올 변수


    // Start is called before the first frame update
    void Start()
    {
        body = GetComponent<Rigidbody>();           // Rigidbody를 가져온다.
        transform.rotation = Quaternion.identity;   // 회전 상태를 정면으로 초기화
    }

    void FixedUpdate()
    {
        Move();
        Jump();
    }

    void Move()
    {
        // 좌우로 움직인 마우스의 이동량 * 속도에 따라 카메라가 좌우로 회전할 양 계산
        float yRotateSize = Input.GetAxis("Mouse X") * turnSpeed;
        // 현재 y축 회전값에 더한 새로운 회전각도 계산
        float yRotate = transform.eulerAngles.y + yRotateSize;

        // 위아래로 움직인 마우스의 이동량 * 속도에 따라 카메라가 회전할 양 계산(하늘, 바닥을 바라보는 동작)
        float xRotateSize = -Input.GetAxis("Mouse Y") * turnSpeed;
        // 위아래 회전량을 더해주지만 -45도 ~ 80도로 제한 (-45:하늘방향, 80:바닥방향)
        // Clamp 는 값의 범위를 제한하는 함수
        xRotate = Mathf.Clamp(xRotate + xRotateSize, -45, 80);

        // 카메라 회전량을 카메라에 반영(X, Y축만 회전)
        transform.eulerAngles = new Vector3(xRotate, yRotate, 0);

        //  키보드에 따른 이동량 측정
        Vector3 move =
            transform.forward * Input.GetAxis("Vertical") +
            transform.right * Input.GetAxis("Horizontal");

        // 이동량을 좌표에 반영
        transform.position += move * moveSpeed * Time.deltaTime;
    }

    void Jump()
    {
        if (Input.GetKey(KeyCode.Space) && isGround)
        {
            body.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);

            isGround = false;
        }
    }

    // 충돌 함수
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGround = true;
        }
    }
}

 

 점프와 관련된 코드 부분은 mayquartet.tistory.com/45 와 동일합니다.

 

[Unity] 캐릭터 점프

이번에는 캐릭터의 점프를 구현해보겠습니다. 먼저 초기 코드입니다. using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { public float Spe..

mayquartet.tistory.com

 

 해당 스크립트를 작성하셨다면 이제 유니티로 가서 나머지 설정을 추가해줍시다. 이 스크립트는 1인칭 시점을 기준으로 만들었기 때문에 플레이어 캐릭터가 별도로 필요하지 않게 만들었습니다. 그러므로 이전에 만들어둔 Player는 잠시 꺼주도록 합시다.

체크를 해제하면 씬에서 사용되지 않습니다. 

 

 플레이어를 끄고 난 후 방금 만든 스크립트를 Main Camera에 넣어줍니다. 만약 Player의 자식으로 카메라가 등록되어 있다면 바깥으로 빼준 후 진행하시면 됩니다.

 

 

 스크립트가 등록되었다면, 중력을 부여하고 점프를 구현할 수 있도록 (1)Rigidbody(2)Collider를 추가해주도록 합시다. 저는 Capsule Collider를 추가하였습니다. 그리고, Collider에 지난번에 만든 (3)ZeroFriction을 넣어 벽에 달라붙지 않도록 처리해줍니다.

 

 Capsule Collider의 Center 값과 Height 값은 제가 맵에 맞게 임의로 조정한 것입니다. Collider의 위치를 Player라고 생각하고 조정해주시면 되겠습니다. 또, Rigidbody의 FreezeRotation을 모두 체크해주셔야 Collider가 팽이처럼 도는 현상을 방지할 수 있습니다.

 

 

 이대로 실행하면 카메라가 바라보는 방향을 기준으로 움직이는 1인칭 플레이어를 확인할 수 있습니다.