Unity C# > 미분류, 패키지, Attribute, 전처리기, 단축키

Date:     Updated:

카테고리:

태그:

공부하면서 알게 된 이벤트 함수들을 정리한 문서입니다.😀

👩‍🦰 코루틴 관련

StartCoroutine

StartCoroutine(FindSightActivateCoroutine());
  • FindSightActivateCoroutine() 코루틴 함수를 실행시킨다.

StopAllCoroutines

StopAllCoroutines();
  • 병렬적으로 현재 실행 중인 모든 코루틴 함수를 중단시킨다.

WaitForSeconds(float)

yield return new WaitForSeconds(0.2f);  // 0.2 초 대기

지정 시간동안 대기

WaitUntil(Func))

// 람다 함수로 넘긴 경우

yield return new WaitUntil(() => HandController.isActivate);  

지정된 함수가 True 를 리턴할 때까지 대기.

  • Bool 타입을 리턴하는 함수의 포인터 혹은 람다함수를 인수로 넘기고 True 값을 리턴할 때까지 대기한다.
  • 예시 코드에선 HandController.isActivate가 True가 될 때까지 대기한다.


👩‍🦰 패키지

Window - Package Manager 에서 원하는 패키지를 임포트 할 수 있다.


👩🏻‍🦰 Cinemachine

  • 스마트 하게 추적하는 복잡한 카메라를 손쉽게 구현할 수 있도록 해주는 패키지

컴포넌트

Cinemachine Brain
  • 해당 오브젝트를 Brain Camera로 설정해준다.
  • 여러개의 가상 카메라 중 하나를 선택하여 사용할 수 있는 기능을 가진다.


👩🏻‍🦰 Post Processing

  • 영상 후처리

컴포넌트

Post Processing Layer

카메라에게 Post Process를 반영해줌

  • Trigger에 기본적으로 설정이 되어있는 Main Camera(자기 자신) 주변에 가까이 있는, 즉 이 Trigger에 충돌하는 Post Process Volume 오브젝트의 Box Collider로 충돌하면 이로부터 후처리 설정을 가져와서 자신이 붙어있는 Main Camera 카메라 오브젝트에게 이를 반영한다. IsGlobal을 체크하면 꼭 Trigger에 충돌할 필요 없이 게임 화면 전체적으로 후처리를 해줌!
  • 여러가지 영상미 효과를 적용할 수 있다.
    • 빛 산란 효과라던가 시네마틱 효과라던가 등등
    • 인스타그램 필터와 같이!



👩‍🦰 Attributes

[SerializeField]

[SerializeField] private GameObject gameoverUI;
  • private 이지만 [SerializeField]이 붙으면 private 하더라도 유니티 엔진의 Inspector 창에서 슬롯이 열려 이를 수정할 수 있다.
    • 유니티 Inpector 창에서 이제 보고 직접 값도 할당할 수 있지만 private 보호 수준은 유지 된다.
  • 📢 그러나 [SerializeField] 넣는다고 무조건 인스펙터 창에 뜨는건 아니다. 예외도 있다.


[Range]

[Range(0.0f, 12.0f)] public float Size = 12.0f;
  • 유니티 엔진의 Inspector 창에서 해당 최소값 ~ 최대값을 범위로 가지는 슬라이더 슬롯이 열린다.


[HideInInspector]

  • public 이어도 유니티 엔진의 Inspector 창에선 해당 멤버 변수가 보이지 않게 된다. 슬롯이 열리지 않음.


[RequireComponent(typeof(컴포넌트 이름))]

해당 컴포넌트를 이 스크립트가 붙어 있는 오브젝트에 자동으로 붙여준다.

[RequireComponent(typeof(GunController))]       // 자동으로 이 스크립트가 활성화되면 📜GunController.cs 가 이 스크립트가 붙어있는 오브젝트에 붙게 된다. 실수 방지(📜GunController.cs가 필요하다고 강제함)


[System.Serializable]

[System.Serializable]
public class Test
{
  public int x;
  public int y;
}

public class Gun : MonoBehaviour
{
  [SerializeField]
  private Test test;
}

