using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float turnSpeed; //마우스 회전 속도
public float xRotate; //내부 사용할 x축 회전량은 별도 정의(카메라 상/하)
public float speed;
public float jumpSpeed;
public float gravity;
private Vector3 moveForce;
CharacterController controller;
Vector3 moveDir;
private void Awake()
{
//마우스 커서 보이지 않게 설정하고, 현재 위치에 고정시킨다.
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Locked;
controller = GetComponent<CharacterController>();
speed = 40f;
jumpSpeed = 30f;
gravity = 40;
turnSpeed = 2;
xRotate = 0f;
}
void Update()
{
MouseRotation();
KeyboardMove();
}
private void MouseRotation()
{
float yRotateSize = Input.GetAxis("Mouse X") * turnSpeed;
// 좌우로 움직인 마우스의 이동량 * 속도에 따라 카메라가 좌우로 회전할 양 계산
float yRotate = transform.eulerAngles.y + yRotateSize;
// 현재 y축 회전값에 더한 새로운 회전각도 계산
float xRotateSize = -Input.GetAxis("Mouse Y") * turnSpeed;
// 위아래로 움직인 마우스의 이동량 * 속도에 따라 카메라가 회전할 양 계산(하늘, 바닥을 바라보는 동작)
xRotate = Mathf.Clamp(xRotate + xRotateSize, -45, 80);
// 위아래 회전량을 더해주지만 -45도 ~ 80도로 제한 (-45:하늘방향, 80:바닥방향)
// 회전 각을 제한 (화면 밖으로 마우스가 나갔을때 x축 회전 덤블링 하듯 계속 도는 것을 방지)
// Clamp 는 값의 범위를 제한하는 함수
transform.eulerAngles = new Vector3(xRotate, yRotate, 0);
// 카메라 회전량을 카메라에 반영(X, Y축만 회전)
}
private void KeyboardMove()
{
float x = Input.GetAxisRaw("Horizontal");
float z = Input.GetAxisRaw("Vertical");
Vector3 direction = transform.rotation * new Vector3(x, 0, z);
//이동 방향 = 캐릭터의 회전 값 * 방향 값
//카메라 회전으로 전방 방향이 변해야 하기 때문에 회전 값을 곱한다.
moveForce = new Vector3(direction.x * speed, moveDir.y, direction.z * speed);
//이동 힘 = 이동방향 * 속도
controller.Move(moveForce * Time.deltaTime);
//1초당 moveForce 속력으로 이동
//y값 설정 : 중력, 점프
if (controller.isGrounded)
{
if (Input.GetButton("Jump"))
moveDir.y = jumpSpeed;
}
moveDir.y -= gravity * Time.deltaTime;
// 중력의 영향을 받아 아래쪽으로 하강
}
}
플젝 1일차
1인칭 시점 이동 구현 내용
-커서 숨기기 및 중앙에 고정
-마우스로 시점 조정
-W/A/S/D 키로 이동하되, 점프 및 중력 구현하기
이때,
플레이어에 카메라와 캐릭터 컨트롤러를 꼭! 추가해줘야한다.
캐릭터 컨트롤러에 기본적으로 Collider가 있어 따로 콜라이더가 필요하지 않다.
중력도 내장돼있음.
캐릭터 컨트롤러(CharacterController)
리지드바디(rigidbody)를 다루지 않고, 충돌에 의한 움직임을 다루기 쉽도록 해줍니다.
캐릭터 컨트롤러는 힘(관성, 중력 등)에 의해 영향을 받지 않고, Move함수가 호출되었을 때만 움직이게 됩니다.
충돌에 의해 힘이 가해졌을 때에만 움직임을 수행합니다.
어렵따ㅠㅠ
'Unity 포트폴리오 > 플젝2. 3D FPS게임' 카테고리의 다른 글
Unity FPS : enum Type으로 게임 모드 구분해주기 (0) | 2022.06.21 |
---|---|
Unity FPS : 총 스크립트 (0) | 2022.06.21 |
Unity FPS : PowerShot 및 Charging 애니메이션 구현 (0) | 2022.06.21 |
Unity 오브젝트 상하 반복운동 Mathf.Sin (0) | 2022.06.19 |
UnityEngine:Cursor (0) | 2022.05.23 |