티스토리 뷰

[Unity] 오브젝트 이동, 회전, 크기 조절하기

rucya 2016. 10. 16. 15:24

 

[Unity] 오브젝트 이동, 회전, 크기 조절하기

 

유니티에서 오브젝트를 이동시키거나 회전시키고, 크기 조절하는 명령은 매우 기본적인 명령입니다.

그런데도 불구하고 의외로 자주 찾게 되는 명령이 transform 관련 명령인 것 같습니다.

Unity 3D에서는 명령을 사용할 때 C#과 Java를 사용할 수 있는데요.

아래의 설명은 C#을 기준한 설명입니다.

 

[유니티에서 오브젝트 이동하기 - transform.position, transform.Translate]

 

1. transform.position을 이용하여 이동하기

 

transform.position 명령은 오브젝트의 현 위치와는 무관하게 원하는 위치로 이동시키는 방법입니다.

사용 방법은 transform.position = new Vector3(x, y, z); 입니다.

여기에서 x와 y, z는 float 값으로 소숫점을 포함한 값입니다.

 

예를 들어 transform.position = new Vector3(0, 0, 0);은 오브젝트를 원점(0, 0, 0)에 배치하는 명령입니다.

 

오브젝트에 연결된 스크립트에 작성할 경우에는 위의 명령처럼 작성할 수 있지만,

다른 오브젝트(게임 전체를 관리하는 오브젝트나 스크립트)에서 특정 오브젝트를 이동시키고자 할 경우에는 아래처럼 사용하시면 됩니다.

 

objVillageCamera.transform.position = new Vector3(0, 0, 0);
objVillageCamera = GameObject.Find("VillageCamera");
objVillageCamera.transform.position = new Vector3(0, 0, 0); 

 

또는

 

public static GameObject objVillageCamera;
objVillageCamera = GameObject.Find("VillageCamera").transform.position = new Vector3(0, 0, 0);

 

유니티의 transform.position 관련 도움말은 아래를 참조하세요.

https://docs.unity3d.com/ScriptReference/Transform-position.html

 

2. transform.Translate를 이용하여 이동하기

 

transform.Translate 명령은 상대좌표로 이동시키는 방법으로 오브젝트의 현재 위치에서 특정 거리만큼 이동시키는 방법입니다.

사용방법은 transform.Translate(Vector3.forward); 또는 transform.Translate(new Vector3(0, 0, 1)); 입니다.

 

transform.Translate 명령을 사용하면 오브젝트의 방향을 기준으로 정해진 값만큼 이동하게 되는데요.

오브젝트의 방향이 아닌 월드방향을 기준해서 이동시키고자 한다면

transform.Translate(Vector3.forward, Space.World); 또는 transform.Translate(new Vector3(0, 0, 1), Space.World); 로 입력하면 됩니다.

 

transform.Translate 명령의 2번째 인수로 Space.Self를 입력하거나 생략할 경우 로컬 좌표로 이동하게 되며,

2번째 인수에 Space.World를 입력할 경우 글로벌 좌표로 이동하게 됩니다.

 

transform.Translate 명령을 이용하는 경우는 프레임마다 이동시키는데 사용하게 되므로 주로 아래처럼 사용하게 됩니다.

 

int speed = 100;
void Update()
{
 float fMove = Time.deltaTime * speed;
 transform.Translate(Vector3.forward * fMove);
}

 

위의 명령에서 Time.deltaTime은 이전 프레임과 현재 프레임 사이의 시간으로 위의 소스처럼 사용하게 되면 오브젝트가 자연스럽게 이동이 가능합니다.

위의 명령처럼 작성해 보고, 오브젝트의 이동속도가 너무 빠르면 speed 의 값을 낮추고, 너무 느리다면 speed의 값을 높여서 속도를 조절하시면 됩니다.

 

 

 

Vector3 명령은 방향에 따라 다음처럼 사용이 가능합니다.

 

Vector3(1, 0, 0) 또는 Vector3.right => 오른쪽으로 이동
Vector3(-1, 0, 0) 또는 Vector3.left => 왼쪽으로 이동
Vector3(0, 1, 0) 또는 Vector3.up => 윗쪽으로 이동
Vector3(0, -1, 0) 또는 Vector3.down => 아래쪽으로 이동
Vector3(0, 0, 1) 또는 Vector3.forward => 앞쪽으로 이동
Vector3(0, 0, -1) 또는 Vector3.back => 뒷쪽으로 이동
Vector3(0, 0, 0) 또는 Vector3.zero => 원점(이동하지 않음)
Vector3(1, 1, 1) 또는 Vector3.one => 세축으로 이동

 

유니티의 transform.Translate 관련 도움말은 아래를 참조하세요.

https://docs.unity3d.com/ScriptReference/Transform.Translate.html

 


 

[유니티에서 오브젝트 회전하기 - transform.rotation, transform.Rotate]

 

1. transform.rotation을 이용하여 회전하기

 

transform.rotation 명령은 특정 방향으로 회전시킬 때 사용하는 명령입니다.

transform.rotation 명령을 사용할 때는 transform.position 명령을 사용하는 방법과는 차이가 있습니다.

무심결에 코드를 작성하다보면 transform.rotation = new Vector3(x, y, z); 처럼 작성할 수 있는데요.

위의 소스는 잘못된 방식입니다.

transform.rotation 명령은 다음과 같은 방식으로 사용해야 합니다.

 

transform.rotation = Quaternion.Euler(x, y, z);

 

