안녕하세요 유니티 비기너입니다.
이번 시간에는 간단한 인벤토리를 만드는 방법에 대해 알아보겠습니다.
테스트 화면
1. 오브젝트 생성 그림과 같은 구조로 오브젝트를 생성합니다.
Inventory : Inventory 스크립트를 추가합니다.
※ 미리 지정된 규격의 인벤토리를 생성관리
Slot : Slot 스크립트, Image 컴포넌트를 추가합니다.
※ 획득한 아이템을 표시할 슬롯
CloseBtn : Image, Button 컴포넌트를 추가합니다.
※ 버튼 클릭 시 아이템을 제거하는 버튼 역할
Wood, Mushroom, Leaf, Flower : Image, BoxCollider2 D 컴포넌트, Item 스크립트 추가합니다.
※ 필드에 놓여있는 상호작용 할 아이템 역할
2. 프리팹 생성 (object 생성 후 project 창으로 drag)
Image와 Button을 포함하는 프리 팹입니다.
만들어진 프리 팹은 필드에 놓인 아이템을 먹었을 슬롯 칸에 생성되는 용도입니다.
3. 스크립트 작성
Inventory 스크립트
public class Inventory : MonoBehaviour
{
public bool[] fullCheck;
public GameObject[] slots;
}
인벤토리의 개수만큼 사이즈를 부여하고, Slot 오브젝트를 생성하고 드래그하여 할당합니다.
Item 스크립트
public class Item : MonoBehaviour
{
private Inventory inventory;
public GameObject itemObject;
private void Awake() {
inventory = GameObject.FindObjectOfType<Inventory>();
}
private void OnTriggerEnter2D(Collider2D col) {
if (col.tag == "Player") {
for (int i = 0; i < inventory.slots.Length; i++) {
if (inventory.fullCheck[i] == false) {
inventory.fullCheck[i] = true;
Instantiate(itemObject, inventory.slots[i].transform, false);
Destroy(gameObject);
break;
}
}
}
}
}
필드에 놓인 아이템은 Player어 tag를 가지고 있는 오브젝트와 충돌할 경우 이벤트가 발생하며
fullCheck의 true, false값을 통하여 해당 슬롯에 아이템이 있는지 없는지를 판별하고
슬롯에 프리 팹 아이템을 생성하고 파괴합니다.
※ 해당 스크립트는 wood, flower, Leaf, Mushroom 오브젝트에 할당하고 이전에 생성한 동일한 명칭의 프리팹 할당
Player 스크립트
public class Player : MonoBehaviour
{
public float speed;
private float horizontalMove;
private Inventory inventory;
private Animator anim;
private void Awake() {
anim = GetComponent<Animator>();
inventory = GetComponent<Inventory>();
}
void Update() {
horizontalMove = Input.GetAxisRaw("Horizontal") * speed;
anim.SetFloat("Walk", Mathf.Abs(horizontalMove));
}
private void FixedUpdate() {
PlayerMove();
}
private void PlayerMove() {
Vector3 rightMovement = Vector3.right * speed * Time.deltaTime * horizontalMove;
Vector3 heading = Quaternion.Euler(0, -90, 0) * rightMovement;
transform.forward = heading;
transform.position += rightMovement;
}
}
플레이어를 이동하기 위한 코드로 GetAxisRaw Horizontal을 이용하여 값을 가져와 좌우로 움직입니다.
※ Player오브젝트에 할당합니다.
Slot 스크립트
public class Slot : MonoBehaviour
{
public int i;
private Inventory inventory;
private void Awake() {
inventory = GameObject.FindObjectOfType<Inventory>();
}
private void Update() {
if(transform.childCount <= 0) {
inventory.fullCheck[i] = false;
}
}
public void RemoveItem() {
for (int idx = 0; idx < transform.childCount; idx++) {
Destroy(transform.GetChild(idx).gameObject);
}
}
}
ClostBtn은 RemoveItem함수와 연결시켜 int i의 위치한 슬롯의 자식 아이템을 전부 제거합니다.
i 값은 삭제된 슬롯의 FullCheck를 갱신할 때 어떤 슬롯인지를 구분 짓기 위한 변수입니다.
※ Slot오브젝트에 각각 할당합니다.
Mushroom 스크립트
public class Mushroom : MonoBehaviour
{
public GameObject effect;
private Transform player;
private void Awake() {
player = GameObject.FindObjectOfType<Player>().transform;
}
public void UseItem() {
Vector3 vpos = player.position;
vpos.y += 50f;
Instantiate(effect, vpos, Quaternion.identity, player);
Destroy(gameObject);
}
}
아이템의 사용효과를 기술하는 곳입니다.
해당 부분은 자유롭게 편집하셔서 다양한 효과를 표현하시면 됩니다.
이상으로 간단한 인벤토리를 구현해봤습니다.
지금까지 읽어주셔서 감사합니다.
'유니티실습' 카테고리의 다른 글
유니티 Tab 메뉴 만들어보기 (0) | 2020.07.17 |
---|---|
유니티 애드몹 광고 제한 및 처리방식 후기 (1) | 2020.07.15 |
유니티 스마트폰 기울기로 캐릭터 이동하기 (0) | 2020.07.13 |
유니티 2D 모델링 리깅 애니메이션 만들기 기초편 (0) | 2020.07.12 |
유니티 Damage Text 만들어보기 (0) | 2020.07.11 |