-
안녕하세요!!
날씨가 따뜻해지다가 다시 추워지다가.. 오락가락합니다.
다들 감기 조심하셔야 할 듯합니다 ㅜㅜ (겉옷 꼭 챙겨 다니세요!)
오늘은 상점 팝업 기능까지 마쳤으니
상점에 있는 아이템을 구매 및 판매하는 부분을 작업할 예정입니다.
상점에 있는 물건들(npc가 갖고 있는 물건)과
npc를 클릭하면 store창과 bag창이 팝업이 됩니다.
(닫기 버튼은 panel에 eventTrigger에 Pointer Down
을 사용하여 비활성화 되게 해 줬었습니다.)
아이템 정보 창이 활성화될 시에는 두 가지 조건이 있었습니다.
1. Bag 안에 있는 아이템일 때 클릭을 할 시
2. Store 안에 있는 아이템을 터치/클릭할 시
Item_Action 스크립트에서
가방에 있는지 체크할 inBag 불 변수와
상점에 있는지 체크할 inStore를 이용해
if문을 걸어 주었었습니다.
또한 inBag이 ture일 시에 (가방 안에 있을 시에)
Eqip (장착) / Release (해제) 버튼으로
아이템을 장착 및 해제를 할 수 있었습니다.
EqipBtn과 ReleaseBtn을 Ctrl + D로 복제하여
구매 버튼과 판매 버튼을 만들어 주었습니다.
Ctrl + d는 오브젝트도 복사가 가능하며
단순한 반복 작업의 속도를 단축시킬 수 있습니다.
이제 EqipBtn과 ReleaseBtn의 버튼들을 제어하는
ItemInfoFrame스크립트로 가서
Buy 버튼과 Sell 버튼을 제어해 줄 차례입니다.
기존의 EqipBtn과 ReleaseBtn은
(! Manager.instance.managerInven.storeFrame.activeSelf)으로
상점이 열려 있지 않을시의 조건문을 걸어 주었습니다.
(상점이 열려 있다면 EqipBtn과 ReleaseBtn 버튼이 아닌 Buy와 Sell 버튼을 동작해야 하기 위함입니다.)
위의 if문이 성립하지 않고
(Manager.instance.managerInven.storeFrame.activeSelf)이 성립한다면 들어올 코드입니다.
if문의 코드는 위와 비슷하지만! 부정 연산자로 ture/false을 나타냈습니다.
items.GetComponent <Item_Action>(). inStore) 조건 문으로
if상점이 열려 있으며 / inStore가 true 체크가 되어 있다면의 조건문이 성립할 땐
buyBtn을 활성화시켜줍니다.
반대로
(items.GetComponent <Item_Action>(). inBag &&! items.isEquip)
가방에 있다고 inBag이 true 체크가 되어 있으며 &&(그리고) 아이템을 장착하지 않았을 시입니다.
이땐 sellBtn을 활성화해줍니다.
(여기서 아이템을 장착하지 않았을 시의 조건문을 걸어준 이유는
아이템을 장착을 한 상태에서는 물건 판매가 안되게 하기 위함입니다.)
이 코드들은 ItemInfoFrame의 OnEnable(활성 화 시 매 실행) 함수에서 구현이 되어 있습니다.
즉, 아이템 정보 창이 뜨게 되면 각 버튼이 상황에 맞게 활성화/비활성화 가 됩니다.
이제 Buy버튼과 Sell 버튼을 동작시키는 스크립트를 보겠습니다.
새로운 Deal 스크립트를 생성해 주어서 관리를 해 주었습니다.
선언 변수들부터 보겠습니다.
slot_BagFrame : 가방 안의 슬롯들입니다.
(아이템 구매 시 이 슬롯들 중 비어있는 슬롯에 아이템이 생기게 합니다.)
(또한 슬롯이 비어있는지의 여부를 체크하기 위함입니다.)
gain_Text : 아이템 구매 시 시각적인 효과로 표시될 텍스트입니다.
notice_Text : 아이템 구매 시 비어있는 슬롯이 없거나,
혹은 골드가 없을 때 공지로 띄워줄 텍스트입니다.
코드로 바로 들어가겠습니다!!
Transform을 리턴 받을 slot 함수를 작성하여
slot_BagFrame (가방 안의 슬롯들)을 검사해 주는 기능입니다.
이 슬롯이 비어있지 않다고 판단을 하는 코드는
if(slot_BagFrame [i]. childCount == 0)로 사용했습니다.
childCount 가 0인지 검사한 이유는 간단합니다.
슬롯 안에 아이템이 존재할 시 슬롯의 자식으로 주어 지기에
0이라고 한다면 비어있는 슬롯으로 간주하는 코드입니다.
물건을 구매해주는 기능을 할 Buy 함수입니다.
간단히 살펴보자면
ManagerInven와 Items_Info을 제어하기 위해
변수를 성성 후 받아와 주는 모습이고.
(item.price < inven.gold)
조건문을 걸어 현재 갖고 있는 gold가
아이템의 가격보다 높을 시에 만 들어와 실행되도록 하였습니다.
Transform emptySlot = slot()로 반환된 비어있는 slot을 받아와 주었고
(emptySlot!= null) 조건문을 걸어 주어
slot의 반환된 값이 null이 아니라면 실행해 주었습니다.
(emptySlot!= null) 조건이 성립하면 실행될 코드는 간단합니다.
inven.gold -= item.price : 현재 골드에서 아이템 가격을 뺀 값을 누적시켜주며
Instantiate(item.gameObject, emptySlot) : Instantiate를 통해
아이템을 emptySlot(비어있는 슬롯)에 생성시켜 줍니다.
이후 구매 버튼을 눌렀을 시 발생할 코드이니
inBag = true / inStore = false로 가방에 있는지를 알려주었으며.
구매/판매 시 시각적인 효과로 알려줄 gain_Text를
값과 색을 조절해 SetActive를 통해 true(활성화)를 시켜 주었습니다.
반대로 (emptySlot!= null)의 조건이 성립이 안되어
(emptySlot!= null)이 아닐 시 에는
공지를 띄워줄 notice_Text는 text를 "Not enough space in bag!"의 문자열로 지정해 주어
활성화시켜주게 됩니다.
(item.price < inven.gold)
만일 아이템 가격보다 현재 갖고 있는 골드가 적을 시에는?
맨 아래 코드와 같이 notice_Text.text = "Not ENOUGH GOLD!"로 지정해 주며
활성화를 시켜주게 됩니다.
판매 버튼인 Sell 함수도 만들겠습니다.
Sell 함수는 간단합니다.
(sell) 판매 버튼을 누른다면 더 이상 그 오브젝트는 상호작용을 할 필요가 없으므로
Destroy를 이용해 파괴시켜주며
현재 갖고 있는 Gold와 시각화해줄 text를 조정해 활성화해주는 코드입니다.
01 : 15초
영상을 보시며 오늘 작업은 마무리 하겠습니다.
몸이 으스스한 게.. 영 상태가...
다들 감기 조심하시고..!!
오늘도 감사합니다!!!
'유니티 프로젝트 > RPG 듀토리얼' 카테고리의 다른 글
RPG 듀토리얼 17. BOSS!!! 02 / 02 (Return & Die) (0) 2022.05.01 RPG 듀토리얼 17. BOSS!!! 01 / 02 (Attack) (0) 2022.04.27 RPG 듀토리얼 15. Npc Store OpenStore (0) 2022.04.26 RPG 듀토리얼 14. Object Pool & item Gold (0) 2022.04.26 RPG 듀토리얼 13. player & NPC 상호작용 (0) 2022.04.25