오늘 한일
오늘은 Unity로 3D게임을 만들어 보았습니다.
게임은 Survival 게임으로 만들어 보았습니다.
초기 기획 및 와이어 프레임
저는 Player를 담당했기 때문에 필수구현기능을 핑크색.
추가기능을 노란색으로 표시한 뒤 작업에 착수했습니다.
구현 내용
구현 방식
코드를 작성하기전 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에서 버그가 터지면서 움직임밖에 재현을 못했습니다. ㅠ 다음에 더 많은 내용 가지고 오겠습니다.