MonoBehaviour을 상속 받지 않는 일반 C# 클래스의 멤버들을 유니티의 Inspector 슬롯으로 띄우고 싶다면 해당 클래스에 [System.Serializable]을 붙여주면 된다. 다른 클래스에서 이 클래스를 참조할 때 private 멤버로 참조함다면 [SerializeField]도 함께 붙여주어야 한다.



👩‍🦰 전처리기

전처리기 👉 특정 상황에 따라 스크립트를 컴파일할지 말지 결정할 수 있다.

  • 유니티는 여러 플랫폼을 빌드할 수 있다. iOS, 안드로이드, 윈도우, 맥OS 등등..
    • 플랫폼에 따른 각각의 코드들을 만들 때 특정 플랫폼에만 컴파일 되는 전처리기를 만들 수 있다.
    • 예를들어 iOS 전처리기 부분은 게임 개발이 완성된 후 iOS로 빌드될 때만 포함된다. 안드로이드로 빌드 될 때는 이 부분의 코드가 빌드에 포함되지 않는다.
    #if UNITY_EDITOR 
      Debug.Log("Unity Editor");  // 유니티 에디터에서만 나오는 로그
    #endif
    
    #if UNITY_IOS
      Debug.Log("Iphone");   // iOS 에서만 나오는 로그. iOS로 빌드할 때만 빌드 된다.
    #endif

    #if UNITY_STANDALONE_OSX
    Debug.Log("Stand Alone OSX");   // 맥 OS 에서만 나오는 로그. 맥 OS로 빌드할 때만 빌드 된다.
    #endif

    #if UNITY_STANDALONE_WIN
      Debug.Log("Stand Alone Windows");  // 윈도우에서만 나오는 로그. 윈도우로 빌드할 때만 빌드 된다.
    #endif



👩‍🦰 미분류

LayerMask

  • LayerMask 는 32 비트의 int형이다.
    • 비트 플래그로, 비트로 각각의 아이템을 상징하며 구분된다.
        • 몬스터 레이어는 0000000000000000000000001000000 👉 8 번 레이어 (1 « 8)
        • NPC 레이어는 0000000000000000000000000000100 👉 3 번 레이어 (1 « 3)
    • 따라서 LayerMask는 위와 같이 32 개까지만 만들 수 있다.
    • LeyerMask 내에 연산자 오버로딩과 int로의 변환이 다 구현이 되어 있기 때문에 LayerMask라는 이름으로 편하게 접근할 수 있는 것 뿐이다.
  • public LayerMask a; 해주면 유니티에서 Layer 를 선택할 수 있는 드롭다운 슬롯이 열린다.
            int mask = (1 << 8) | (1 << 9); // 8 번 레이어 + 9 번 레이어

            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 100.0f, mask))
            {
                Debug.Log(hit.collider.gameObject.name);
            }
  • (1 « 8) ** ** (1 « 9) 👉 000000000000000000000000110000000
    • 즉 8번 레이어 혹은(or) 9 번 레이어(사진에선 “Monster”와 “Wall”)를 가진 오브젝트들에 대해서만 Raycasting이 진행된다.
  • 이처럼 비트 플래그를 활용한 비트 연산으로 Layer를 지정할 수 있다.
  • (1 « 8) ** ** (1 « 9) 은 십진수로 변환하면 768 이므로 int mask = 768; 도 가능하다.

LayerMask.GetMask(string)

            LayerMask mask = LayerMask.GetMask("Monster") | LayerMask.GetMask("Wall")/
            // int mask = (1 << 8) | (1 << 9); 와 동일

            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 100.0f, mask))
            {
                Debug.Log(hit1.collider.gameObject.name);
            }
  • LayerMask.GetMask(string)
    • 해당 문자열로 저장된 LayerMask 즉, int 크기의 비트를 가져오게 된다.
    • 이처럼 함수를 사용해 편하게 레이어 이름으로 지정한 문자열로 비트를 가져올 수 있다.


Invoke()

