Unity 몇 가지 꿀팁

YangJiWon·2021년 10월 15일
1

Unity

목록 보기
1/3

몇 가지 꿀팁

1. 태그 이름 설정

Tag는 문자열로 비교하므로 대소문자를 정확히 지켜야한다. Tag, Sorting Layer 및 Layer는 모두 대문자로 작성하는 것이 좋다.(<- 개인의 취향 차이)

2. 태그 비교

태그를 비교할 때 collider.collider.tag == "문자열" 또는 coll.gameObject.tag == "문자열"과 같이 게임오브젝트의 문자 속성을 가져오는 코드는 실행 시 해당 문자열의 복사본을 생성한다.
이 복사본은 특정 메모리에 할당되며 가비지 컬렉션의 대상이 된다.
가비지 컬렉션이 처리해야할 대상이 많아질수록 해제하는 시점에 잠시 점추는 렉 현상이 발생한다.
가비지 컬렉션이 발생하지 않는 CompareTag 함수를 사용하는 방법을 적극적으로 권장한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RemoveBullet : MonoBehaviour
{
    // 충돌이 시작할 때 발생하는 이벤트
    private void OnCollisionEnter(Collision collision)
    {
        //if (collision.collider.tag == "BULLET")
        if (collision.collider.CompareTag("BULLET"))
        {
            Destroy(collision.gameObject);
        }
    }
}

3. Create Empty Child

게임 개발을 진행하다 보면 어떤 게임오브젝트 하위로 차일드화해서 빈 게임오비젝트를 생성해야 할 경우가 많다.
1. 부모가 될 게임오브젝트를 선택하고 [+]버튼을 클릭해 [Create Empty Child]를 선택하거나 부모가 될 게임오브젝트에서 마우스 오른쪽 클릭해 팝업되는 컨텍스트 메뉴에서 [Create Empty Child]를 선택한다.
2. 게임 오브젝트를 선택하고 단축키(윈도우 : Shift + Alt + N, 맥 : Shift + Option + N) 사용

4. 빈 게임 오브젝트의 기즈모 활용

Transform 컴포넌트만 가진 게임오브젝트는 씬 뷰에서 직접 마우스로 클릭하거나 영역을 드래그해서 선택할 수 없다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyGizmos : MonoBehaviour
{
    public Color _color = Color.yellow;
    public float _radius = 0.1f;

    private void OnDrawGizmos()
    {
        Gizmos.color = _color;
        Gizmos.DrawSphere(transform.position, _radius);
    }
}

5. 쿼터니언

우리가 흔히 알고있는 각도인 90도는 오일러 각이다. 하지만 유니티는 이 오일러 각을 내부적으로 Quaternion 타입으로 변형해 사용한다.
오일러 각은 수학자 오일러가 고안한 것으로 3차원 공간의 절대 좌표를 기준으로 물체가 얼마나 회전했는지 측정하는 방식이다.
그런데 오일러 각을 이용한 회전 방식이 회전하는 동안 X, Y, Z 축 중 2개의 축이 겹쳐지면 어느 축으로도 회전하지 않고 잠기는 현상이 발생한다.
이 현상을 짐벌 락이라고 한다.

이러한 문제점을 해결하기 위해 쿼터니언이라는 대안이 제시됐다.
쿼터니언은 4차원 복소수로서, 오일러 각이 각축에 대해 차례로 회전시켰다면 쿼터니언은 세 개의 축을 동시에 회전시켜 짐벌 락 현상을 방지한다.

transform.Rotate(0, 30, 0);
transform.rotation = Quaternion.Eular(0, 30, 0);

위의 두 개는 같은 결과다. 다만, rotation의 경우 Quaternion.Eular(x, y, z) 함수를 이용해 오일러 각을 Quaternion 타입으로 변환해 대입해야 한다.

6. Collsion.contacts(x) / GetContact, GetContacts(o)

충돌 지점의 접점 정보는 Collision.contacts 속성으로도 알 수 있지만, contacts 속성은 가비지 컬렉션을 발생시키기 때문에 GetContact, GetContacts 함수를 사용하기를 권한다.

7. Physics.OverlapSphere (x) / Physics.OverlapSphereNonAlloc (o)

Physics.OverlapSphere 함수는 실행 시 Sphere 범위에 검출될 개수가 명확하지 않을 떄만 사용해야 한다. 메모리 Garbage가 발생하기 떄문이다.
따라서 Sphere 범위에 검출될 개수가 명확할 때는 Garbage가 발생하지 않는 Physics.OverlapSphereNonAlloc 함수를 사용하기를 권장한다.

8. 연산 처리 속도가 빠른 Collider

  1. Sphere Collider
  2. Capsule Collider
  3. Box Collider

Mesh Collider는 움직이지 않는 것만 적용하는 것이 좋다. 연산 처리량이 높기 때문이다.

9. 여러 대의 카메라를 배치했을 때 반드시 확인해야 하는 주의사항

카메라에는 기본적으로 AudioListener 컴포넌트가 추가돼 있으므로 하나의 씬에 여러 개의 AudioListener 컴포넌트가 있다는 경고 메시지를 볼 수 있다.
그래서 어느 카메라에 있는 AudioListener 컴포넌트를 사용할 것인지 결정하고 나머지는 반드시 삭제해야 한다.

중복된 AudioListener를 삭제하지 않는다면 성능 저하가 생긴다.

10. 코루틴 주의사항

코루틴 함수를 호출할 때 전달하는 인자는 함수의 원형(포인터)을 사용한다.
호출할 코루틴 함수명을 문자열로 전달할 수도 있지만, 그럴 경우 가비지 컬렉션이 발생하며 문자열로 호출한 코루틴은 개별적으로 정지시킬 수 없다는 문제가 있다.

StartCoroutine(Fire()); // 함수의 원형을 전달하는 방식(권장)
StartCoroutine("Fire"); // 함수명을 문자열로 전달하는 방식

11. 차일드화 된 게임오브젝트 좌표, 회전 각도, 스케일 수정 할 때

muzzleFlash = firePos.GetComponentChildren<MeshRenderer>();

이와 같은 코드에서 muzzleFlash의 좌표, 회전 각도, 스케일을 수정하 싶을 때는 localPosition, localRotation, localScale 속성을 사용해야 한다.

muzzleFlash.transform.localRotation = Quaternion.Euler(0, 0, angle);
//위와 같은 코드
muzzleFlash.transform.localRotation = Quaternion.Euler(Vector3.forward * angle);

muzzleFlash.transform.localScale = Vector3.one * scale;
profile
데이터데이터데이터!!

0개의 댓글

관련 채용 정보