어제 저녁부터 계속 고민했던 부분인 인벤토리에서 "아이템 선택시 확인창 -> 확인선택 -> 아이템 장착 아이콘 활성화"로 넘어가는 부분을 오늘 해결했다.
-구상 1
처음 구상은 다음과 같았다.
- 인벤토리의 아이템을 클릭하면
- 그 아이템에 연결되어 있던 스크립트(1)에서
- 확인창의 스크립트(2)로 넘어갔다가,
- 확인창의 Yes 버튼을 누르면
- 다시 아이템에 연결되었던 스크립트로 돌아와서
- 그 스크립트의 "아이템 장착 아이콘 활성화 메서드"를 작동시키는 순서였다.
더보기
구상 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 |