fullstack

[Unity3D] 이동, 회전, 크기변경 정리

Unity

Unity에서 GameObject의 이동, 회전, 크기변경을 하기 위한 방법에 대해 알아보자.

 

 

 

- 이동

 

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

 
가장 간단한 방법으로 GameObject의 위치를 직접 지정해 줄 수 있다.
 
 
1
transform.Translate(speed, 00);

 
현재 위치를 기준으로 x축으로 움직이고 싶다면 위와같이 쓸 수 있다.
 
 
1
transform.position = Vector3.MoveTowards(transform.position, target.position, speed);

 

taget 오브젝트에게 일정하게 이동하고 싶다면 위와같이 MoveToward를 쓰면 된다.

 

 

 

- 회전

 

1
transform.rotation = Quaternion.identity;

회전또한 간단하게 회전값을 지정해 줄 수 있다.
Quaternion 값으로 지정해야하며 Quaternion.identity는 기본값인 (0,0,0)을 나타낸다.
Quaternion에 대한 정보는 링크를 참조하자. ( http://docs.unity3d.com/ScriptReference/Quaternion.html )
 
 
1
transform.Rotate(Vector3.up, speed, Space.World);

Rotate를 사용하여 현재 회전값을 기준으로 회전시킬 수 있다.
매개변수에는 축, 각도, 기준좌표계가 들어간다.
 
 
1
transform.LookAt(target)

target의 방향 정보가있고 이 위치를 향해 바라보고 싶다면 위와같이 LookAt을 사용할 수 있다.
하지만 이는 한번에 회전하므로 천천히 target을 향해 회전하도록 하고 싶다면 아래와 같이 RotateTowards를 사용한다.
 
1
transform.rotation = Quaternion.RotateTowards(transform.rotation, lookRotation, speed);

 
 
- 크기
 
1
transform.localScale = new Vector3(111);

원하는 크기로 변경하고 싶다면 위와같이 사용할 수 있다.
 
 
1
transform.localScale += new Vector3(100);

현재 크기를 기준으로 x축으로 늘리고 싶다면 위와같이 사용할 수 있다.
 
 
 
- Time.deltatime
 
GameObject를 연속적으로 이동하거나 회전시킬때 Update문에서 구현하게 된다.
하지만 이는 매 프레임마다 호출되는 Update 특성 상 PC의 성능에 따라 프레임횟수가 다르기 때문에 문제가 발생한다.
즉, 같은 속도값을 주더라도 좋은PC와 안좋은PC에서 움직이는 속도가 다르게된다.
 
이는 속도값에 Time.deltatime을 곱해 해결할 수 있다.
Time.deltatime을 간단히 설명하자면 전프레임이 완료되기까지 걸린 시간으로 성능이 느릴수록 값이 커지는 특성이 있다.
 
그럼 speed값을 정의할때 다음과 같이 쓰면 되겠다.
 
1
float speed = 10 * Time.deltaTime;

 

 

[Unity3D] GameObject 생성과 삭제. Instantiate와 Destroy

Unity

Unity에서 Instantiate와 Destroy 함수를 이용하여 GameObject를 생성하고 삭제할 수 있다.

 

 

 

- Instantiate

 

Instantiate는 다음과 같이 사용할 수 있다.

 

1
Instantiate(original, position, rotation);

 

 

위와 같이 3가지의 매개변수를 가진다.

original - 생성할 GameObject로 현재 Scene에 있는 GameObject나 Prefab을 지정할 수 있다.

position - Vector3변수로 생성될 GameObject의 위치를 지정한다.

rotation - Quaternion변수로 생성될 GameObject의 회전값을 지정한다. 이변이 없는 한 원래 GameObject의 회전값 즉, original.transform.rotation으로 지정한다.

 

만약 총알을 생성하여 발사한다면 다음과 같이 바로 Rigidbody로 캐스팅하여 사용할 수 있다.

 

1
2
3
Rigidbody clone;
clone = Instantiate(bullet, gun.transform.position, bullet.transform.rotation) as Rigidbody;
clone.AddForce(transform.forward * 5000);
 

 

 

 

- Destroy

 

Destroy는 다음과 같이 사용할 수 있다.

 

1
Destroy(obj);

 


매개변수에 삭제할 Object를 넣어주기만 하면 된다. 
만약 일정 딜레이를 준 후에 Object를 삭제하고 싶다면 다음과 같이 매개변수를 추가해주면 된다.

1
Destroy(obj, time);

 

time은 float 변수로 시간을 지정해 주기만 하면 된다.
 
 
 
- Instantiate와 Destroy의 문제점
 
예를 들어 총알과 같이 수없이 생성되고 삭제되는 GameObject가 있다고 하면 이를 계속 Instantiate와 Destory로 생성하고 삭제한다면 아무래도 시스템에 많은 부담을 줄 것이다. 따라서 이럴 경우에는 오브젝트들을 Pool로 관리하여 재사용할 수 있도록 관리해 주는 것이 좋다
 

 

[Unity3D] Prefab

Unity

Unity에서 같은 GameObject가 여러개 필요하다면 Prefab을 이용해 효율적으로 GameObject를 관리할 수 있다.


- Prefab 생성 방법



위와같이 Project 창에서 Create - Prefab을 선택해 Prefab을 생성할 수 있다. 



그럼 다음과 같이 Prefab이 생성되는데 여기에 Prefab화 하고 싶은 GameObject를 드래그 앤 드롭하면 된다. 

이 과정이 번거롭다면 GameObject를 바로 Project 창에 드래그 앤 드롭하면 Prefab이 자동으로 생성된다.

그럼 만들어진 Prefab을 Scene이나 Hierarchy에 드래그 앤 드롭하여 마음껏 사용할 수 있다.



Prefab화 되어진 GameObject는 위와같이 파란색 글씨로 표시되는데 연결을 끊고 싶다면 위 메뉴중 GameObject - Break Prefab Instance를 선택하면 된다.




- Prefab을 사용해야 하는 이유



Prefab을 사용하면 그림과 같이 한번에 여러개의 GameObject들을 한번에 수정할 수 있다. 만약 이를 일일이 하나씩 모두 해줘야 한다면 매우 번거로울 것이다.

또한 GameObject를 생성할때 Prefab을 바로 생성해서 사용할 수 있기 때문에 생성할 GameObject가 Scene에 없어도 사용할 수 있다.