Chapter 4. 기본 이동

개발하는 운동인·2024년 11월 14일

이동

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을 곱해 시간에 맞춘 이동량을 더한 것이다.

정리

    1. 수평,수직에 대한 입력 값을 단위 벡터와 곱해서 각각 방향 벡터를 만든다. -> 방향 벡터 생성
    1. 각각의 방향 벡터를 더해서 최종 방향 벡터를 구한 다음, 일정한 크기(속도)로 갈 수 있도록 normalized를 한다. 그리고 크기(속도)를 곱한다. -> 속도 벡터 생성
    1. 속도 벡터에 최종 방향과 크기(속도)를 모두 포함 하므로, 속도 벡터를 초 단위로 계산하여 현재 위치에 더한다.

- 속도 벡터

예를 들어, 시속 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를 사용하는 것이 좋다.

    1. Sand (모래) 로 이름을 짓는다. 현실에서 모래 위를 걷게 되면 사람의 발 걸음이 느려진다. 그러므로 Walkable 보다 Cost를 높게 작성한다.
    1. 공간에 대한 경로 탐색에 영향을 주는 NavMesh Modifier Volume 를 생성한다. Area Type은 Sand로 설정한다.

  • 실행 결과
  • 저 분홍색 박스 부분 근처를 마우스 포인터로 클릭 할 경우 최단 경로가 아닌 최장경로로 이동하게 된다. 즉, 경로에 영향을 준다. 하지만 플레이어 위치가 분홍색 박스 부분과 가까울 경우 최단경로로 이동한다.
  • 위 결과에 대한 이유는 분홍색 박스를 제외한 bake 된 오브젝트는 Walkable이고, cost는 1이다. 하지만, 분홍색 박스는 Sand이고, cost는 2이기 때문에 값이 더 비싸다. 따라서 최장경로로 이동하는 것이다.

0개의 댓글