여기에서 Euler는 수학자 오일러의 이름을 딴 것으로 회전시키는 방법 중 오일러 방식을 얘기하는 것입니다.

오일러 회전 방식은 3축의 회전 값을 대입해 회전시키는 방식이지만 특정 각도가 될 경우 원하는 결과가 나오지 않는 문제가 발생하기 때문에 4축 회전 방식인 쿼터니언 방식을 사용합니다.

하지만 이런 과정은 유니티에서 자동으로 처리해 주기 때문에 위의 예제(transform.rotation = Quaternion.Euler(x, y, z);)처럼 사용하시면 됩니다.

 

 

 

유니티의 transform.rotation 관련 도움말은 아래를 참조하세요.

https://docs.unity3d.com/ScriptReference/Transform-rotation.html

 

2. transform.Rotate를 이용하여 회전하기

 

transform.Rotate 명령은 다음과 같이 사용합니다.

 

transform.Rotate(x, y, z); 

 

transform.Rotate 인수 중 x축의 값만 대입하고, 나머지는 0으로 지정할 경우 오브젝트는 앞뒤로 회전하게 됩니다.

서 있는 사람을 예로 들면 고개를 앞뒤로 흔드는 방향을 생각하면 되겠네요.

 

transform.Rotate 인수 중 y축의 값만 대입하고, 나머지는 0으로 지정할 경우 오브젝트는 좌우로 회전하게 됩니다.

연필을 세워놓고 회전시키는 모습을 상상하면 되겠네요.

 

transform.Rotate 인수 중 z축의 값만 대입하고, 나머지는 0으로 지정할 경우 오브젝트는 좌우로 회전하게 됩니다.

접힌 우산이 정면을 향하도록 한 다음 우산을 회전시킨다고 생각하면 되겠네요.

 

오브젝트를 회전시킬 때 오브젝트의 로컬좌표를 기준으로 회전시키지 않고, 글로벌 좌표를 기준으로 회전시키고자 한다면 transform.Translate처럼 2번째 인수로 Space.World를 넣어주면 됩니다.

Space.Self를 입력하거나 생략하게 되면 로컬좌표로 회전하게 되고, Space.World를 입력하면 글로벌좌표를 기준으로 회전이 됩니다.

글로벌 좌표를 기준으로 회전시키는 예제는 다음과 같습니다.

 

 

transform.Rotate(x, y, z, Space.World); 

 

유니티의 transform.Rotate 관련 도움말은 아래를 참조하세요.

https://docs.unity3d.com/ScriptReference/Transform.Rotate.html

 

[유니티에서 오브젝트 크기 조절하기 - transform.localScale]

 

유니티에서 오브젝트의 크기를 조절할 때는 다음과 같이 사용합니다.

 

transform.localScale = new Vector3(x, y, z); 

 

유니티의 transform.localScale 관련 도움말은 아래를 참조하세요.

https://docs.unity3d.com/ScriptReference/Transform-localScale.html

 


 

아래 내용은 제가 유니티 공부를 처음 시작해서 한달만에 개발한 게임을 소개 해 드립니다.

유니티 책 2권 구입해서 예제만 따라 해 보다가 책의 소스 내용을 응용해서 이런 게임도 가능하지 않을까 하는 생각을 가지고 만들기 시작한 게임이랍니다.

 

유니티 공부를 시작한 지 1주일 정도 된 시점에서 유니티의 기본적인 명령들은 조금 파악이 된 상태였고 그 때부터 게임 기획을 시작하면서 한달만에 완성한 게임인데요.

 

유니티로 처음 만든 게임이라서 그런지 애정이 많이 가는 게임이랍니다.

엄밀히 말하면 유니티 공부를 1주, 게임 개발 겸 유니티 공부 3주, 총 4주만에 개발한 게임이랍니다.

 

게임을 간단히 소개하겠습니다.

 

ㅇ 게임명 : 키스볼(추후 키스볼의 스테이지를 재정리해서 키스볼2를 새롭게 출시함)

 

ㅇ 게임경로 : https://play.google.com/store/apps/details?id=com.kaisersoze.kissballs2

 

※ 게임 검색 : 구글플레이에서 "키스볼2"로 검색(안드로이드 버전만 출시함)

 

ㅇ 게임방법

 

1. 파란볼과 빨간볼이 만나면 성공하는 게임

2. 화면 아무곳이나 클릭하면 볼이 무제한으로 생성되도록 구현되어 있음

3. 화면에 다양한 장애물이 있으며 장애물은 색 및 모양으로 구분됨

4. 볼들은 색으로 구분되며, 무게 및 다른 물체에 부딪혔을 때 튕기는 반사력에 차이가 있음

 

ㅇ 기타

- 구글 리더보드를 이용해서 성공한 스테이지의 갯수를 비교할 수 있음

- 동영상 녹화기능도 추가했었으나 게임에 방해가 되는 것 같아서 현재 버전에서는 제거함

- 5분 이상 게임을 지속한 상태에서 성공 또는 실패 시 애드몹(구글 광고) 광고가 노출됨(수익은 거의 없음 ㅠㅠ)

 

아래에 게임 동영상을 올려드리니 동영상 감상하시고 재미있겠다 싶으시면 설치해서 재미있게 즐겨보시기 바랍니다.
그외에도 자이로센서 데이터를 이용해 우주선을 격파하는 게임(알파포스 AR) 및 마방진 등 몇 개의 게임을 더 개발했답니다.

(알파포스AR, 마방진 프리미엄, 러버볼 등)

 

 

 

댓글