오브젝트를 이동시키는 방법은 한 가지만 존재하지 않는다. 코딩 방법, 클래스의 사용에 따라 달라진다.
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의 위치로 물체가 이동을 합니다.
using UnityEngine;
public class Movement : MonoBehaviour
{
// Vector3 (X, Y, Z)
// //는 주석
// Start is called before the first frame
void Start()
{
// y축 기준 90도 회전
transform.rotation = Quaternion.Euler(0, 90.0f, 0);
}
// Update is called once per frame
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에 대입한다.
using UnityEngine;
public class Movement : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
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)
using UnityEngine;
public class Movement : MonoBehaviour
{
// Update is called once per frame
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()에서 충돌에 대한 오브젝트의 상태변화를 반영합니다.
using UnityEngine;
public class Movement : MonoBehaviour
{
Rigidbody body;
// Start is called before the first frame update
void Start()
{
// Get Rigidbody attached to GameObject
body = GetComponent<Rigidbody>();
}
// FixedUpdate is called
void FixedUpdate()
{
body.position += Vector3.right;
}
// Update is called once per frame
void Update()
{
}
}
2.2 AddForce()
두번째로, AddForce()를 사용해 물체를 이동합니다. AddForce는 물체에 힘을 가하는 것입니다.
AddForce()를 이용해 Y축 +방향으로 500의 힘을 가합니다.
using UnityEngine;
public class movement : MonoBehaciour
{
Rigidbody body;
float time = 1.0f;
// Start is called before the first frame update
void Start()
{
// 물체에 연결된 Rigidbody 얻기
body = GetComponent<Rigidbody>();
}
// FixedUpdate is called
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으로 변경해주도록 구현합니다.
using UnityEngine;
public class Movement : MonoBehaviour
{
Rigidbody body;
float time = 3.0f;
// Start is called before the first frame
void Start()
{
body = GetComponent<Rigidbody>();
// 중력 사용하지 않도록 구현
body.useGravity = false;
// 물체 속도 추가
body.velocity = Vector3.right * 0.2f;
}
// FixedUpdate is called
void FixedUpdate()
{
time -= Time.deltaTime;
if(time < 0)
{
// 속도를 0로 변경
body.velocity = Vector3.zero;
time = 100.0f;
}
}
}
References
[1] 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
[2] Rigidbody
https://docs.unity3d.com/kr/2018.4/Manual/class-Rigidbody.html
리지드바디 - Unity 매뉴얼
Rigidbody 는 GameObject 가 물리 제어로 동작하게 합니다. 리지드바디는 힘과 토크를 받아 오브젝트가 사실적으로 움직이도록 해줍니다. 리지드바디가 포함된 모든 게임 오브젝트는 중력의 영향을 받아야 하며 스크립팅을 통해 가해진 힘으로 움직이거나 NVIDIA PhysX 물리 엔진을 통해 다른 오브젝트와 상호 작용해야 합니다.
docs.unity3d.com
'유니티 > 기초' 카테고리의 다른 글
유니티 캐릭터 점프 [기초 6] (0) | 2020.09.13 |
---|---|
유니티 캐릭터 마우스 이동[기초 4] (0) | 2020.09.07 |
유니티 카메라 이동 및 회전 [기초 5] (1) | 2020.05.05 |
유니티 캐릭터 이동 및 회전 [ 기초 3] (1) | 2020.05.04 |
유니티 오브젝트 회전 [기초 2] (0) | 2020.05.04 |