TIL

2023/12/13 TIL

미역제자 2023. 12. 13. 22:35

오늘은 사진을 깜빡해서 이걸로 대체


어제 저녁부터 계속 고민했던 부분인 인벤토리에서 "아이템 선택시 확인창 -> 확인선택 -> 아이템 장착 아이콘 활성화"로 넘어가는 부분을 오늘 해결했다.

 

-구상 1

처음 구상은 다음과 같았다. 

  1. 인벤토리의 아이템을 클릭하면
  2. 그 아이템에 연결되어 있던 스크립트(1)에서
  3. 확인창의 스크립트(2)로 넘어갔다가,
  4. 확인창의 Yes 버튼을 누르면
  5. 다시 아이템에 연결되었던 스크립트로 돌아와서
  6. 그 스크립트의 "아이템 장착 아이콘 활성화 메서드"를 작동시키는  순서였다.
더보기

구상 1

스크립트 1 

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

public class EquipItem : MonoBehaviour
{
    [SerializeField] private GameObject EquipCheckPanel;
    private InventoryManager inventoryManager;
    private bool ItemEquip;
    private GameObject Item;
    private void Start()
    {
        inventoryManager = InventoryManager.instance;

    }
    public void Equip()
    {
        Item = transform.Find("IsEquip").gameObject;
        EquipCheckPanel.SetActive(true);

    }
    public void EquipIconOn()
    {
        if (Item != null)
        {
            if (Item.activeSelf == true)
            {
                Debug.Log("Equip아이콘을 뺌");
                Item.SetActive(false);
            }
            else
            {
                Debug.Log("Equip아이콘을 킴");
                Item.SetActive(true);
            }
        }
        else {Debug.Log("아이템 장착여부 아이콘이 없습니다.");};
    }
}

 

 스크립트 2

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

public class EquipCheck : MonoBehaviour
{
    //[SerializeField] private Button checkBtn;
    [SerializeField] private GameObject popup;
    EquipItem equipItem;

    private void Awake()
    {
        equipItem = new EquipItem();
    }
    public void ClickYes()
    {
        popup.SetActive(false);
        equipItem.EquipIconOn();
    }
    public void ClickNo()
    {
        popup.SetActive(false);
    }

}

하지만 equipItem을 불러오는 과정 자체가 문제였고 구상을 바꿔보았다.

 

- 구상2

인벤토리 아이템 버튼을 배열로 만든 후 배열의 Index번호를 확인창으로 가져와서 작동시키도록 만들어보았다.

하지만 중간에 코드를 끼워맞추다가 코드가 이상해져서인지 12개의 아이템 중 마지막 아이템에만 아이콘이 붙었다.

 

더보기

구상 2

스크립트 1 

using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;

public class EquipItem : MonoBehaviour
{
    [SerializeField] private GameObject EquipCheckPanel;
    private bool ItemEquip;
    private string thisName;
    public int numbering;

    public void Equip()
    {
        thisName = this.gameObject.name;
        string result = Regex.Replace(thisName, @"[^0-9]", "");
        numbering = int.Parse(result);
        EquipCheckPanel.SetActive(true);
    }

    public void EquipIconOn()
    {
        GameObject Item = transform.Find("IsEquip").gameObject;
        if (Item != null)
        {
            if (Item.activeSelf == true)
            {
                Debug.Log("Equip 아이콘을 뺌");
                Item.SetActive(false);
            }
            else
            {
                Debug.Log("Equip 아이콘을 킴");
                Item.SetActive(true);
            }
        }
        else
        {
            Debug.Log("아이템 장착여부 아이콘이 없습니다.");
        }
    }

 

스크립트 2

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

public class EquipCheck : MonoBehaviour
{
    [SerializeField] private GameObject popup;
    private EquipItem[] equipItems;

    private void Awake()
    {
        // EquipItem을 상속받는 모든 버튼을 관리하는 게임 오브젝트를 생성합니다.
        equipItems = GameObject.FindObjectsOfType<EquipItem>();
    }

    public void ClickYes()
    {
        popup.SetActive(false);

        // 현재 선택된 버튼에 대한 처리를 합니다.
        foreach (EquipItem equipItem in equipItems)
        {
            int index = equipItem.numbering;
            equipItems[index].EquipIconOn();            
        }
    }

    public void ClickNo()
    {
        popup.SetActive(false);
    }
}

 

 

 

그 후로도 PlayerPrefs로 인덱스를 전달해 본다던가, 일일히 배열을 만들어볼까 도 생각해보았지만 마땅한 방법이 떠오르지 않았다. 그래서 튜터님을 찾아갔다.

 

PlayerPrefs는 이런 로직을 만들기에는 좀 무거운 함수라고 하시며 다른 방법을 추천해주었다.

onClick이라는 방법을 사용한 로직이였다.

코드는 아래와 같다.

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

public class EquipItem : MonoBehaviour
{
    [SerializeField] private GameObject EquipCheckPanel;
    [SerializeField] private GameObject UnEquipCheckPanel;
    private GameObject Item;
    private void Awake()
    {
        Item = transform.Find("IsEquip").gameObject;
    }
    public void Equip()
    {
        if (Item != null)
        {
            EquipCheckPanel.GetComponent<PopUpControl>().Yes.onClick.RemoveAllListeners();
            UnEquipCheckPanel.GetComponent<PopUpControl>().Yes.onClick.RemoveAllListeners();
            if (Item.activeSelf == true) //끄기
            {
                UnEquipCheckPanel.GetComponent<PopUpControl>().Yes.onClick.AddListener(EquipIconOff);
                UnEquipCheckPanel.SetActive(true);
            }
            else
            {
                EquipCheckPanel.GetComponent<PopUpControl>().Yes.onClick.AddListener(EquipIconOn);
                EquipCheckPanel.SetActive(true);
            }
            
        }
    }

    public void EquipIconOff()
    {
        Item.SetActive(false);
    }
    public void EquipIconOn()
    {
        Item.SetActive(true);
    }
}

 

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

public class PopUpControl : MonoBehaviour
{
    [SerializeField] private GameObject popup;
    public Button Yes;

    public void ClickBtn()
    {
        popup.SetActive(false);
    }
}

 

잘 작동되는걸 확인할 수 있었다.

'TIL' 카테고리의 다른 글

2023/12/15 TI  (0) 2023.12.15
2023/12/14 TIL (ScriptableObject / 정규표현식)  (0) 2023.12.14
2023/12/12 TI  (1) 2023.12.12
2023/12/11 TIL  (0) 2023.12.11
2023/12/08 TI  (0) 2023.12.08