코딩의 신 31

김동관·2025년 11월 14일

오늘 한일

오늘은 Unity로 3D게임을 만들어 보았습니다.
게임은 Survival 게임으로 만들어 보았습니다.

초기 기획 및 와이어 프레임

저는 Player를 담당했기 때문에 필수구현기능을 핑크색.
추가기능을 노란색으로 표시한 뒤 작업에 착수했습니다.

구현 내용

  1. 플레이어 에셋 추가
  2. 1인칭 시점 추가
  3. Input System 및 점프기능 추가

구현 방식

코드를 작성하기전 PackageManager에서 InputSystem을 다운받아 줍니다.
움직임을 담당하는 PlayerMovement스크립트 작성.

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

public class PlayerMovement : MonoBehaviour
{
    //캐릭터가 움직이기 위한 물리 컴포넌트 = 리지드바디
    [SerializeField]
    private Rigidbody rb;
    //이동값을 저장하기 위한 2차원 벡터
    private Vector2 moveInput;
    //이동할 속도
    public float moveSpeed = 5.0f;
    //점프할 파워
    public float jumpForce = 5.0f;
    void Start()
    {

    }


    void Update()
    {
        HandleLook();
    }

    private void FixedUpdate()
    {
        HandleMove();
    }

    public void Move()
    {
        Vector3 move = new Vector3(moveInput.x, 0, moveInput.y);

        rb.MovePosition(this.transform.position + move * moveSpeed * Time.fixedDeltaTime);
    }

    //input system에서 호출하는 함수
    public void OnMove(InputAction.CallbackContext context)
    {
        if (context.performed)
        {
            //입력값을 moveInput에 저장
            moveInput = context.ReadValue<Vector2>();
        }
        else
        {
            //입력이 멈추면 0으로 초기화
            moveInput = Vector2.zero;
        }
    }



    public void OnJump(InputAction.CallbackContext context)
    {
        if (context.performed)
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
        else
        {

        }
    }

    private Vector2 lookInput;

    public void OnLook(InputAction.CallbackContext context)
    {
        lookInput = context.ReadValue<Vector2>();
    }

    public Transform cameraBox;
    private float lookUpDownNum = 0;
    [SerializeField]
    private float mouseSensitivity = 2f;

    private void HandleLook()
    {
        Vector2 mouseDelta = lookInput * mouseSensitivity;

        lookUpDownNum -= mouseDelta.y;
        lookUpDownNum = Mathf.Clamp(lookUpDownNum, -90, 90);

        cameraBox.localRotation = Quaternion.Euler(lookUpDownNum, 0f, 0f);

        transform.Rotate(Vector3.up * mouseDelta.x);
    }

    [SerializeField]
    private Transform camTr;

    private void HandleMove()
    {
        Vector3 camForward = camTr.forward;
        Vector3 camRight = camTr.right;

        camForward.y = 0;
        camRight.y = 0;

        camForward.Normalize();
        camRight.Normalize();

        Vector3 move = camRight * moveInput.x + camForward * moveInput.y;

        Vector3 handleVelocity = new Vector3(move.x * moveSpeed, rb.velocity.y, move.z * moveSpeed);

        rb.velocity = handleVelocity;
    }
}
*public으로 하지 말고 [Serializefireld]에 private를 추가해서 보호를 하며
수치를 바깥에서 변경하게 해주었습니다*
*HandleMove()는 물리연산이기 때문에 Update()가 아닌 Fixed Update()에서 해주었습니다*

사실 Unity에서 버그가 터지면서 움직임밖에 재현을 못했습니다. ㅠ 다음에 더 많은 내용 가지고 오겠습니다.

profile
아이디어 뱅크

0개의 댓글