상세 컨텐츠

본문 제목

Unity Basic ch. 13] C#Script로 제어하기 Rigidbody 2D_Velocity

Unity Basic/03. Unity C# script basic

by allma 2020. 5. 4. 22:34

본문

rigidbody(강체)에 대해서는 컴포넌트를 추가하면 기본적으로 중력을 가지고 있다. 

여기에서 Info에 펼침단추를 눌러보면 Position, Rotation, Velocity 등등을 가지고 있다.

 

 

1) Velocity

 

여기에서 스크립트에서 가장 많이 사용되는 요소는 Velocity이다. 

Velocity는 속도라는 뜻으로, 속도는 속력에 위치값을 갖는 것이 속도이다.

위치는 벡터 값이라 할수 있고(new Vector3), 속력은 스칼라 값이다.

예를 들어, (1,0,0)이라는 벡터가 있고, 속력이 10이라하자. 그러면 이에 대한 속도는 

x=1방향은 x,y좌표만 보면 오른쪽 방향이고, 속력이 10이면 이에 따른 속도는 오른쪽 방향으로 10만큼이다..

일단 이해가 안가면 넘어가도록 하자.

 

게임오브젝트에 속도를 주는 요소가 velocity인데 게임오브젝트에게 속도를 주는 것이다. 

 

사용하는 방법은 rigidbody2d 컴포넌트를 추가하고 

-------------------------------

컴포넌트이름.velocity = 벡터 

=>

rigidbody.velocity = new Vector3(1,0,0)

-------------------------------

 

==================

public class PlayerMove : MonoBehaviour
{
    public Rigidbody2D  rigid;

    void Start()
    {
        rigid = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
       rigid.velocity = new Vector3(1,0,0);
    }
}

==================

* 여기에서 물리적인 속성을 제어할때는 FixedUpdate에 명령어를 입력하는 것이 국룰이다.

저장하고 실행해보면 플레이어가 오른쪽 방향으로 가는 것을 볼 수 있다. 

리지드 바디 속성창에도 벨로시티값이 1로 되있는 것을 볼 수 있다. 

 

* 더해보기 >> x값을 1대신 10으로 해보자. 더 빠른 속도록 물체가 이동하나?

 

 

 

2) 단위 벡터와 스칼라값을 사용한 속도제어

 

 

단위벡터에 대해서 알아보면, 

x,y좌표부터 생각해보자. x,y=1,0 일때, x 값이 1이면 벡터에서는 x가 1방향으로 바라보는 화살표가 생긴다.

 

x,y=1,0 벡터값 => 오른쪽 화살표

 

x,y=-1,0 벡터값 => 왼쪽 회살표

x,y = 0,1 벡터값 => 위 회살표

x,y = 0,-1 벡터값 => 아래 회살표

 

벡터를 좌표를 찍어가면서 사용할 수 있지만, 단위벡터에 대해서도 예약어로 설정해둔 부분이 있다.

벡터는 3d로 2d도 제어할 수 있기 때문에 vector3로 알아보자.

 

Vector3.right      오른쪽 화살표

Vector3.left        왼쪽    화살표

Vector3.up         위      화살표

Vector3.down     아래   화살표

 

Vector3.forward   앞으로 화살표

Vector3.back       뒤로   화살표

 

위 예제에서 new Vector대신 단위벡터를 사용해보자.

-------------------------------

컴포넌트이름.velocity = 벡터 

=>

rigidbody.velocity = Vector3.right

-------------------------------

 

==================

public class PlayerMove : MonoBehaviour
{
    public Rigidbody2D  rigid;

    void Start()
    {
        rigid = GetComponent();
    }

    void FixedUpdate()
    {
       rigid.velocity = Vector3.right;
    }
}

==================

내용을 변경하고 저장해보면 위에서 new Vector3(1,0,0)과 같은 결과가 나올것이다.

그렇다면 new Vector3(10,0,0)은 어떻게 사용해야하나?

여기에서 스피드의 개념이 추가된다. 단위 벡터에서는 방향을 결정했다면, 스칼라값은 수로 곱해서 표현해준다. 

 

-------------------------------

new Vector3(10,0,0) = Vector3.right*10

rigidbody.velocity = Vector3.right*10;

-------------------------------

 

==================

public class PlayerMove : MonoBehaviour 
{ 
    public Rigidbody2D  rigid; 

    void Start() 
    { 
        rigid = GetComponent(); 
    } 

    void FixedUpdate() 
    { 
       rigid.velocity = Vector3.right*10; 
    } 
}

==================

 

 

 

 

3) 속력을 변수로 선언해서 속도제어

 

위대로 프로그래밍 하고 실행하면 속도가 변하는 것을 볼 수 있다. 

이제 여기에서 속력값을 숫자로 하지않고 speed 변수를 public float으로 선언해서,

scripte 컴포넌트에서 수를 10으로 설정해보자.

 

==================

public class PlayerMove : MonoBehaviour 
{ 
    public Rigidbody2D  rigid; 

    public float speed;

    void Start() 
    { 
        rigid = GetComponent(); 
    } 

    void FixedUpdate() 
    { 
       rigid.velocity = Vector3.right*speed; 
    } 
}

==================

저장하고 실행해보면 다음과 같다.

script에서 speed값으로 10을 주어야한다.

실행했을때 rigidbody2d에 velocity값이 10으로 변하는것을 볼 수 있다. 

y값이 약간 변하는것은 y축에서 -0.981 중력값을 받기 때문에 변하는 것이다.

 

* 더해보기

단위 벡터를 사용하여 speed값을 다양하게 줘보면서 test해보자.

 

 

 

 

4) 오브젝트 기준으로 방향제어하기

 

** Vecot3는 월드 입장에서 방향값인데

오브젝트가 가지는 방향값을 제공해준다. 

 

transform.right

transform.up

transform.forward

 

반대쪽 방향은 (-1)을 곱하면 됩니다.

 

왼쪽 = transform.right*(-1)

아래 = transform.up*(-1)

뒤 = transform.forward*(-1)

 

이해를 돕기 위해서 플레이어의 rotation z 값을 30으로 주고, 다음과 같이 프로그래밍해보자.

 

-------------------------------

rigid.velocity = transform.up*speed;

-------------------------------

 

 

==================

public class PlayerMove : MonoBehaviour
{
    public Rigidbody2D  rigid;
    public float speed;

    void Start()
    {
        rigid = GetComponent();
    }

    void FixedUpdate()
    {
       rigid.velocity = transform.up*speed;
    }
}

==================

 

실행을 해보면, 오브젝트 기준으로 위로 가는 것을 볼 수 있다. 

* 더해보기 

단위벡터를 변경해가면서 테스트해보자.

 

 

 

 

다음 chapter에서는 rigidbody에서 많이 사용하는 addforce에 대해서 살펴보자.

 

 

 

참고:

 

https://docs.unity3d.com/kr/530/ScriptReference/Rigidbody-velocity.html

 

 

 

관련글 더보기