ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RPG 듀토리얼 16. Store buy and sell
    유니티 프로젝트/RPG 듀토리얼

    안녕하세요!!

     

    날씨가 따뜻해지다가 다시 추워지다가.. 오락가락합니다.

     

    다들 감기 조심하셔야 할 듯합니다 ㅜㅜ (겉옷 꼭 챙겨 다니세요!)

     


     

    오늘은 상점 팝업 기능까지 마쳤으니

     

    상점에 있는 아이템을 구매 및 판매하는 부분을 작업할 예정입니다.

     


    상점에 있는 물건들(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초

    영상을 보시며 오늘 작업은 마무리 하겠습니다.

     

     

    몸이 으스스한 게.. 영 상태가... 

     

    다들 감기 조심하시고..!!

     

    오늘도 감사합니다!!!

    댓글

김효겸 / Tel. 010-7735-0580 / E-mail. dollzzang2@hanmail.net