유니티_토이프로젝트_UI

CJB_ny·2022년 8월 24일
0

Unity_Tip

목록 보기
4/6
post-thumbnail

현재

UI의 구조가

최상위 부모부모자식
UI_BaseUI_SceneUI_GameScene
UI_BaseUI_PopupUI_ShopUI_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가 뜸.

상속에서 당연한 개념이지만 버튼을 누르고 켤때마다 새로운 객체가 생성되었다가 사라졌다가 한다.

unsafe

실제 주소를 확인하기 위한 키워드이다.

일반 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

profile
공부 일기장으로 변해버린 블로그 (https://cjbworld.tistory.com/ <- 이사중)

0개의 댓글