본문 바로가기
유니티/기초

유니티 오브젝트 이동 [기초 1]

by 노튜 2020. 5. 1.
728x90

 

오브젝트를 이동시키는 방법은 한 가지만 존재하지 않습니다.

코딩 방법, 클래스의 사용에 따라 달라집니다.

2D 이동과 3D 이동하는 방법도 다릅니다. 

또한, 게임의 형태, 목적에 따라 달라집니다. 

 

기본적인 몇 가지 방법에 대하여 제시합니다.

 

준비

Hierarchy 창에 큐브를 생성합니다. 

Movement class를 생성합니다. 

생성된 큐브에 Movement class를 추가합니다.

 

1. Transform

Transform은 게임 오브젝트의 위치, 회전 그리고 스캐일(Scale)을 나타냅니다. (유니티)

유니티에서 모든 오브젝트는 Transform을 가집니다.

Tranform의 상태 값을 변경하여, 오브젝트의 이동, 회전 등을 하게 됩니다. 

오브젝트를 이동하는 것은 이 Transform의 위치를 변경해 주므로서 이루어집니다.

 

Transform을 이용한 이동은

Transform.position의 좌표 값을 변경하여 이동하는 것과 Transform.Translate()을 이용하는 방법이 있습니다.  

1.1 position vs translate()

transform.position은 월드 좌표값으로, 월드 좌표를 기준으로 물체를 이동합니다.

transform.translate()은 로컬 좌표값으로, 물체를 기준으로 물체를 이동합니다.  

 

이는 다시 말해, position은 이동 대상이 되는 물체의 회전값에 영향을 받지않고 이동하며,

translate()은 물체의 회전값에 영향을 받아 이동한다는 것입니다. 

 

잘 이해가 가지 않는다면, 다음과 같은 상태에서 물체가 어디로 이동하는지 직접 구현해봅니다.

눈으로보면 쉽게 이해할 수 있을 겁니다. 

 

0,0,0 위치에 있고, y축으로 90도 회전한 상태인 물체를 Vector3(1.0f, 0, 0 )만큼 이동시킵니다.

transform.postion은 1,0,0의 위치로 물체가 이동하며,

transform.translate()은 0,0,-1의 위치로 물체가 이동을 합니다.  

 

public class Movement : MonoBehaviour
{

  // Vector3 (X, Y, Z)
  //  //는 주석
  void Start()
  {
    // y축 기준 90도 회전 
    transform.rotation = Quaternion.Euler(0, 90.0f, 0);
  }
  
  void Update()
  {
    // position
    transform.postion += new Vector3(1.0f, 0, 0);
    
    // translate in local
    // transform.translate(new Vector3(1.0f, 0, 0));
    
    // translate in world
    // transform.translate(new Vector3(1.0f, 0, 0), Space.World)
  }
  
}

 

   

1.2 transform.position

Position을 이용해 물체의 이동을 구현합니다.

Update()가 발생할때마다, X축 1.0f 이동합니다. 

 

A += B 는 A = A +B 와 동일합니다.  A에 B를 더하여 A에 대입한다.

public class Movement : MonoBehaviour
{
  void Start()
  {
  }
  
  void Update()
  {
  // 오른쪽 이동
    transform.position = transform.position + new Vector3(1.0f, 0, 0);
    
    // 왼쪽 이동
    //transform.position = transform.position + new Vector3(-1.0f, 0, 0);
    // 위 이동
    //transform.position += new Vector3(0, 1.0f, 0);
    // 아래 이동
    //transform.position += new Vector3(0, -1.0f, 0);
    //앞 이동
    //transform.position += new Vector3(0, 0, 1.0f);
    //뒤 이동
    //transform.position += Vector3.back;
      
  }
}

 

1.3 transform.translate()

오브젝트의 transform의 translate() 함수를 이용하여 이동을 구현합니다.

translate()를 이용해 X좌표의 1만큼 물체를 이동시킵니다.

 

translate()의 두번째 인자 값으로 물체의 로컬좌표 이동을 월드좌표로 이동하도록 구현합니다.

translate(Vector(), Space relativeTo)

public class Movement : Monobehaviour
{
  void Update()
  {
   // 로컬 좌표 이동 
    transform.translate(new Vector3(1.0f, 0, 0));
    
    // 월드 좌표 이동
    // transform.translate(new Vector3(1.0f, 0, 0), Space.World)
  }
}

 

 

