Unity 몇 가지 꿀팁(2)

YangJiWon·2021년 10월 23일
0

Unity

목록 보기
2/3

1. Find ~ 계열의 함수

FindGameObjectWithTag, FindGameObjectsWithTag와 같이 Find~ 계열의 함수는 처리 속도가 느리기 때문에 Update 함수에서 사용하지 않는다.

따라서 Awake, Start 함수에서 변수에 할당한 후 사용하길 권장한다.

2. 애니메이션 해시 변수로 쓰기

애니메이터 컨트롤에 정의한 파라미터는 모두 해시 테이블로 관리하기 때문에 문자열로 호출할 때마다 내부의 해시 테이블을 검색하므로 속도 면에서 불리하다.

따라서 스크립트에서 접근하려는 애니메이터 뷰의 파라미터 해시 값을 미리 추출해 인자로 전달하는 방식이 속도 면에서 바람직한 방법이다.

 //Animator 파라미터의 해시값 추출
    private readonly int hashTrace = Animator.StringToHash("IsTrace");
    private readonly int hashAttack = Animator.StringToHash("IsAttack");
    
//과거
anim.SetBool("IsTrace", true);

//현재
anim.SetBool(hashTrace, true);

3. Resources 폴더의 주의사항

Resources 폴더에 있는 모든 에셋은 런타임에서 직접 불러와 사용할 수 있는 특징이 있지만, 빌드할 때 실행 파일에 모두 포함된다.

따라서 게임에서 사용하지 않는 리소스가 있어서는 안된다.

4. Button 객체의 OnClick() 주의사항


버튼에는 위와 같이 클릭했을 떄 이벤트를 추가할 수 있는 기능이 있다. 이 때 이벤트 함수가 파라미터로 ENUM을 가지고 있으면 OnClick()함수에 추가할 수 없다!

이를 해결하는 방법은

1. Delegate를 이용해서 사용자 이벤트를 사용하여 추가하기

2. 파라미터에서 Enum대신 다른 파라미터 변수 쓰기

아마 이것보다 해결하는 방법은 많을 것이다.

5. Button에 이벤트를 연결하는 방법

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events; // <- UnityAction쓸 때 필요

public class UIManager : MonoBehaviour
{
    public Button startButton;
    public Button optionButton;
    public Button shopButton;

    private UnityAction action;

    private void Start()
    {
        // 1. UnityAction을 사용한 이벤트 연결 방식
        action = () => OnButtonClick(startButton.name);
        startButton.onClick.AddListener(action);

        // 2. 무명 메서드를 활용한 이벤트 연결 방식
        optionButton.onClick.AddListener(delegate { OnButtonClick(optionButton.name);});

        // 람다식을 활용한 이벤트 연결 방식
        shopButton.onClick.AddListener(() => OnButtonClick(shopButton.name));
    }

    public void OnButtonClick(string msg)
    {
        Debug.Log($"Click Button : {msg}");
    }
}

6. GetComponentsInChildren

public Component[] GetComponentsInChildren(Type t);
public void GetComponentsInChildren<T>(List<T> results);
public T[] GetComponentsInChildren<T>();
public void GetComponentsInChildren<T>(bool includeInactive, List<T> result);
public T[] GetComponentsInChildren<T>(bool includeInactive);

bool includeInactive 인자는 비활성화된 게임오브젝트까지 반환 값에 포함할 것인지를 결정한다.

7. 배포 할 때는 라이트맵과 함께!

Auto Generate를 옵션이 체크된 상태는 베이크된 라이트맵은 캐시에 저장된다.
캐시에 저장된 라이트맵은 실행 파일에 저장되지 않고 유니터 에디터에서만 확인할 수 있다.
따라서 실행 파일에 라이트맵을 함께 배포하려면 반드시 Auto Generate 옵션을 끄고 수동으로 베이크해야 한다.

profile
데이터데이터데이터!!

0개의 댓글