void Update()
{
float h = Input.GetAxisRaw("Horizontal"); //-1,0,1 반환
float v = Input.GetAxisRaw("Vertical"); //-1,0,1 반환
//방향 벡터 구하기
Vector3 moveHorizontal = transform.right * h;
Vector3 moveVertical = transform.left * v;
//속도 벡터 구하기 (속도 벡터 = 최종 방향벡터 * 크기(속도) )
Vector3 velocity = (moveHorizontal + moveVertical).normalized * moveSpeed;
GetComponent<Rigidbody>().MovePosition(transform + velocity * Time.deltaTime);
즉각적인 움직임이 필요할 경우 Input.GetAxisRaw() 을 사용하고, 부드러운 움직임이 필요할 경우 Input.GetAxis() 사용한다.
이동을 구현할 때는 1. 사용자 입력을 통해 이동 방향을 결정한다 2. 입력값을 통해 방향벡터 생성 3. 방향벡터를 더해서 정규화 하고, 이동 속도를 곱해서 이동 벡터 구하기 4. 이동관련 함수 사용
방향 벡터들을 더해서 최종 방향 벡터(moveHorizontal + moveVertical)를 얻어낸다. 정규화(normalized)을 해서 최종 방향으로 "일정한" 속도로 이동하게 한다. 그 후 속도를 곱한다.
rigid.MovePosition("이동할 목표 위치") 위 코드에서는 현재 위치에 이동할 방향 벡터에 Time.deltaTime을 곱해 시간에 맞춘 이동량을 더한 것이다.
- 수평,수직에 대한 입력 값을 단위 벡터와 곱해서 각각 방향 벡터를 만든다. -> 방향 벡터 생성
- 각각의 방향 벡터를 더해서 최종 방향 벡터를 구한 다음, 일정한 크기(속도)로 갈 수 있도록 normalized를 한다. 그리고 크기(속도)를 곱한다. -> 속도 벡터 생성
- 속도 벡터에 최종 방향과 크기(속도)를 모두 포함 하므로, 속도 벡터를 초 단위로 계산하여 현재 위치에 더한다.
- 속도 벡터
예를 들어, 시속 60km로 동쪽으로 이동한다면 크기(60km/h)와 방향(동쪽)을 포함한 정보가 속도입니다.
- 방향 벡터
특정 방향만을 나타내는 벡터이다. 단, 정규화가 되있어야 함. (정규화란? (1,0,0) 또는 (-1,0,0) 길이가 1을 가지는 벡터임
- 거리
- 속도 벡터 * 시간으로 계산된다. 이때 거리에는 방향이 포함되지 않고, 단순한 이동 길이를 나타낸다.
점프
void Update()
{
if(Input.GetKey(KeyCode.Space) && isGround == true) //이중 점프 방지
{
Jump();
}
}
[SerializeField]
private bool isGround;
void Jump()
{
GetComponent<Rigidbody>().AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse);
GetComponent<Animator>().SetTrigger("Jump");
isGround = false;
}
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Ground")
{
isGround = true;
}
}
}
점프 액션은 입력 값이 따로 필요없다. 속도 벡터만 구하면 된다. 속도 벡터는 최종 방향벡터와 크기(속도)를 곱하면 된다. AddForce(속도벡터, ForceMode.Impulse);
transform.Translate()을 써도 되긴하나 Rigidbody를 사용하는 것이 좋다. 그 이유는 캐릭터가 점프를 했을 때 중력이나 충돌에 영향을 받으므로 물리 엔진 컴포넌트인 Rigidbody를 사용하는 것이 좋다.