유니티는 각 방향 값에 매칭하는 Vector 변수를 제공합니다.

 

  • Vector3.right     = Vector3(1.0f, 0, 0 )
  • Vector3.left       = Vector3(-1.0f, 0, 0 )
  • Vector3.up        = Vector3(0, 1.0f, 0 )
  • Vector3.down    = Vector3(0, -1.0f, 0 )
  • Vector3.forward = Vector3(0, 0, 1.0f)
  • Vector3.back     = Vector3(0, 0, -1.0f )

위 이외에도 제공되는 변수들이 존재합니다. 

Vecter3에서 확인 가능합니다.  

 

 

2. Rigidbody

물리적인 힘을 이용하여, 물체의 이동을 구현합니다. 

 

큐브 오브젝트에 Rigidbody를 추가합니다. 

큐브 오브젝트의 Transform Position을 0, 1, 0 또는 1, 1, 1으로 설정 합니다. 

물리적인 힘의 처리는 Rigidbody에서 합니다.

 

큐브의 아래에 Plane을 두어, 중력에 의해 오브젝트가 아래로 하락하는 것을 방지합니다.

Hierarchy에 Plane을 추가합니다.

3D Object → Plane     

 

2.1 rigidbody.position

 

첫번째로, Rigidbody의 position을 사용해 물체를 이동합니다.

rigidbody.position도 월드 좌표를 사용합니다.

 

물리적인 힘의 처리는 FixedUpdate()에서 합니다. 

Update()보다 먼저 실행됩니다.

 

FixedUpdate()에서 물리적 처리를 하고, Update()에서 충돌에 대한 오브젝트의 상태변화를 반영합니다. 

 

public void Movement : MonoBehaviour
{
  Rigidbody body;
  void Start()
  {
    body = GetComponent<Rigidbody>();
  }
  void FixedUpdate()
  {
    body.position += Vector3.right;
  }
  
  void Update()
  {
    
  }
}

 

2.2 AddForce()

두번째로, Addforce()를 사용해 물체를 이동합니다.

Addforce는 물체에 힘을 가하는 것입니다. 

AddForce()를 이용해 Y축 +방향으로 500의 힘을 가합니다. 

 

public class Movement : MonoBehaviour
{
  Rigidbody body;
  float time = 1.0f;
  
  void Start()
  {
    // 물체에 연결된 Rigidbody 얻기 
    body = GetComponent<Rigidbody>();
  }
  
  void FixedUpdate()
  {
    time -= Time.deltaTime;
    // 1초 후에 Y축 500의 힘 추가
    if(time < 0)
    {
      body.AddForce(new Vector3(0, 500.0f, 0))
      time = 100.0f;
    }
  }
}

 

2.3 Velocity

세번째는 Rigidbody의 velocity( 속도)를 이용해 물체 이동을 구현합니다.

물체 이동을 확인하기 위해, Gravity(중력) 속성은 사용하지 않겠습니다.

 

시작 시 물체에 Vector3.right * 0.2f의 속도를 주고, 3초 후에 속도를 0으로 변경해주도록 구현합니다. 

 

public class Movement : MonoBehaviour
{
  Rigidbody body;
  float time = 3.0f;
  
  void Start()
  {
    body = GetComponent<Rigidbody>();
    // 중력 사용하지 않도록 구현 
    body.useGravity = false;
    // 물체 속도 추가  
    body.velocity = Vector3.right * 0.2f;
  }
  
  void FixedUpdate()
  {
    time -= Time.deltaTime;
    
    if(time < 0)
    {
      // 속도를 0로 변경 
      body.velocity = Vector3.zero;
      time = 100.0f;
    }
  }
}

 

 

 

 

참고자료 

 

Difference Translate vs position

 

https://answers.unity.com/questions/556664/difference-between-moving-forward-with-transformtr.html

 

Difference between moving forward with transform.Translate vs transform.localPosition - Unity Answers

 

answers.unity.com

 

Rigidbody

 

https://docs.unity3d.com/kr/2018.4/Manual/class-Rigidbody.html

 

리지드바디 - Unity 매뉴얼

Rigidbody 는 GameObject 가 물리 제어로 동작하게 합니다. 리지드바디는 힘과 토크를 받아 오브젝트가 사실적으로 움직이도록 해줍니다. 리지드바디가 포함된 모든 게임 오브젝트는 중력의 영향을 받아야 하며 스크립팅을 통해 가해진 힘으로 움직이거나 NVIDIA PhysX 물리 엔진을 통해 다른 오브젝트와 상호 작용해야 합니다.

docs.unity3d.com

 

728x90