유니티 개발일지

3D FPS 게임 만들기 2편

겜마고 김민재 2024. 9. 16. 14:24

오늘은 3D FPS게임 만들기 2편으로 1인칭 카메라와 플레이어가 점프 하는것을 

만들어 보겠습니다.

 

FPS게임은 2D게임과 다르게 플레이어가 보는 방향 따라 카메라가 따라와야되기 

때문에 카메라에도 코드를 추가시켜야됩니다.

 

using UnityEngine;

public class PlayerCamFirst : MonoBehaviour
{
    [SerializeField] private float _sensX;
    [SerializeField] private float _sensY;

    public Transform orientation;

    private float _xRotation;
    private float _yRotation;

    private void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }
    private void Update()
    {
        CamSetting();
    }

    private void CamSetting()
    {
        float MouseX = Input.GetAxisRaw("Mouse X") * Time.deltaTime * _sensX; 
        float MouseY = Input.GetAxisRaw("Mouse Y") * Time.deltaTime * _sensY;

        _yRotation += MouseX;
        _xRotation -= MouseY;

        _xRotation = Mathf.Clamp(_xRotation, -90f, 90f);

        transform.rotation = Quaternion.Euler(_xRotation, _yRotation, 0);
        orientation.rotation = Quaternion.Euler(0,_yRotation, 0) ;

    }
}

이렇게 x축과 y축을 Mathf.Clamp로 부드럽게 움직이게 해주시고 마우스 X축과 Y축을 senX와 senY를 각각 곱해주어 마우스 방향따라 카메라가 움직이게 만들어 주시면 됩니다. 여기서 transform은 카메라 이거 orientation은 플레이어 transform 입니다. 이렇게 카메라는 마우스 방향따라 움직이게 하고 카메라가 움직이는 것에 따라 플레이어가 움직이게 만들어주시면 됩니다.

 

이 코드를 카메라에 적용하고 카메라의 위치를 원하는곳에 두면 카메라가 마우스 움직이는 방향으로 움직이고 플레이어도 그에 따라 움직이게 됩니다. 

이렇게 기본적인 FPS의 틀은 만들었고 

 

 

이제 점프를 만들어 보겠습니다.

 

저번 처럼 inputMap에다 jump를 만들고 

 

inputReader에 jump이벤트를 추가시킵니다.

using System;
using UnityEngine;
using UnityEngine.InputSystem;
using static Controll;


[CreateAssetMenu(menuName = "SO/Player")]
public class InputReader : ScriptableObject, IPlayerActions
{
    private Controll _controlls;


    public Vector3 MoveValue;

    public Action JumpKeyEvent { get; set; }


    private void OnEnable()
    {
        if (_controlls == null)
        {
            _controlls = new Controll();
        }
        _controlls.Player.SetCallbacks(this);
        _controlls.Player.Enable();
    }
    public void OnMove(InputAction.CallbackContext context)
    {
        MoveValue = context.ReadValue<Vector3>();
    }

    public void OnJump(InputAction.CallbackContext context)
    {
        if (context.performed)
        {
            JumpKeyEvent?.Invoke();
        }
    }

 

그후 AgentMove에 점프를 할 수 있는 범위를 RayCast로 정해주고 이 Ray에 닿았을떄 점프를 할수 있겠금 스페이스바를 눌러서 점프를 할때 위쪽으로 힘을 주겠금 AddForce라는 친구를 사용하도록 하겠습니다.

 

using UnityEngine;

public class AgentMove : MonoBehaviour
{
    [field: SerializeField] public float _moveSpeed { get; private set; }
    [field: SerializeField] public float _jumpSpeed { get; private set; }

    [Header("Setting")]
    [SerializeField] private InputReader _inputReader;
    [SerializeField] private float _jumpRaySize;
    [SerializeField] private LayerMask _whatIsGround;

    public Vector3 _move;
    private Rigidbody _rigid;


    private void Awake()
    {
        _rigid = GetComponent<Rigidbody>();
        _inputReader.JumpKeyEvent += Jump;
    }

    private void OnDestroy()
    {
        _inputReader.JumpKeyEvent -= Jump;
    }

    private void Start()
    {

    }
    private void Update()
    {
        SetMove(_inputReader.MoveValue.x, _inputReader.MoveValue.z);

    }

    private void SetMove(float XMove, float ZMove)
    {
        _move.x = XMove;
        _move.z = ZMove;
    }

   

    private void Jump()
    {
        bool hit = Physics.Raycast(transform.position, Vector3.down, _jumpRaySize, _whatIsGround);

        if (hit == true)
            _rigid.AddForce(Vector3.up * _jumpSpeed, ForceMode.Impulse);
    }


    private void FixedUpdate()
    {
        _rigid.velocity = new Vector3(transform.TransformDirection(_move).x * _moveSpeed,
            _rigid.velocity.y, transform.TransformDirection(_move).z * _moveSpeed);
    }


    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawRay(transform.position, Vector3.down);
        Gizmos.color = Color.white;
    }
}

 

 

 

여기서 OnDrawGizmo라는 친구는 아까 있었던 레이를 그려주는 친구로 게임화면에는 안나오는 친구입니다.

 

이렇게 해주시고 플레이어에 넣은뒤 JumpSpeed를 원하는 만큼 주시면 플레이어가 점프하는것을 볼 수있습니다.

 

다음시간에는 플레이어가 총을 쏘는 기본적인 코드를 만들어보도록 하겠습니다.

 

'유니티 개발일지' 카테고리의 다른 글

3D FPS 게임 만들기 3편  (0) 2024.09.18
3D FPS 게임만들기 1편  (4) 2024.09.12
Unity 3D InputSystem으로 움직이기(2D랑 3D 차이점)  (0) 2024.09.11
SOLID 원칙  (0) 2024.06.30
유니티 MathF  (0) 2024.06.30