이번 글은 Unity3D에서 유용하게 다루는 기능들을 정리해 보겠습니다.
- Prefabs: 일종의 보관함으로 프로젝트에서 사용할 오브젝트 원본들을 보관하는 폴더입니다.
Prefabs에 있는 오브젝트들을 Hierarchy에 뽑아 사용할 땐 클론(clone)의 형태로 사용됩니다. 클론 오브젝트들은 속성을 바꿔도 원본에는 영향을 끼치지 않습니다.
- Tag: 오브젝트들의 큰 카테고리로 생각하면 됩니다. 활, 단검, 창 등의 오브젝트를 생성하고 이들을 같은 tag로 묶어놓을 수 있습니다.
Inspector창의 이름 바로 밑에 Tag가 존재합니다. 추가, 분류, 삭제가 가능합니다.
- [SerializeField] 직렬화 : 이를 이용하면 Inspector창에 관련 변수가 나오게 되고 그곳에서 값을 정해줄 수 있습니다. 스크립트보다 Inspector에서 정한 값이 우선순위가 높기 때문에 Inspector 값대로 동작합니다. 이는 리스트(List)를 다룰 때 자주 사용합니다.
public class ItemManager : MonoBehaviour
{
//[SerializeField] 직렬화
//private으로 선언된 변수들은 Inspector에 표시가 안됨.
//[SerializeField]라는 어트리뷰트를 달면 인스펙터에 표시가 됨.
//<중요!>직렬화를 해서 Inspector에 나오게 하면, Inspector에서 값을 정해줄 수 있음.
//스크립트보다 Inspector의 값이 우선순위가 높아 Inspector 값대로 동작
[SerializeField] private GameObject healItem = null;
[SerializeField] private GameObject powerItem = null;
[SerializeField] private GameObject speedItem = null;
[SerializeField] private List<GameObject> healItemList = null;
[SerializeField] private List<GameObject> powerItemList = null;
[SerializeField] private List<GameObject> speedItemList = null;
private void Awake()
{
healItemList = new List<GameObject>();
powerItemList = new List<GameObject>();
speedItemList = new List<GameObject>();
}
}
주석에 설명을 추가했습니다. private를 사용하면 Inspector 창에 나타나지 않습니다. 위는 다룰 게임 오브젝트 heal, power, speedItem 3개와 그 리스트 3개를 직렬화로 선언합니다. 그리고 Awake함수로 프로젝트가 시작하자마자 리스트 3개에 새로운 동적 공간을 할당해 줍니다. 이후 밑에서는 3개의 리스트를 자세히 다루는 코드와 함께 설명드리겠습니다.
- Instantiate(gameObject, position, rotation) : 특정 오브젝트를 어느 position, 어느 각도를 다룰 것인지를 다룹니다. 이는 랜덤 위치를 다룰 때 주로 사용됩니다.
- Random.Range: 랜덤 한 위치를 다룰 때 사용하는 코드입니다. AimLab과 같은 랜덤 위치에 오브젝트를 소환하는 게임에 사용되는 코드입니다. 어떠한 오브젝트를 랜덤한 위치에 소환할 건지를 다룹니다.
for(int i = 0; i < 5; ++i)
{
Vector3 randomPos = new Vector3(Random.Range(-9, 9), 0, Random.Range(-9, 9));
GameObject pgo = Instantiate(powerItem, randomPos, Quaternion.identity);
powerItemList.Add(pgo);
}
위 코드를 해석하면 이러합니다.
- 5번 반복하는 Vector3 좌표계를 가진 randomPos 변수는 x범위 -9 ~ 9, y는 0으로 고정, z범위 -9 ~ 9까지의 좌표를 가진다.
- GameObject pgo라는 변수는 powerItem이라는 오브젝트를 randomPos 변수에 위치할 것이고 각도는 고정할 것이다.
- powerItemList에 pgo를 추가한다.
Awake에서 동적 할당한 powerItemList에 pgo 변수를 채워 넣습니다.
- Interface: 일종의 약속이라고 생각하면 편합니다. abstract처럼 함수의 이름과 반환형만 정의가 가능합니다. 그리고 Interface를 상속받는 어떤 클래스들은 무조건! 그 함수를 구현하고 다뤄야 합니다.
//IDestroyable.cs Scripts
public interface IDestroyable
{
public void Destroy();
}
//////////////////////////////////////////////////////////
//PowerItem.cs Scripts
public class PowerItem02 : MonoBehaviour, IDestroyable //상속
{
public void Destroy()
{
Destroy(this.gameObject);
}
}
Destroy를 다루는 Interface인 IDestroyalbe를 PowerItem 스크립트 내의 클래스에서 IDestroyable을 상속하니 Destroy함수를 무조건 다뤄야 합니다. 그렇지 않으면 오류가 발생합니다. 코드 해석은 이 오브젝트를 삭제하겠다는 뜻입니다. 여기서 MonoBehaviour 상속은 gameObject를 다루기 위한 상속문입니다.
'유니티(Unity) 프로그래밍' 카테고리의 다른 글
유니티3D 아날로그 시계 (0) | 2024.09.19 |
---|---|
Unity3D 추격2 (1) | 2024.09.18 |
Unity3D 추격 (1) | 2024.09.12 |
Unity3D에서의 상속 (1) | 2024.09.04 |
유니티(Unity) Component제어 (1) | 2024.09.02 |