땅에 붙어있어도 gravity값이 계속해서 yVelocity에 더해지기 때문에 아래로 이동할 때 순간이동 하듯이 빠르게 움직이는 걸 볼 수 있다.
따라서 땅에 있을 때는 yVelocity를 초기화 해줘야 한다. 이때 Character Controller에는 땅에 닿아 있는지 확인 할 수 있는 기능이 있는데 CharacterController.isGrounded 이다. 그래서 조건에 isGrounded가 true라면 yVelocity를 0으로 초기화해줬다.
추가적으로 2단 점프를 구현하고 싶었기에 점프를 할 때마다 jumpCount 의 값을 1씩 올리고 maxJumpCount 에 2의 값을 넣어 jumpCount가 MaxJumpCount 보다 작을 때만 점프를 할 수 있게 했다. 마찬가지로 땅에 닿았을 때 jumpCount의 값을 초기화 해줬다.
public class Player : MonoBehaviour
{
CharacterController cc;
public float speed = 5;
public float jumpPower = 10;
public float gravity = -9.81f;
float yVelocity;
int jumpcount;
int maxJumpCount = 2;
private void Start()
{
cc = GetComponent<CharacterController>();
}
void Update()
{
// 만약 공중이라면
if (cc.isGrounded)
{
// 땅에 서 있다면 점프 횟수를 0으로 초기화
jumpcount = 0;
yVelocity = 0;
}
else
{
// 공중이라면
// 속도는 중력을 받아야함
yVelocity += gravity * Time.deltaTime;
}
// 만약 점프키를 누르면 y속도를 jumpPower로 함
if (jumpcount < maxJumpCount && Input.GetButtonDown("Jump"))
{
yVelocity += jumpPower;
jumpcount++;
}
// 사용자의 입력에 따라
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
// 앞뒤좌우 방향을 만들고
Vector3 dir = new Vector3(h, 0, v);
// 방향(dir)을 카메라를 기준으로 변경
dir = Camera.main.transform.TransformDirection(dir);
dir.y = 0;
dir.Normalize();
Vector3 velocity = dir * speed;
// 이동방향의 y속성에 y속도를 대입
velocity.y = yVelocity;
// 그 방향으로 이동
cc.Move(velocity * Time.deltaTime);
}
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
Vector3 from = transform.position;
Vector3 to = transform.position + Vector3.up * yVelocity;
Gizmos.DrawLine(from, to);
}
}
'Unity > Small Project 따라하기' 카테고리의 다른 글
5-2. Enemy Path Finding_2 NavMesh Agent를 이용해서 target 따라다니기 (0) | 2022.03.27 |
---|---|
5-1. Enemy Path Finding_1 길 만들기 (0) | 2022.03.27 |
4. 총알 발사 (0) | 2022.03.26 |
2. Player Jump (0) | 2022.03.26 |
1. Player 이동 및 카메라 회전 (0) | 2022.03.26 |