오브젝트를 움직이는 방법들
transform.position을 변경하는 움직임
https://docs.unity3d.com/ScriptReference/Transform.Translate.html
Unity - Scripting API: Transform.Translate
Declaration public void Translate(float x, float y, float z); Declaration public void Translate(float x, float y, float z, Space relativeTo = Space.Self);
docs.unity3d.com
void Translate(Vector3 translation);
transform.translate는 오브젝트의 transform.position을 translation의 방향과 거리에 따라 이동시켜준다.
즉 이 이동방법은 오브젝트의 transform.position 자체를 변경시키면서 이동한다.
public float speed = 10f;
void Update()
{
Vector3 direction = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
transform.Translate(direction * speed * Time.deltaTime);
}
transform.position 자체를 변경하면서 이동하기 때문에 물리작용을 무시한다.
rigidbody를 무시하기 때문에 collider와의 충돌도 무시된다.
따라서 보통 캐릭터를 움직이는데는 적합하지 않고, 물리법칙과 상관없는 예를들어 화면위 글씨의 움직임 같은것에 적합하다.
Rigidbody를 이용한 움직임
Rigidbody를 이용한 움직임에는 크게 3가지가 있다.
1. rigidbody.AddForce();
2. rigidbody.velocity
3. rigidbody.movePosition
1. rigidbody.AddForce()
AddForce는 이름대로 rigidbody에 힘을 가하는 방법이다.
public float speed = 20f;
public Rigidbody rb;
public Vector3 movement;
void Update()
{
// Input
movement = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
}
void FixedUpdate()
{
MoveWithAddForce(movement);
}
void MoveWithAddForce(Vector3 direction)
{
rb.AddForce(direction * speed);
}
AddForce를 이용해 오브젝트를 움직이면 키보드를 누르면 힘이가해져 velocity가 증가하고
키보드에서 손을때도 움직임이 계속된다. 즉 마치 빙판위를 걷는 느낌으로 움직인다.
2. velocity 변경
velocity 자체를 변경해서 움직이는 방법이다.
public float speed = 20f;
public Rigidbody rb;
public Vector3 movement;
void Update()
{
// Input
movement = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
}
void FixedUpdate()
{
MoveWithVelocity(movement);
}
void MoveWithVelocity(Vector3 direction)
{
rb.velocity = direction * speed;
}
이런 식으로 velocity를 변경하게되면 중력을 포함한 모든 물리작용을 오버라이드한다.
이 방법은 오브젝트를 일정한 속도로 움직여야할때 사용하기 적합하다.
3. rigidbody.movePosition
transform.Translate 와 비슷하게 특정 지점으로 오브젝트를 이동시킨다.
또한 Translate와 다르게 collider와의 충돌 및 물리작용도 적용된다.
public float speed = 20f;
public Rigidbody rb;
public Vector3 movement;
void Update()
{
// Input
movement = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
}
void FixedUpdate()
{
MoveWithMovePosition(movement);
}
void MoveWithMovePosition(Vector3 direction)
{
rb.MovePosition(transform.position + (direction * speed * Time.deltaTime));
}