- UI를 만들면서 파란점들을 움직이면 해당 크기만큼 화면에 보이게된다 그리고 동그란 원이 존재한다. 해당 원은 중심점을 의미한다 회전할 때도 중심점으로하면서 회전한다.
- canvas라는 도화지 위에 ui들을 그릴 수 있다.
- ui는 원근법이 적용되지않는다.
- 화면 크기에 따라서 적절하게 조정되는 ui크기가 필요하다. 모바일 디바이스마다 화면크기가 다 재각각이다. 그것을 맞춰주기 위해서 핀셋같은 앵커를 이용하면된다. 앵커를 활용할 때 rectTransform을 가진 부모가 존재해야한다. 공식이 존재하는데 핀셋같은 앵커랑 부모 사이의 거리는 비율로 조정되고, 핀셋앵커와 각 모서리들은 거리로 조율된다.
ui 자동화
ui를 실습할 때 부모의 스크립트 파일을 자식 오브젝트에 마우스로 끌어서 넘기는 작업들이 불필요했다 해당 작업들을 자동화하고, 자식들도 찾아주는 작업을 하는 것을 ui자동화라고한다.
버튼 ui를 눌렀을 때 필요한 파일들을 찾아주는 코드를 살펴보자..
public class UI_Button : UI_Popup
{
enum Buttons
{
PointButton
}
enum Texts
{
PointText,
ScoreText,
}
enum GameObjects
{
TestObject,
}
enum Images
{
ItemIcon,
}
private void Start()
{
Init();
}
public override void Init()
{
base.Init();
Bind<Button>(typeof(Buttons));
Bind<Text>(typeof(Texts));
Bind<GameObject>(typeof(GameObjects));
Bind<Image>(typeof(Images));
GetButton((int)Buttons.PointButton).gameObject.BindEvent(OnButtonClicked);
GameObject go = GetImage((int)Images.ItemIcon).gameObject;
BindEvent(go, (PointerEventData data) => { go.transform.position = data.position; }, Define.UIEvent.Drag);
}
int _score = 0;
public void OnButtonClicked(PointerEventData data)
{
_score++;
GetText((int)Texts.ScoreText).text = $"점수 : {_score}";
}
}
위의 enum 값들을 찾아주기가 힘들다 그렇지만 c#에서는 리플렉션 기능이 있어서 해당 값들을 찾아 올 수 있다.
Bind함수도 보자 .
protected void Bind<T>(Type type) where T : UnityEngine.Object
{
string[] names = Enum.GetNames(type);
UnityEngine.Object[] objects = new UnityEngine.Object[names.Length];
_objects.Add(typeof(T), objects);
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]})");
}
}
위에서 리플렉션을 위해 해당 타입을 받아준다, 또한 Enum.GetNames(type)을 하면 해당 Enum값들을 []로 가지고 올 수 있다.
string[] names = Enum.GetNames(type)
UI_EventHandelr
public class UI_EventHandler : MonoBehaviour, IPointerClickHandler, IDragHandler
{
public Action<PointerEventData> OnClickHandler = null;
public Action<PointerEventData> OnDragHandler = null;
public void OnPointerClick(PointerEventData eventData)
{
if (OnClickHandler != null)
OnClickHandler.Invoke(eventData);
}
public void OnDrag(PointerEventData eventData)
{
if (OnDragHandler != null)
OnDragHandler.Invoke(eventData);
}
}
인벤토리 실습
scene
- scene을 이동할 때는 트로이 목마처럼 하나의 개체를 선봉대로 이끌고 다음씬으로 이동해야한다
- 씬구조는 부모를 두고 각각의 scene을 new scene을 통해서 만들면된다.
- 무작정 씬을 만들고 이동을 하면 에러가 나는데 이것은 빌드세팅과 연관이 되어있다, 빌드 세팅에 우리가 사용할 신들을 다 등록을 해야한다.
- 유니티에서 기본적인 씬매니저를 제공하지만 만들어서 사용하면 성능? 향상을 기대할 수 있다.