MonoBehaviour 에서 지원하는 함수로, 함수 혹은 이벤트를 실행시킨다.

  • 이벤트이름.Invoke() : 이벤트 발동
  • Invoke(string) : 이름을 문자열로 넣으면 그 이름의 함수를 실행시킨다.
  • Invoke(string, floaT) : 매개 변수로 시간도 넣을 수 있다. Invoke(“Restart”, 5f) 해주면 5초 뒤에 Restart() 함수를 실행시켜라라는 의미다.



👩‍🦰 단축키 or 팁

  • F2 이름 변경
  • Ctrl키를 누른 상태에서 오브젝트를 옮기면 1단위로 평행이동 시킬 수 있다.
  • Ctrl + D : 복사 붙여넣기 한번에.
  • shift : shift 한 후 파일을 두개 선택하면 그 파일들을 포함하여 파일 사이에 있는 파일들까지도 전부 선택된다.
    • Alt + shift : 표면상 리스트 뿐만아니라 모든 자식의 자식들까지 다 선택된다.
  • 게임 창의 maximize on play 누르면 게임 실행화면을 큰 화면으로 볼 수 있다.
  • Alt + 🔻 : Alt 누른 채로 Hierarchy창의 오브젝트의 자식 목록들을 볼 수 있는 🔻를 누르면 모~~든 자식의 자식들까지 모든 리스트가 펼쳐진다.
  • Ctrl + P : 게임 플레이
  • Ctrl + Shift + N : 빈 게임 오브젝트 생성
  • X
    • 월드 좌표계 Global, 로컬 좌표계 Local 둘 중 하나로 바꿀 수 있다.
    • Global
      • 이 상태로 오브젝트를 누르면 월드를 기준으로 한 오브젝트의 좌표를 보여줌.
      • 즉 절대적인 위치와 절대적인 X, Y, Z 축을 보여 줌.
    • Local
      • 이 상태로 오브젝트를 누르면 로컬을 기준으로 한 오브젝트의 좌표를 보여줌. 즉, 부모 오브젝트를 기준으로 한 좌표로 하거나 해당 오브젝트 입장에서늬 좌표계를 보여준다.
      • 즉 상대적인 위치와 상대적인 X, Y, Z 축을 보여 줌

Scene

  • 마우스 휠 스크롤, or Alt + 마우스 우클
    • 줌인 줌아웃
  • 마우스 우클릭 + WASD 👉 Scene 화면 내 이동
    • scene창을 마우스 우클릭으로 꾹 눌러준 상태에서 WASD, 마우스 회전을 하면 FPS게임처럼 scene 화면을 돌아다닐 수 있게 된다.
  • 마우스 우클릭 + 마우스 회전 👉Snene 화면 내에서 제자리에서 회전
  • Alt + 마우스 좌클 👉 Scene 화면 내 회전
    • scene창의 중심을 기준으로 공전하면서 움직일 수 있게 된다.
    • 현재 오브젝트가 scene창의 중심이 오브젝트에 있다면 오브젝트를 중심으로 공전하며 볼 수 있다.
  • 마우스 휠로 클릭 👉 화면 잡고 이동
    • Scene Camera 를 평행하게 움직일 수 있는 핸드툴이 휠을 누르는 동안 잠시 실행됨.
  • Q,W,E,R,T,Y
    • 트랜스폼 툴바 단축키
      • W 위치
      • E 회전
      • R 크기
  • 카메라 오브젝트를 선택한 상태에서 Ctrl + Shift + F를 누르면 선택한 카메라 오브젝트가 현재 씬 화면(Scene 카메라)을 비추는대로 똑같이 비추도록 이동하게끔 만들 수 있다.
    • 카메라 오브젝트가 씬 카메라와 동일한 위치로 이동하여 씬 화면과 동일한 화면을 찍게 된다.

Animation Controller

  • Alt키 누른 채로 드래그 해서 이동할 수 있다.
  • 상태들을 드래그 한 후 F 누르면 해당 상태들에 뷰가 맞춰진다.
  • A를 누르면 전체 상태들이 한 눈에 보이는 뷰로 맞춰진다.
  • 마우스 휠을 누른 채로 이동할 수 있다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기