VioletaBabel

50. 상점 만들기(2) 본문

BCA/6. Unity RPG 따라하기
50. 상점 만들기(2)
Beabletoet 2018. 6. 27. 15:50

캔버스에 상점 창을 ShopDialog라고 만들고 평소엔 꺼둔다.

그리고 K를 누르면 ShopDialog를 active toggle한다.

ShopUI.cs의 Start에서 Dictionary<int, ShopItemData> shopList를 만든다.

그리고 mShopList를 shopList에 넣어주고 Image를 만들어 의 sprite를 바꿔준다.


리스트에 있는 아이템은 창에 정렬해서 나타나게 한다.


여전히 Start()에서


// https://docs.unity3d.com/kr/530/ScriptReference/EventSystems.EventTrigger.html 

var trigger = imageObject.AddComponent<EventTrigger>(); //이미지에 이벤트트리거를 넣고 꺼낸 후


EventTrigger.Entry entry = new EventTrigger.Entry(); // 이벤트의 진입점을 만듦

entry.eventID = EventTriggerType.PointerEnter; //PointerEnter는 마우스 관련 이벤트.

entry.callback.AddListener((data) => { OnPointerEnterDelegate((PointerEventData)data);});

trigger.triggers.Add(entry);


entry = new EventTrigger.Entry(); // 이벤트의 진입점을 만듦

entry.eventID = EventTriggerType.PointerExit; //PointerEnter는 마우스 관련 이벤트.

entry.callback.AddListener((data) => { OnPointerEnterDelegate((PointerEventData)data);}); //data는 람다식에서의 AddListener인수를 사용하는거라고 하시는데 이름이 바뀌어도 같이 괄호 안의 data를 다 해당 이름으로 바꾸면 그대로 동작할거라고 하심.

trigger.triggers.Add(entry); //따로 변수를 저장해두고 있다가 Remove하면 진입점을 다시 없앨 수도 있다. 또는 아마 trigger 자체에서 eventID를 검색해 해당하는 애를 지우는 방법이 있을지도. 나중에 해보자. 근데 setactive로 끄거나 오브젝트 자체를 없애도 이걸 remove하는 건 잘 안쓴다고 하셨다.


를 넣고, 그 후 아래에 있는 별도의 함수를 만든다.


public void OnPointerEnterDelegate(PointerEventData data)//함수이름은 바꿔도 된다고 하심.

{//툴팁을 만들기위해 PointerEnter를!

string name = data.PointerCurrentRaycast().gameObject.name;//PointerCurrentRaycast는 PointerEventData에만 들어있다.

//툴팁 띄우기

}


이걸 이용해 툴팁을 띄운다.

다만 포인터가 나갔을 때는 툴팁을 꺼야한다.


public void OnPointerExitDelegate(PointerEventData data)

{

//툴팁 끄기

string name = data.PointerCurrentRaycast().gameObject.name;

}


그리고 하이에라키의 해당 캔버스에서 UI-Image를 만든다. 툴팁으로 쓸 것.

그 후 그 자식으로 Text와 이미지를 붙인다.


ToolTip.cs를 만들고 툴팁으로 만든 Image에 넣어준다.

그리고 ToolTip.cs에 ItemName이라고 만든 후 자식으로 넣은 Text를, Thumbnail을 만든 후 자식으로 넣은 Image를 넣어준다.


그 다음 위의 온포인터엔터델리게이트 함수에선 툴팁을 액티브트루, 온포인터익시트델리게이트에선 액티브펄스 해준다.

그리고 온포인터엔터델리게이트할 때 툴팁 자식의 Text 내용을 교체해주고 썸네일 Image도 바꿔준다.



===

돈도 추가하자. 아이템 가격이 필요.

전에 만든 csv 파일을 스프레드시트에서 수정해 가격도 추가하고 다시 csv로 빼준다.

그리고 아이템 데이터 뽑아오는 곳에도 가격을 넣어주고 아이템 데이터 관련된 부분에도 다 cost라고 해서 넣어주자.


플레이어 데이터에도 돈을 약간 넣어준다. 그럼 상점에서 뭘 살 수 있겄지 뭐.

세이브할 때 돈도 저장해주고, 로드할 때도 불러주자. (로드할 때 그동안 없던 것을 추가한다면 확실히 생기기 전까지는 if로 검사해주자. 있으면 불러오고 없으면 초기값을 넣어주면 될 터이다.)


===


이제 아이템을 선택하면, 어떤 것을 선택했는지 알기 위한 테두리 이미지를 하나 넣는다.

그리고 선택 후 구매 버튼을 누르면 구매되게 할 것이다.


OnPointerClickDelegate를 만들고 선택 이미지를 클릭한 아이템 위치에 보내준다.

그리고 버튼을 하나 만들어 OnClick에 넣어주고 OnBuyItem()함수를 만들어 구매를 하게 하자.



Monobehavier를 상속받은 아이는 실체가 없으면 유지가 불가. 만들어도 실체가 없으면 null로 바뀌게 된다.

그래서 상속받지 않은 ShopItemDataRaw와 상속받은 ShopItemData를 만들고, 기존의 ShopItemData는 다 ShopItemDataRaw로 바꿔준다. 그리고 아이템의 가격, 데이터 등이 필요하기에 AddComponent를 이용해 ShopItemData를 AddComponent하고 아이템의 데이터를 넣고 관여할 것. 실체가 생길 시기에 위에 적었듯이 ShopItemData를 AddComponent해서 컴포넌트화 시킴.


OnBuyItem에서 ShopItemDataRaw에 선택한 아이템에 대한 정보를 저장하고, 돈을 가격만큼 감소시킨다.

구매한 아이템을 인벤토리에 넣는건 내일!

Comments