Date: 2020.10.03 Updated: 2020.10.03 Show 카테고리: Unity Lesson 3 태그: Unity Game Engine 인프런에 있는 케이디님의 [유니티 3D] 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀 Chapter 5. 인벤토리아이템 획득🚖 바위 아이템 프리팹바위, 나무 같은 오브젝트를 파괴하면 생성되는 아이템을 만들자. 나무는 통나무를 추후 아이템으로 삼으면 되지만 바위는 파괴 후 생성되는게 없기 때문에 바위의 경우 아이템으로 주울 수 있는 프리팹을 생성하자. 바위 아이템 프리팹 만들기
📜Item.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName = "New Item", menuName = "New Item/item")] public class Item : ScriptableObject // 게임 오브젝트에 붙일 필요 X { public enum ItemType // 아이템 유형 { Equipment, Used, Ingredient, ETC, } public string itemName; // 아이템의 이름 public ItemType itemType; // 아이템 유형 public Sprite itemImage; // 아이템의 이미지(인벤 토리 안에서 띄울) public GameObject itemPrefab; // 아이템의 프리팹 (아이템 생성시 프리팹으로 찍어냄) public string weaponType; // 무기 유형 }
ScriptableObject
각각의 좀비 오브젝트들은 체력, 시야, 속도 값이 모두 같다고 가정해보자. 좀비 프리팹으로 좀비 오브젝트 3개를 찍어내면 동일한 이 체력, 시야, 속도 값이 3 개나 사본으로 생성되는 셈이다. 어차피 동일한 데이터를 사용하니까 체력, 시야, 속도 값을 한군데 만들어두고 이를 인스턴스들이 이를 참조하게 만들면 메모리를 더 아낄 수 있다. 모든 좀비들이 가지는 동일한 데이터들을 ScriptableObject 로서 한 군데에 에셋으로서 모아 관리하고 생성되는 오브젝트들이 이 동일한 에셋을 참조하면 메모리를 효율적으로 쓸 수 있게 된다. 예를 들어 ScriptableObject 을 상속 받는 ZombieData 클래스를 만들고 이 곳에 좀비가 가지는 데이터들을 모아 두고 이를 에셋으로 생성하여서 좀비 오브젝트들이 이 곳을 참조하게 하면 된다!
[CreateAssetMenu(fileName = "New Item", menuName = "New Item/item")] public class Item : ScriptableObject { }
에셋에서 우클 - Create 에 New Item/item이 생긴 것을 볼 수 있다. 이제 New Item/item 메뉴가 생겨 이것으로 📜Item.cs을 ScriptableObject 타입의 에셋으로서 생성할 수 있게 됨. 에셋으로 생성해주면 fileName으로 설정했었던 “New Item” 이름을 기본적으로 하여 생성 된다. 📜Item.cs 에서 정의한 데이터 속성들을 확인할 수 있다. 모든 바위 아이템들이 공통적으로 같은 값을 가지는 데이터 에셋으로서 사용하기 위하여 이름을 Rock 으로 바꾸고 바위 아이템 값에 맞는 데이터들을 할당해주었다. 이제 이 Rock ScriptableObject 에셋을 참조하는 모든 오브젝트는 동일한 이 Rock ScriptableObject 에셋 한 군데를 참조하게 되는 것이고, 이에 따라 모두 동일한 데이터 값을 가지게 된다. 모든 바위 아이템들은 Item Name이 Rock 이며 Item Type이 Ingredient 가 될 것이다.
📜ItemPickUp.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemPickUp : MonoBehaviour { public Item item; } 📜Item.cs ScriptableObject 에셋을 참조할 수 있는 용도의 스크립트를 만들었다. 📜Item.cs 자체로는 오브젝트에 컴포넌트로서 붙일 수가 없기 때문에! 이렇게 📜Item.cs 을 할당 받을 수 있는 컴포넌트를 만들었다. 앞으로 아이템들마다 📜ItemPickUp.cs을 붙여 알맞는 📜Item.cs 타입의 데이터 에셋을 📜ItemPickUp.cs의 item에 할당해줄 것이다. item에 Rock ScriptableObject 에셋을 할당 해준다. 모든 바위 아이템 오브젝트들이 공통적으로 참조하게 될 데이터 에셋. 🚖 아이템 주울 수 있는 텍스트 띄우기 + 아이템 습득텍스트 UI
아이템을 주울 수 있는 상태가 되면 자동으로 위와 같은 텍스트 actionText가 활성화 되도록 한다. 위치 잡고 색상 흰색 가운데 정렬. 📜ActionController.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ActionController : MonoBehaviour { [SerializeField] private float range; // 아이템 습득이 가능한 최대 거리 private bool pickupActivated = false; // 아이템 습득 가능할시 True private RaycastHit hitInfo; // 충돌체 정보 저장 [SerializeField] private LayerMask layerMask; // 특정 레이어를 가진 오브젝트에 대해서만 습득할 수 있어야 한다. [SerializeField] private Text actionText; // 행동을 보여 줄 텍스트 void Update() { CheckItem(); TryAction(); } private void TryAction() { if(Input.GetKeyDown(KeyCode.E)) { CheckItem(); CanPickUp(); } } private void CheckItem() { if (Physics.Raycast(transform.position, transform.forward, out hitInfo, range, layerMask)) { if (hitInfo.transform.tag == "Item") { ItemInfoAppear(); } } else ItemInfoDisappear(); } private void ItemInfoAppear() { pickupActivated = true; actionText.gameObject.SetActive(true); actionText.text = hitInfo.transform.GetComponent<ItemPickUp>().item.itemName + " 획득 " + "<color=yellow>" + "(E)" + "</color>"; } private void ItemInfoDisappear() { pickupActivated = false; actionText.gameObject.SetActive(false); } private void CanPickUp() { if(pickupActivated) { if(hitInfo.transform != null) { Debug.Log(hitInfo.transform.GetComponent<ItemPickUp>().item.itemName + " 획득 했습니다."); // 인벤토리 넣기 Destroy(hitInfo.transform.gameObject); ItemInfoDisappear(); } } } }
Main Camera 설정
Culling Mask 에 Item 레이어를 추가로 등록해주어야 Item 레이어를 가진 아이템 오브젝트들도 렌더링 되어 게임 화면에 그려질 수 있다!! 해주지 않으면 게임에 나오지 않는다.. 🚖 바위 깨면 아이템 생성📜Rock.cs[SerializeField] private GameObject go_rock_item_prefab; // 바위 파괴시 생성할 아이템 프리팹 [SerializeField] private int count; // 바위 파괴시 생성할 아이템 갯수 //... private void Destruction() { SoundManager.instance.PlaySE(destroy_Sound); col.enabled = false; for (int i = 0; i < count; i++) { Instantiate(go_rock_item_prefab, go_rock.transform.position, Quaternion.identity); } Destroy(go_rock); go_debris.SetActive(true); Destroy(go_debris, destroyTime); } 바위가 파괴되면 바위 아이템 프리팹을 count 갯수만큼 생성한다. go_rock_item_prefab, count 5 할당 바위가 깨지니 5 개의 아이템이 생성되고 아이템 주우라는 메세지가 뜨는 것을 확인할 수 있다. 아이템을 E키로 주우면 아이템이 파괴된다. 🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄 맨 위로 이동하기 Unity Lesson 3 카테고리 내 다른 글 보러가기 |