1. 점프
스페이스바를 누르면 캐릭터가 점프를 하도록 만들었습니다.
기존에는 바닥 오브젝트에 "Ground" 혹은 "Floor"이라는 태그를 달아주고,
OnCollisionStay함수를 호출하여 캐릭터가 해당 태그를 가지고 있는 태그에 닿고 있다면
점프를 가능하게 하고, 아니라면 점프를 하지못하게 설정했습니다.
이렇게하면 점프 시 캐릭터가 공중으로 띄워져 바닥에 닿지않아 공중에서 중복점프가 안되게 만들 수 있습니다.
현재있는 바닥이라곤 평평한 바닥 하나만 존재하기에 이렇게 만들어도 충분합니다.
하지만 오버워치처럼 바닥과 벽이 수많이 존재하는 커다랗고 복잡한 맵에서 점프를 했는데
약간 높이가 있는 바닥과 캐릭터의 얼굴이나 몸통이 닿아버리면 중복점프가 가능할 수도 있다는 생각을 했습니다.
그래서 찾은 해결방법이 Raycast를 캐릭터의 발끝까지만 쏴서
바닥에 닿아있는지 판별하는 방법입니다.
[UnitController.cs]
public class UnitController : MonoBehaviour
{
[SerializeField]
private Camera myCamera;
private Rigidbody rigidUnit;
// Raycast를 쏘기위한 캐릭터의 콜라이더.
private CapsuleCollider capsuleCollider;
public float walkSpeed;
// 점프 파워.
[SerializeField]
private float jumpForce;
[SerializeField]
private float mouseSensitive;
[SerializeField]
private float cameraRotLimit;
private float currCameraRotX;
// 땅에 닿고 있는지 판별.
private bool isGround;
void Update()
{
IsGround();
Jump();
Move();
UnitRotation();
CameraRotation();
}
void IsGround()
{
// Raycast의 데이터 타입은 bool.
// 앞에서부터 설명하면,
// 해당 캐릭터 오브젝트의 포지션에서
// 아래방향으로(y값 기준)
// 캐릭터의 콜라이더의 총 볼륨 중 절반. 뭐에대한? y에대한.
// +0.5f는 계단같은곳에 대한 약간의오차계산.
isGround = Physics.Raycast(transform.position, Vector3.down, capsuleCollider.bounds.extents.y + 0.5f);
}
void Jump()
{
if (Input.GetKeyDown(KeyCode.Space) && isGround == true)
{
rigidUnit.velocity = transform.up * jumpForce;
}
}
}
2. 앉기
좌측 컨트롤키를 누르면 캐릭터가 앉는 기능을 만들었습니다.
생각해야되는 부분
점프는 캐릭터를 띄우는 거라 상관이 없습니다.
하지만 앉기는 캐릭터가 앉는모션만 취하고 카메라가 내려가야되는 것입니다.
그리고 앉을 때 갑자기 카메라가 빠르게 이동하면 부자연스러우니 자연스레 이동하게 만들었습니다.
또 앉은 후 이동을 할 때는 스피드가 떨어지니 앉을 때 스피드도 따로 만들어주겠습니다.
[UnitController.cs]
public class UnitController : MonoBehaviour
{
[SerializeField]
private Camera myCamera;
private Rigidbody rigidUnit;
// Raycast를 쏘기위한 캐릭터의 콜라이더.
private CapsuleCollider capsuleCollider;
public float walkSpeed;
// 앉는 스피드.
public float crouchSpeed;
// 현재 캐릭터의 스피드.
public float currSpeed;
// 앉을 때 y값.
public float crouchPosY;
// 원래 y값.
public float originPosY;
// 현재 y값.
public float currCrouchPosY;
[SerializeField]
private float jumpForce;
[SerializeField]
private float mouseSensitive;
[SerializeField]
private float cameraRotLimit;
private float currCameraRotX;
private bool isGround;
// 앉고 있는지 판별.
private bool isCrouch;
void Start()
{
rigidUnit = GetComponent<Rigidbody>();
capsuleCollider = GetComponent<CapsuleCollider>();
// 시작할 때 현재 스피드는 walkSpeed.
currSpeed = walkSpeed;
// 시작할 때 현재 y값은 카메라의 원래 y값.
originPosY = myCamera.transform.localPosition.y;
// 시작할 때 현재 앉는 높이는 카메라의 y값.
currCrouchPosY = originPosY;
}
void Update()
{
Crouch();
IsGround();
Jump();
Move();
UnitRotation();
CameraRotation();
}
void Crouch()
{
// 좌측 컨트롤을 누르고 있을 때
if (Input.GetKey(KeyCode.LeftControl))
{
isCrouch = true;
currSpeed = crouchSpeed;
currCrouchPosY = crouchPosY;
StartCoroutine("CrouchRoutine");
}
else if (Input.GetKeyUp(KeyCode.LeftControl))
{
isCrouch = false;
currSpeed = walkSpeed;
currCrouchPosY = originPosY;
StartCoroutine("CrouchRoutine");
}
}
IEnumerator CrouchRoutine()
{
float posY = myCamera.transform.localPosition.y;
while (posY != currCrouchPosY)
{
posY = Mathf.Lerp(posY, currCrouchPosY, 0.3f);
myCamera.transform.localPosition = new Vector3(-0.015f, posY, 0.2f);
yield return null;
}
myCamera.transform.localPosition = new Vector3(-0.015f, currCrouchPosY, 0.2f);
}
void Move()
{
// 앉고 있을 때는 현재 스피드 앉기 스피드.
// 카메라 위치도 앉기 모드.
if (isCrouch == true)
Crouch();
float moveDirX = Input.GetAxisRaw("Horizontal");
float moveDirZ = Input.GetAxisRaw("Vertical");
Vector3 _moveHorizontal = transform.right * moveDirX;
Vector3 _moveVertical = transform.forward * moveDirZ;
// walkSpeed에서 currSpeed로 바꿔줘야함.
Vector3 _velocity = (_moveHorizontal + _moveVertical).normalized * currSpeed;
rigidUnit.MovePosition(transform.position + _velocity * Time.deltaTime);
}
}
'Unity > Unity FPS게임 프로젝트(오버워치라이크)' 카테고리의 다른 글
[Unity 게임프로젝트] FPS게임<오버워치>(5-2) - 캐릭터 스킬 기능 활성화(미완성) (0) | 2024.05.27 |
---|---|
[Untiy 게임프로젝트] FPS 게임<오버워치>(5) - 캐릭터 스킬 기능 (0) | 2024.05.23 |
[Unity 게임프로젝트] FPS 게임<오버워치>(4) - 적 봇 생성, 총 슈팅 기능, 재장전 모드 구현 (0) | 2024.05.22 |
[Unity 게임프로젝트] FPS 게임<오버워치>(2) - 캐릭터 이동 및 카메라 회전, 마우스 커서 고정 기능 구현 (0) | 2024.05.15 |
[Unity 게임프로젝트] FPS 게임<오버워치>(1) - 프로젝트 세팅, 캐릭터 세팅 (0) | 2024.05.14 |