유니티(Unity) 프로그래밍

Unity3D에 유용한 기능들 (1)

게임첫걸음 2024. 9. 4. 17:59

이번 글은 Unity3D에서 유용하게 다루는 기능들을 정리해 보겠습니다.

  • Prefabs: 일종의 보관함으로 프로젝트에서 사용할 오브젝트 원본들을 보관하는 폴더입니다.

유니티 내 Project폴더 내의 Prefabs

Prefabs에 있는 오브젝트들을 Hierarchy에 뽑아 사용할 땐 클론(clone)의 형태로 사용됩니다. 클론 오브젝트들은 속성을 바꿔도 원본에는 영향을 끼치지 않습니다.

  • Tag: 오브젝트들의 큰 카테고리로 생각하면 됩니다. 활, 단검, 창 등의 오브젝트를 생성하고 이들을 같은 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);
}

위 코드를 해석하면 이러합니다.

  1. 5번 반복하는 Vector3 좌표계를 가진 randomPos 변수는 x범위 -9 ~ 9, y는 0으로 고정, z범위 -9 ~ 9까지의 좌표를 가진다.
  2. GameObject pgo라는 변수는 powerItem이라는 오브젝트를 randomPos 변수에 위치할 것이고 각도는 고정할 것이다.
  3. 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