본문 바로가기
Unity/2D 게임 구현

[Unity 2D] 캐릭터 움직임 구현

by Classic Master 2024. 5. 18.
728x90

캐릭터 움직임 구현

오늘은 간단하게 기초적인 움직임 구현을 만들어 보겠습니다.

이동을 구현하는 방식에는 여러방식이 있지만, Input Axis를 이용하여 만들겠습니다.

Unity - Input Axis를 사용한 움직임 구현

Unity에서 입력을 다루는데 가장 일반적으로 사용되는 것 중 하나는 "Input Axis"입니다.

"Input Axis"는 사용자 입력에 대한 값들을 담고 있는데, 예를 들어 "Horizontal"과 "Vertical"은 주로 좌우와 상하 움직임에 사용됩니다.
Horizontal 값은 보통 -1에서 1까지의 범위를 갖습니다. 만약 음수 값을 갖는 키를 누르면 왼쪽으로 이동하게 되고, 양수 값을 갖는 키를 누르면 오른쪽으로 이동합니다. Vertical도 비슷한 원리로 작동합니다.

 

Rigidbody2D ?

Rigidbody2D는 Unity에서 2D 물리 시뮬레이션을 처리하는 컴포넌트 중 하나입니다. 이 컴포넌트는 2D 게임 객체의 물리적인 특성을 제어하고, 충돌, 중력, 운동, 회전 등을 처리합니다. 여기서 간단히 설명하겠습니다:

Body Type (bodyType)
Rigidbody2D의 Body Type은 객체의 물리 특성을 결정합니다.

  • Dynamic: 객체는 외부 힘에 반응하고, 충돌과 중력에 영향을 받습니다.
  • Kinematic: 객체는 외부 힘에 반응하지 않고, 직접 위치 및 회전을 제어할 수 있습니다.
  • Static: 객체는 외부 힘에 반응하지 않고, 고정된 위치에 있습니다.

Material (material)
Material은 객체의 물리 특성을 정의하는 데 사용됩니다.

 

Simulated (simulated)
Simulated는 Rigidbody2D가 물리 시뮬레이션에 의해 영향을 받는지 여부를 나타냅니다. false로 설정하면 객체는 물리 시뮬레이션에 영향을 받지 않습니다.

 

Use Auto Mass (useAutoMass)
Use Auto Mass는 Rigidbody2D의 질량을 자동으로 계산할지 여부를 결정합니다. true로 설정하면 Rigidbody2D는 자동으로 질량을 계산합니다.

 

Mass (mass)
Mass는 객체의 질량을 나타냅니다. 질량이 클수록 더 많은 힘이 필요합니다.

 

Linear Drag (linearDrag)
Linear Drag는 객체가 속도를 줄이는 데 얼마나 빠르게 반응하는지를 나타냅니다.

값이 클수록 객체는 속도를 줄이는 데 더 빠르게 반응하며, 이는 물체가 이동할 때 공기 저항이나 다른 외부 요인에 의해 빨리 감속되는 것을 의미합니다.

 

Angular Drag (angularDrag)
Angular Drag는 객체의 회전을 줄이는 데 얼마나 빠르게 반응하는지를 나타냅니다. 값이 클수록 더 빨리 회전이 감소합니다. 이는 물체가 회전할 때 공기 저항이나 다른 외부 요인에 의해 빨리 회전 속도가 감소하는 것을 의미합니다.

 

Gravity Scale (gravityScale)

Gravity Scale은 객체에 적용되는 중력의 강도를 나타냅니다. 값이 0이면 중력이 적용되지 않습니다.

 

Collision Detection (collisionDetection)
Collision Detection은 충돌을 감지하는 방법을 설정합니다. 값에 따라 정확성과 성능이 달라질 수 있습니다.

 

Sleeping Mode (sleepingMode)
Sleeping Mode는 객체가 정지할 때 물리 시뮬레이션에서 어떻게 처리될지를 설정합니다. 필요에 따라 정확성과 성능을 조정할 수 있습니다.

 

Interpolate (interpolate)

Interpolate는 Rigidbody2D의 위치와 회전을 보간하는 방법을 설정합니다. 부드러운 이동을 위해 사용될 수 있습니다.

반응형

 

코드 구현

public class PlayerController : MonoBehaviour
{
    //----public Fields----//
    // 객체의 이동 속도를 결정하는 변수
    public float moveSpeed;

    // Rigidbody2D 컴포넌트에 대한 레퍼런스
    Rigidbody2D rigid;

    // 수평 및 수직 입력 값
    float horizontalValue;
    float verticalValue; // 아직 사용하지 않습니다.

    // 게임 오브젝트가 활성화될 때 호출되는 함수
    void Awake()
    {
        // Rigidbody2D 컴포넌트를 가져와 rigid에 변수 할당
        rigid = GetComponent<Rigidbody2D>();
    }

    // 프레임마다 호출되는 함수
    void Update()
    {
        // 유니티에 저장된 수평 및 수직 입력 값을 가져오는 함수
        horizontalValue = Input.GetAxisRaw("Horizontal");
        verticalValue = Input.GetAxisRaw("Vertical");
    }

    // 물리 업데이트마다 호출되는 함수
    void FixedUpdate()
    {
        // 이동 함수를 호출하고 수평 입력 값을 전달
        Move(horizontalValue);
    }

    // 이동 함수
    private void Move(float dir)
    {
        // 이동량 계산
        float xVal = dir * moveSpeed * Time.deltaTime;

        // 현재 y축 속도를 유지하고 x축 방향 속도를 설정한 벡터 생성
        Vector2 targetVelocity = new Vector2(xVal, rigid.velocity.y);

        // Rigidbody의 속도를 설정된 벡터로 업데이트
        rigid.velocity = targetVelocity;
    }
}

 

로직을 작성 한 후 Script를 움직이고 싶은 대상에게 넣은 후 속도 값을 임의 변경합니다.

저의 스크립트 이름은 Player Controller입니다.

 

 

 

간단한 Visual Studio 작성

 

 

728x90
반응형

'Unity > 2D 게임 구현' 카테고리의 다른 글

[Unity 2D] 캐릭터 애니메이션 및 달리기 구현  (0) 2024.05.19