유니티 간단한 인벤토리 만들어보기

2020. 7. 14. 17:39유니티실습

반응형
728x170

안녕하세요 유니티 비기너입니다.

이번 시간에는 간단한 인벤토리를 만드는 방법에 대해 알아보겠습니다.

 

테스트 화면

 

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);
    }
}

아이템의 사용효과를 기술하는 곳입니다.

 

해당 부분은 자유롭게 편집하셔서 다양한 효과를 표현하시면 됩니다.

 

이상으로 간단한 인벤토리를 구현해봤습니다.

지금까지 읽어주셔서 감사합니다.

 

 

반응형
그리드형