이번 포스팅은 #13-1 유니티 아이템 줍기(써클 콜라이더)에 이어 진행하도록 하겠습니다.
포스팅은 유니티 2D 게임 개발(게임 개발 프로그래밍)에 나온 예제로 진행합니다.
#13-1 유니티 아이템 줍기(써클 콜라이더)링크는 아래에 첨부하겠습니다.
Scriptable Object(스크립터블 오브젝트)
Scirptable Object는 스크립팅 가능한 오브젝트로 C# 스크립트로 정의하고 에셋 메뉴를 통해 생성합니다.
유니티에 에셋으로 저장하는 재사용 가능한 데이터 구조라고 생각할 수 있습니다.
1. 스크립터블 오브젝트는 에셋의 인스턴스를 가리키는 참조를 저장해놓고 사용하면 메모리 사용량을 줄일 수 있습니다.
매번 사용할 때 오브젝트의 모든 값을 복사 하지 않으므로 메모리 사용량이 늘지 않습니다.
2. pluggable (착탈식) 데이터 집합을 미리 정의합니다.
"Item" 이라는 Scriptable Object를 만들겠습니다.
먼저 Item 스크립트(C#)을 만들겠습니다.
1. Assets > Scripts 폴더에 스크립트(C#)와 스크립터블 오브젝트를 저장할 폴더를 생성하였습니다.
2. Assets > Scriptes > Scriptable Objects 폴더에 Item 스크립트를 생성하였습니다.
Item 스크립트(C#)의 전체코드입니다.
using UnityEngine;
[CreateAssetMenu(menuName = "Item")]
public class Item : ScriptableObject
{
public string objectName;
public Sprite sprite;
public int quantity;
public bool stackable;
public enum ItemType
{
COIN,
HEALTH
}
public ItemType itemType;
}
코드를 살펴 보도록 하겠습니다.
[CreateAssetMenu(menuName = "Item")]
아래의 사진처럼 이 코드는 생성 메뉴안에 하위 메뉴를 만들어 줍니다.
Project창에서 마우스 오른쪽 클릭하여 스크립터블 오브젝트인 Item의 인스턴스를 만들 수 있습니다.
public class Item : ScriptableObject
{
}
Item 클래스는 그동안 보았던 MonoBehaviour이 아닌 ScriptableObject를 상속 받고 있습니다.
MonoBehaviour 클래스를 상속 받지 않고 있기 때문에 Start(), Update() 메서드를 사용할 수 없습니다.
사실 스크립터블 오브젝트는 데이터를 저장하는 역할이기 때문에 Start(), Update() 메서드를 사용할 필요가 없습니다.
같은 이유로 게임 오브젝트에 추가할 수 없습니다.
따라서 MonoBehaviour 클래스를 상속한 스크립트 안에 스크립터블 오브젝트의 참조를 만들어 사용할 것입니다.
Item 클래스 안에 코드를 보겠습니다.
public string objectName;
이름이나 내용등 다양한 목적으로 사용할 수 있습니다.
public Sprite sprite;
게임에 표시할 수 있는 아이템의 스프라이트를 가리키는 참조를 저장합니다.
public int quantity;
아이템의 수량을 기록합니다.
public bool stackable;
예제에서는 아이템이 stackable 상태인지 나타냅니다.
동시에 동일한 위치에 겹치게 쌓아둘 수 있고 플레이와 동시에 상호작용할 수 있는 동일한 아이템들의 사본을 표현하는 용어로 stackable을 사용하였습니다.
public enum ItemType
{
COIN,
HEALTH
}
아이템의 종류를 나타내는 열거형 상수 정의입니다.
게임에 다양한 종류의 동전이 있을 수 있지만 모두 COIN이라는 ItemType으로 분류합니다.
public ItemType itemType;
위에서 만든 ItemType 열거 형식을 사용합니다. itemType이라는 속성을 만듭니다.
스크립트(C#)를 저장합니다.
지금까지 Scriptable Obejct(스크립터블 오브젝트)의 속성에 대하여 만들었습니다.
이제 Scriptable Obejct(스크립터블 오브젝트)를 만들어 보도록 하겠습니다.
Project 창 > Assets > Scripts > Scriptable Objects 폴더에서 마우스 오른쪽 클릭 > Create > Item 을 선택하여 스크립터블 오브젝트를 생성합니다.
1. 방금 생성한 스크립터블 오브젝트의 이름을 "Coin"으로 변경해줍니다.
2. Coin 오브젝트(Scriptable Object)의 속성을 사진과 같이 설정합니다.
Object Name : coin
Sprite : 해당 오브젝트를 표현할 수 있는 스프라이트
Quantity : 0
Stackable : 체크
ItemType : COIN
현재 스크립터블 오브젝트는 MonoBaviour 클래스를 상속 받고 있지 않으므로 게임 오브젝트에 추가할 수 없습니다.
게임오브젝트에 추가할 수 있게 하기 위하여 MonoBeaviour 클래스를 상속 받는 Consumable 스크립트를 생성하겠습니다.
Assets > Scripts > MonoBehaviour 폴더에 Consumable 스크립트를 저장하였습니다.
Consumable 스크립트의 전체코드입니다.
using UnityEngine;
public class Consumable : MonoBehaviour
{
public Item item;
}
스크립트를 저장하겠습니다.
스크립트의 코드를 살펴보면
Consumable 클래스는 MonoBehaviour 클래스를 상속 받고 있습니다.
public 으로 선언하여 다른 스크립트에서도 사용할 수 있습니다.
item속성에 Item을 대입합니다.
CoinObject에 추가하겠습니다.
1. CoinObject에 방금 만든 Consumable(스크립트)컴포넌트를 추가합니다.
2. Consumable(스크립트) 컴포넌트의 Item 속성에 Coin(스크립터블 오브젝트)를 추가합니다.
Assets > Prefabs 폴더에 CoinObject를 드래그 앤 드롭하여 프리팹으로 만들겠습니다.
다음 포스팅에는 다음 아이템을 만들고 Player 클래스의 OnTriggerEnter2D 메서드를 수정하겠습니다.
마지막으로 Ctrl + S를 눌러 Scene을 저장합니다!
감사합니다! :)
'유니티2D' 카테고리의 다른 글
#14-1 유니티 체력바 만들기(캔버스, UI, 텍스트) (0) | 2020.12.14 |
---|---|
#13-3 유니티 아이템 (OnTriggerEnter2D) (0) | 2020.12.12 |
#13-1 유니티 아이템 줍기(써클 콜라이더) (0) | 2020.12.10 |
#12 유니티 기초 종합, 클래스 구현 (0) | 2020.12.08 |
#11-3 유니티 시네머신 안정화, 마무리 작업 (0) | 2020.12.06 |