현재
UI의 구조가
최상위 부모 | 부모 | 자식 | |
---|---|---|---|
UI_Base | UI_Scene | UI_GameScene | |
UI_Base | UI_Popup | UI_Shop | UI_SelectWeapon |
이런 구조이다.
그러면 UI_GameScene이든 UI_SelectWeapon이든 다 UI_Base상속을 받는다.
이까지 확인을 함.
UI_Base에서
멤버 변수로 new를 통하여 힙에 딕셔너리를 생성해준다.
UI_Base를 상속받는 객체가 생성이 된다면은
그러면 각기의 객체들은 다 이런 정보들을 가지고 있을 것이고.
자식들은 부모의 해당 딕셔너리에 접근해서 안에 데이터를 넣어주기만 하면된다.
Bind 함수자체를 (내가 커스텀함)
protected void Bind<T>(Define.UI ui, Type type) where T : UnityEngine.Object
{
string[] names = Enum.GetNames(type);
UnityEngine.Object[] objects = new UnityEngine.Object[names.Length];
for (int i = 0; i < names.Length; ++i)
{
if (typeof(T) == typeof(GameObject))
objects[i] = Util.FindChild(gameObject, names[i], true);
else
objects[i] = Util.FindChild<T>(gameObject, names[i], true);
if (objects[i] == null)
Debug.Log($"Failed to bind({names[i]})");
}
switch (ui)
{
case Define.UI.UI_GameScene:
{
Debug.Log("Bind UI_GameScene!");
if (_objects.ContainsKey(typeof(T)))
return;
_objects.Add(typeof(T), objects);
break;
}
case Define.UI.UI_Shop:
{
Debug.Log("Bind UI_Shop");
if (_objectsShop.ContainsKey(typeof(T)))
return;
_objectsShop.Add(typeof(T), objects);
break;
}
case Define.UI.UI_SelectWeapon:
{
Debug.Log("Bind UI_SelectWeapon");
if (_objectsWeapon.ContainsKey(typeof(T)))
return;
_objectsWeapon.Add(typeof(T), objects);
break;
}
}
}
중간에 중복방지를 위해 키값이 있는지 체크를 해주고
없다면 추가를 하도록 하였다.
그래서
현재 UI_SelectWeapon객체를 누르고 켤때마다 객체가 사라지고
없어지는데 그럴때마다 Bind함수가 호출이 되는 것은 확인함.
중복방지를 위해서 넣어둔 코드에 걸려서 return 이 되는 것인지 아닌지를 확인하기 위하여
UI_Base에 int count = 1 값을 넣고
Init함수가 호출 될때마다 1씩 증가시켜 보았다.
그러면 호출 할 때마다 2가 뜸.
상속에서 당연한 개념이지만 버튼을 누르고 켤때마다 새로운 객체가 생성되었다가 사라졌다가 한다.
실제 주소를 확인하기 위한 키워드이다.
일반 C# 프로젝트에서는 사용이 가능하지만 유니티에서는 이 키워드를 사용하면 에러가 나기 때문에
따로 설정을 해주어야한다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ratoa&logNo=221527754838
그런데 일단 귀찮아서 다른 방법으로 실제 객체가 따로 생성되어
부모 클래스의 딕셔너리들의 값들이 남아있는지 없는지 확인해 보았다.
Init에서 확인한 결과 처음 실행했을 때는 딕셔너리에 값들이 제대로 들어있지만
Destroy를 한 후 다시 생성하면 값들이 비어있다.
분명 UI_Base를 상속받았는데도 말이다.
Ui_Base의 멤버변수로 딕셔너리들이 있고 이 녀석들은 동적할당을 통해서 만들어 질텐데..
1) UI_Base생성자에 직접 딕셔너리 new연산자 넣어보기
2) Ui_Popup의 init에서 new연산자 사용해보기
이방법도 안된다면 다른 방법도 찾아봐야겠다.
220824