Unity C# > 미분류, 패키지, Attribute, 전처리기, 단축키
카테고리: UnityDocs
태그: Unity Game Engine
공부하면서 알게 된 이벤트 함수들을 정리한 문서입니다.😀
- 유니티 공식 매뉴얼 https://docs.unity3d.com/kr/current/Manual/UnityManual.html
- Scripting Overview http://www.devkorea.co.kr/reference/Documentation/ScriptReference/index.html
👩🦰 코루틴 관련
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이 진행된다.
- 즉 8번 레이어 혹은(
- 이처럼 비트 플래그를 활용한 비트 연산으로 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
크기의 비트를 가져오게 된다. - 이처럼 함수를 사용해 편하게 레이어 이름으로 지정한 문자열로 비트를 가져올 수 있다.
- 해당 문자열로 저장된 LayerMask 즉,
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
를 누르면 전체 상태들이 한 눈에 보이는 뷰로 맞춰진다.- 마우스 휠을 누른 채로 이동할 수 있다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기