본문 바로가기
unity

UI

by kcj3054 2022. 7. 10.
  • 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을 통해서 만들면된다.
  • 무작정 씬을 만들고 이동을 하면 에러가 나는데 이것은 빌드세팅과 연관이 되어있다, 빌드 세팅에 우리가 사용할 신들을 다 등록을 해야한다.
  • 유니티에서 기본적인 씬매니저를 제공하지만 만들어서 사용하면 성능? 향상을 기대할 수 있다.

'unity' 카테고리의 다른 글

카메라  (0) 2022.07.18
서버와 연동 방법  (0) 2022.07.11
raycast  (0) 2022.07.10
coroutine  (0) 2022.07.09
0708  (0) 2022.07.08