본문 바로가기
유니티/고라니TV

[유니티] 하스스톤 유니티 튜토리얼 #5 - 아이템 뽑기

by HHack 2024. 1. 24.
반응형

본 게시글은 고라니TV님의 하스스톤 유니티 튜토리얼을 보고 만든 게시물입니다. 빠른 코딩을 원하시는 분들은 아래 링크를 보고 클론코딩 하시면 됩니다.

https://youtube.com/playlist?list=PL3KKSXoBRRW0RVfemPWsfg9uLIjxyRHjN&feature=shared

 

유니티 하스스톤

 

www.youtube.com

 

5장 아이템 버퍼에서 아이템 뽑기

5.1 카드 매니저

5.1.1 카드 매니저 오브젝트 및 스크립트 생성

 Hierarchy 창에서 CreateEmpty 클릭, 이름을 CardManager로 변경

Inspector창에서 Transform 오른쪽 버튼 클릭 -> Reset

Scripts 폴더에서 마우스 오른쪽 버튼 클릭 -> Create -> C# Script 클릭, Script 이름을 CardManager로 변경

CardManager  스크립트를 CardManager 오브젝트에 드래그 앤 드롭하여 적용시킵니다.

CardManager  스크립트 코드 작성

⑥ CardManager 스크립트의 ItemSO 변수에 ItemSO 오브젝트를 드래그 앤 드롭하여 적용시킨다.

① ~ ④ CardManager 생성
⑥ ItemSO 드래그 앤 드롭

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CardManager : MonoBehaviour {
    public static CardManager Inst { get; private set; } // 매니저는 하나만 존재하기 때문에 싱글톤으로 선언.
    void Awake() => Inst = this;

    [SerializeField] ItemSO itemSO;

    List<Item> itemBuffer;

    void SetupItemBuffer() {
        itemBuffer = new List<Item>();
        for(int i = 0; i < itemSO.items.Length; i++) { // item 배열에 담겨있는 10개의 카드
            Item item = itemSO.items[i]; // 10개의 카드를 가져온다.
            for(int j = 0; j < item.percent; j++) { // 각각의 카드만큼의 퍼센트 만큼 반복시킨다
                itemBuffer.Add(item); // 총 100장의 카드가 들어가며 각가의 카드 갯수는 각 카드의 퍼센트만큼 들어간다.
            }
        }

        for(int i = 0; i < itemBuffer.Count; i++) { // 순서대로 들어가있는 카드를 랜덤하게 섞어준다.
            int rand = Random.Range(i, itemBuffer.Count);
            Item temp = itemBuffer[i];
            itemBuffer[i] = itemBuffer[rand];
            itemBuffer[rand] = temp;
        }
    }

    void Start() {
        SetupItemBuffer();
    }
}

5.1.2 카드 매니저 아이템 버퍼 확인하기

플레이 버튼을 누른 후 Inspector 창 -> 오른쪽 위 점 3개 클릭 -> Debug 클릭

 Inspector창 -> Card Manager 스크립트 -> ItemBuffer를 확인

디버그로 버퍼에 들어간 카드 확인

5.2 카드 뽑기 기능 구현

현재 카드를 버퍼에 넣고 카드를 랜덤하게 생성하는 기능까진 구현했습니다. 이번엔 카드를 뽑는 기능을 CardManager에 추가해보도록 하겠습니다.

5.2.1 PopItem() 메서드 구현

CardManager  스크립트 코드에 PopItem() 메서드를 추가하여 수정합니다.

② 플레이하여 키패드 1번을 눌러 카드가 잘 뽑히는지 Console을 확인합니다.

(100장 이상 뽑아 다시 자동으로 카드가 버퍼에 채워지는지 확인합니다.)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CardManager : MonoBehaviour {
    public static CardManager Inst { get; private set; } // 매니저는 하나만 존재하기 때문에 싱글톤으로 선언.
    void Awake() => Inst = this;

    [SerializeField] ItemSO itemSO;

    List<Item> itemBuffer;

    public Item PopItem() {
        if (itemBuffer.Count == 0) { // 만약 카드를 다 뽑아 버퍼가 가지고 있는 카드의 갯수가 0개가 되면
            SetupItemBuffer(); // 다시 새로 버퍼에 100장의 카드를 셋팅
        }

        Item item = itemBuffer[0]; // 버퍼 맨 앞에 있는 카드를 뽑는다.
        itemBuffer.RemoveAt(0); // 뽑은 카드를 버퍼에서 지운다.
        return item; // 카드를 뽑아낸다.
    }

    void SetupItemBuffer() {
        ...
    }

    void Start() {
        ...
    }

    void Update() {
        if(Input.GetKeyDown(KeyCode.Keypad1)) { // 만약 1번 키를 누르면
            print(PopItem().name);
        }
    }
}

카드가 잘 뽑히는지 확인

 

다음 시간엔 Card 오브젝트를 스폰을 하기 위한 Card 스크립트를 작성해보도록 하겠습니다.

반응형