GameObject.layer

public int layer ;
레이어는  카메라가 씬의 일부만 렌더링하거나(or Light가 선택적으로 비추는 용도)로 주로 사용되며

그외 콜라이더를 선별적으로 감지하여 원하는 충돌을 생성하고자 할 때 레이캐스팅 분야와 관련하여 다뤄진다.


Bit Shift 연산

비트라는 것은 컴퓨터가 수를 해석하는 최소 단위인 0 과 1을 뜻하고  int 형 32비트 변수를 사용한다는 것은 2진수 1비트가 32개 있다는 뜻이다. 
유니티 Layer의 수가 0~31까지 있는 이유도 그러한데, 비트시프트는 임의의 수만큼 비트를 이동하여 각 구간을 숫자로 쉽게 표현해주는 역할을 한다.

크기 

표현 가능한 수의 범위 

 지수 표현

 unsigned char

1바이트 

0~255

 0~ 2^8 -1

 unsigned int

4바이트 

0~4294967295

 0~2^32 -1


비트 시프트의 성질
[Left -shift]: 값이 두배가 된다.  [Right -shift]: 값이 절반이 된다

0000  0000  0000  0000                     0000  0000  0000  0000                      0000  0000  0000  0000                      0000  0000  0000  0000  
0000  0000  0000  0000                     0000  0000  0000  0001                      0000  0000  0000  0010                      0000  0000  0000  0100

0                                                   2^0  Default                                    2^1  Builtin Layer 1                            2^2  Builtin Layer 2

 
0000  0000  0000  0000                     0000  0000  0000  0000                      0000  0000  0000  0000                      0000  0000  0000  0000  
0000  0001  0000  0000                     0000  0010  0000  0000                      0000  0100  0000  0000                      0000  1000  0000  0000  

2^8  user Layer 8    (1<<8)                2^9  user Layer 9    (1<<9)                  2^10  user Layer 10    (1<<10)             2^11  user Layer 11    (1<<11)


0001  0000  0000  0000                     0010  0000  0000  0000                      0100  0000  0000  0000                      1000  0000  0000  0000  
0000  0000  0000  0000                     0000  0000  0000  0000                      0000  0000  0000  0000                      0000  0000  0000  0000  

2^28  user Layer 28    (1<<28)           2^29  user Layer 29    (1<<29)              2^30  user Layer 30    (1<<30)             2^31  user Layer 31    (1<<31)


각 단계에 대한 상태를 수로 표현한다고 했을 때 2진수는 너무 길어지고 16진수는 사람이 이해하기에 적합하지 않다.

그래서 비트시프트라는 것은 컴퓨터가 알아들을 수 있는 구조이면서 프로그래머에게도 읽기 편함을 제공해주는 방법이라고 할 수 있다.



Layer Culling Mask

카메라의 컬링 마스크를 사용하면 특정 레이어에 속한 오브젝트를 선별적으로 렌더링 할 수 있다. 
Edit > Project Settings->Tags and Layers 선택하거나 인스펙터 창에서 Layer add 를 클릭하여 새로운 레이어를 만들고 게임 오브젝트에 추가하자  
카메라 컴포넌트에서 Culling Mask로 추가된 Layer를 선택/ 해제하면 오브젝트를 선별적으로 렌더링할 수 있게 된다. 
(스크린 공간 캔버스 자식은 카메라 컬링 마스크를 사용하지 않으므로 UI 요소는 컬링되지 않는다.)





Layer Ray Casting

public void Function(string input);
code description






GameObject Activate / DeActivate

public bool activeInHierarchy { get; }
씬 안에서 게임 오브젝트가 활성화 상태인지 알 수 있다. 이것은 activeSelf 의 속성이 true인 것 뿐만아니라 부모의 경우도 마찬가지로 활성화 됨을 보장한다.

public bool activeSelf { get; }
게임 오브젝트의 로컬 활성화 상태를 알 수 있다. 
GameObject.SetActive(true)로 엑티브 상태를 활성화해도 부모가 비활성 상태라면 씬 안에서 보이지 않는다.

public void SetActive(bool value); 게임 오브젝트를 활성화/ 비활성화 한다.


GameObject Destroy

public static void Destroy(Object obj, float t = 0.0F);
게임 오브젝트 또는 컴포넌트를 제거 한다. (옵션으로 t초 후 시간 지연가능) 실제 객체 파기는 현재 Update 루프 이후까지 지연되지만 렌더링 전에는 항상 수행된다.


public static void DontDestroyOnLoad(Object target);
새로운 씬을 로드할 때 장면의 모든 오브젝트가 우선 파괴되고 새로운 씬에 다음 오브젝트들이 로드된다. 

씬 레벨 로딩 중에 객체가 파괴되는 것을 막기 위해서는 DontDestroyOnLoad를 호출하여야 한다.

public static void DestroyImmediate(Object obj, bool allowDestroyingAssets = false);

(destroy는 Update에서 한프레임이 끝날 때까지 지연되는 이유로 만약 에디터모드에서 destroy 해야 할일이 있을 때는 DestroyImmediate를 사용해야한다.)

또는 싱글턴 패턴에서 객체를 하나만 유지해야 하는 경우, 기존 인스턴스가 존재할 때 추가 생성 되는 걸 막는 용도로 사용된다.



Transform.Find

public Transform Find(string name);
이름을 이용해 자식을 찾고 그 트랜스폼 객체를 반환한다.


Transform.GetChild

public Transform GetChild(int index)
자식 트랜스폼 객체를 인덱스로 구분해 반환한다.




GameObject.Find

public static GameObject Find(string name); 이름으로 검색 - 씬 중에서 오브젝트 명과 일치하는 게임 오브젝트를 한 개 찾아서 반환

GameObjet.Find 함수는 Transform.Find와 달리 전체 씬의 오브젝트와 컴포넌트를 탐색하므로 사용하기 편리한 장점도 있지만

검색 처리가 매우 무겁기 때문에 씬 안에 오브젝트가 많아지면 성능을 현저히 떨어뜨린다. 

Awake 나 Start 함수 내에서 한번 정도 이외에는 자주 사용하지 않을 것을 권장 -> GameObjet.FindWithTag 하거나 캐시해서 사용하자,


GameObjet.FindWithTag

public static GameObject FindWithTag(string tag);
태그로 검색 - 씬 중에서 태그 명과 일치하는 게임 오브젝트를 한 개 찾아서 반환

public static GameObject[] FindGameObjectsWithTag(string tag);
태그로 검색 - 씬 중에서 태그 명과 일치하는 게임 오브젝트를 여러 개 찾아서 배열로 반환


GameObjet.FindObjectOfType

public static Object FindObjectOfType(Type type);    /    public static T FindObjectOfType<T>() Where T : Object; 

타입명 검색 - 씬 중에서 타입 명과 일치하는 게임 오브젝트를 한 개  찾아서 반환

public static Object[] FindObjectsOfType(Type type);    /    public static T[] FindObjectsOfType<T>() Where T : Object

타입명 검색 - 씬 중에서 타입 명과 일치하는 모든 게임 오브젝트 요소를 배열로 반환


Object.GetInstanceID

public int GetInstanceID();오브젝트의 고유 인스턴스 객체 반환  

찾으려는 오브젝트가 실제 동일한 오브젝트인지 비교하길 원할 경우 이 매서드를 이용할 수 있다.


Transform.Translate

public void Translate(Vector3 translation, Transform relativeTo)

게임 오브젝트의 트랜스폼을 일정 방향과 거리로 이동시킨다.

translation : 전달되는 백터 인자 값 만큼 이동된다. (해당 좌표로 포지션을 위치시키는  것이 아닌) 백터크기 만큼의 상대적인 이동 값을 나타낸다.

relativeTo : 좌표가 변환될 때 이동 축의 기준이 되는 상대 좌표계를 나타낸다

Transform.Rotate, RotateAround

public void Rotate(Vector3 eulerAngles, Space relativeTo = Space.self)

기준이 되는 축(오일러 앵글) 중심으로 transform을 회전한다. 

오일러 각을 이용한 회전 방식은 x, y, z축을 기준으로하여 각 각의 순서로 회전을 표현한다.  

짐벌락 발생 : 두번 째 회전이 90도 또는 270도에 가까워 질 때 첫 번째 회전축과 세 번째 회전의 두개 축이 거의 일치하여 자유도가 2축으로 한정되는 현상을 말한다.

public void RotateAround(Vector3 point, Vector3 axis, float angle);
월드 좌표상의 position 좌표에서 axis 중심 축 기준으로 angle 회전한다.

Transform.LookAt

public void LookAt(Transform target, Vector3 worldUp = Vector3.up);

해당 트랜스폼이 타겟의 위치를 바라보도록 변환 회전을 지시한다. (월드에서의 위쪽 방향을 디폴트로  y축으로 지정함 


Transform.TransformDirection 

public Vector3 TransformDirection(float x, float y, float z);
public Vector3 TransformDirection(Vector3 direction);

트랜스폼의 direction을 로컬 공간에서 월드 공간으로 변환한다. (로컬 공간 방향 벡터를 입력하여 월드 공간으로 변환한다.)



Quaternion.Euler, AngleAxis

public static Quaternion Euler(float x, float y, float z); 오일러각을 쿼터니언 회전각으로 반환 

public static Quaternion Euler(Vector3 euler);   Vector3 인자값 사용 (위의 수치를 한꺼번에 사용한 것과 다름없다) 

public static Quaternion AngleAxis(float angle, Vector3 axis); axis 축 방향을 중심으로 angle 각 만큼 회전


Quaternion.Angle, Inverse, Dot

public static float Angle(Quaternion a, Quaternion b); 두 쿼터니언 회전각 a, b 사이의 차이각 

public static Quaternion Inverse(Quaternion rotation); rotation의 inverse를 반환 

public static float Dot(Quaternion a, Quaternion b); 두개의 rotation 사이의 내적

( 0.7, 0.0, 0.0, 0.7) 

(-0.7, 0.0, 0.0, 0.7) 

180 

(-0.7, 0.0, 0.0, 0.7)


Quaternion.FromToRotation, LookRotation, RotateTowards

public static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection); from 백터방향에서 to백터방향으로 회전한 각도를 쿼터니언으로 반환 

public static Quaternion LookRotation(Vector3 forward); 지정된 방향 백터로 쿼터니언 회전 각 반환 

public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta); 

from에서 to까지의 quaternion 회전각 차이에서 maxDegreesDelta 수치 만큼 회전


Quaternion.Lerp, Slerp

public static Quaternion Lerp(Quaternion a, Quaternion b, float t); 변화 전 a와 변화 후 b 사이를 정규화한 변화량 t(0.0f~1.0f) 로 선형보간한다. 

public static Quaternion Slerp(Quaternion a, Quaternion b, float t); 변화 전 a와 변화 후 b 사이를 정규화한 변화량 t(0.0f~1.0f) 로 구면보간한다. 

public static Quaternion Lerp/SlerpUnclamped(Quaternion a, Quaternion b, float t); 사이 입력값의 한계치를 제한하지 않는다. 

mathf.LerpUnclamped(1.0, 2.0, 1.5) == 2.5 vs mathf.Lerp(1.0, 2.0, 1.5) == 2.0                    

slerp/lerp 비교 링크 -  https://imgur.com/r/Unity3D/FeKRE1c



씬안에 있는 모든 게임 오브젝트는 기본적으로 Transform 컴포넌트를 갖고 있다. ( Normal - > Debug 전환 모습 )

 

Transform을 통하여 객체에 대한 좌표(Position), 회전(Rotation), 크기(Scale) 들을 저장하고 조작할 수 있다.

열거자 (enumerators)를 지원하므로 부모 자식 계층구조에서 루프 탐색을 허용한다. 

Transform.position, localPosition

public Vector3 position { get; set; }

해당 트랜스폼의 월드 좌표를 나타낸다.

public Vector3 localPosition { get; set; }

부모에 대한 상대좌표이다. (부모의 zero좌표가 기준점이 된다, 부모가 없다면 월드좌표 공간이 기준이 된다.)

속성을 나타내므로 하위 컴포넌트 값을 설정할 수는 없다. 

Transform.lossyscale, localScale

public Vector3 lossyScale { get; } 해당 트랜스폼의 월드 크기를 나타낸다. (읽기 전용)

public Vector3 localScale { get; set; } 부모에 대한 하위 트랜스폼의 상대크기 이다.  (부모가 없다면 월드크기와 같다.)

Transform.rotation, localRotation

public Quaternion rotation { get; set; } 쿼터니언(quaternion) 으로 트랜스폼의 회전각을 나타낸다.

public Quaternion localRotation { get; set; } 부모(쿼터니언 회전각)에 대한 해당 트랜스폼의 쿼터니언 회전각을 나타낸다.


Transform.eulerAngles, localEulerAngles

public Vector3 eulerAngles { get; set; } 오일러앵글로 트랜스폼의 회전각을 나타낸다. 

public Vector3 localEulerAngles { get; set; } 부모의 트랜스폼 회전각에 대하여 해당 회전각의 오일러앵글을 나타낸다.

오일러회전에서는 짐벌락 현상이 발생하므로  Quternian(쿼터니언) 회전을 사용하거나 제한된 범위에서 회전으로 설계해야 한다.

짐벌락 발생 : 두번째 회전이 90도 또는 270도에 가까워 질 때 첫 번째 회전축과 세 번째 회전의 두개 축이 거의 일치하여 자유도가 2축으로 한정되는 현상 



Transform.forward, right, up

public Vector3 right{ get; set; }  오른쪽 방향 (x 축 중심이 향하는 positive 방향, 레드 화살표)

public Vector3    up{ get; set; }     위쪽 방향 (y 축 중심이 향하는 positive 방향, 그린 화살표)

public Vector3 forward{ get; set; }  앞쪽 방향 (z 축 중심이 향하는 positive 방향, 블루 화살표)


Transform.childCount

public int childCount { get; } 트랜스폼이 가지는 자식 트랜스폼의 수를 나타낸다.


Transform.parent, SetParent

public Transform parent { get; set; } 해당 객체의 부모를 가져오거나 set으로 변경한다. 부모와의 상대적인 관계에서 position scale position이 따라 바뀐다.
public void SetParent(Transform parent); 변경할 부모 객체를 설정한다. 

public void SetParent(Transform parent, bool worldPositionStays); 이 메서드가 parent와 다른 것은 트랜스폼이 글로벌 방향이 아닌 로컬 방향을 유지하도록 한다

(If true, the parent-relative position, scale and rotation are modified such that the object keeps the same world space position, rotation and scale as before.)

그리고 Rectransform 사용할 때 UI의 일반적인 스케일링 문제로  worldPositionStays를 false 로 하여 SetParent()를 사용할 것을 유니티에서 요구하고 있다.



Coroutine

코루틴은 메인 게임 루프에서 병렬이나 비동기로 실행되는 것처럼 보이는 측면을 고려할 떄 스레드(thread)처럼 동작한다고 할 수 있다. 
즉 코루틴을 실행시키면 백그라운드에서 실행되는 것처럼 보인다.
코루틴을 실행하면 일반적인 함수처럼 이전 동작이 멈추거나 코루틴 함수가 완료될 때까지 기다리고 있지 않는다.
이런 특징으로 인해 코루틴은 비동기처럼 보이는 동작을 만들 때 훌륭한 도구이다.


yield

모든 코루틴은 IEnumerator 형식을 반환해야 하는데, 최소한 하나의 yield문을 포함하고 있어야 하고 StartCoroutine으로
실행되어야 한다. yield문은 조건이 충족될 때까지 코루틴의 실행을 미루는 특별한 구문이다.
yield return new WaitforSeconds(sec)와 같은 식으로 sec초 만큼 실행을 멈추었다가 시간이 지나면 다음 줄의 실행을
계속하도록 할 수 있다. 반대로 yield return null 과 같은 식으로 구현하면 현재 프레임에서 실행을 멈추었다가
다음 프레임에서 이후의 코드를 실행하도록 한다. -유니티 C# 스크립팅 마스터하기


yield return object; 

object <- 이 대상을 IEnumerator 객체의 current 값과 비교한다.


코루틴 메서드 실행 도중 yield 문을 만나면 실행이 정지하며  다른 코드에 실행을 양보한다.
current 에 있는 object 값을 가져와 타입을 체크한 후 해당 메시지의 대기동작 만큼 기다린다.
(일정 시간 동안의 다른 코드의 실행이 끝나면 다시 해당 지점으로 돌아와 실행을 계속한다.)
MoveNext 를 통해 다음 yield 구문으로 넘어간다. 만약 존재하지 않으면 코루틴 종료

위 그림과 같은 동작을 코드로 나타냄



MonoBehaviour.StopCoroutine

코루틴 실행을 중지하기 위해서는 다음과 같은 방법이 있다.

  • public void StopCoroutine(string methodName);

  • public void StopCoroutine(IEnumerator routine);
  • public void StopCoroutine(Coroutine routine);
  • public void StopAllCoroutines(); // 현재 클래스에서 실행한 모든 코루틴 종료

코루틴이 반복될 때 (타이머 설정과 같이) 종료지점이 내부에 포함되어 있지 않은 경우, 

무한 루프가 되기 때문에 중지가 필요한 시점에서 StopCoroutine()으로 해당 코루틴을 종료한다고 말해줘야 한다.

하지만 IEnumerator 참조명으로 코루틴이 실행된 경우 또는 파라미터가 포함되어 있는 경우에는 StopCoroutine() 사용이 불가하다.

어떤 코루틴을 중지할 것인지 정보가 명확하지 않기 때문이다.

그럴경우 중지가 예정된 코루틴 개체에 대한 IEnumerator 타입의 참조 변수를 선언하여 StopCoroutine(참조 변수) 해줘야 한다.


유니티 공식 API Link: StopCoroutine  


 간단한 타이머 코루틴 예시

new WaitforSeonds 는 디바이스 환경에 종속적이므로 프레임 구간마다 예상하는 정확한 시간을 보장해주지 않는다. 

모든 클라이언트에게 공평한 환경을 제공해주기 위해선 Time.deltaTime 를 사용하여 일정 시간 경과 이후 yield return null로 턴을 마치는 루프문을 작성하는게 좋다.

여기서는 WaitforSecondsRealtime를 사용하였다.


lerp 와 자주 쓰이는 코루틴 방식


'UnityEngine > Editor 시스템' 카테고리의 다른 글

Unity 실행 순서  (0) 2018.06.05

Reset 

인스펙터 창에서 리셋을 눌러줄 때 실행된다.  객체가 가지고 있는 속성 값이 제일 먼저 반영

Awake

스크립트가 실행될 때 처음에 한번 호출 된다. 모든 오브젝트가 씬안에서 초기화된 후 

호출되기 때문에 GameObject.Find 를 통해 해당 오브젝트를 찾을 수 있다.

Awake함수는 항상 Start 함수 이전에 호출 되므로 초기화 순서를 제어해줄 때 필요하다.

(Coroutine은 사용불가)

OnEnable

오브젝트가 SetActive(True) -인스펙터뷰에서 활성화되었을 때 호출된다. 

비활성화 이후 활성화할 때 다시 실행된다.

Start

다른 스크립트의 Awake가 모두 실행된 후 호출된다. 


Update

이 이벤트는 씬 안의 모든 활성화된 게임오브젝트의 모든 컴포넌트에 대해 프레임당 한번 씩 Update 이벤트가 불리게 된다.

오브젝트가 SetActive 메소드에 의해 비활성화되면 활성화되기 전까지 Update 이벤트가 호출되지 않는다.

하지만 update 이벤트가 모든 컴포넌트에 대해 매프레임마다 불려지는것이 보장되지는 않는다.

즉 A라는 오브젝트의 Update 함수가 B라는 오브젝트의 Update 함수가 불리기 전에 호출되는지 확인할 방법은 없다.

FixedUpdate

이 이벤트 호출은 고정된 시간 간격을 기반으로 규칙적으로 표준화되어 나타난다. (0.02 초 (1초의 50번)이 디폴트값이다.)

이 함수 호출 이후 필요한 모든 물리 계산이 수행된다.

따라서 Rigidbody의 Addforce와 같은 물리연산의 영향을 받는 것들은 업데이트보다는 이 함수를 호출하는 것이 적합하다.

LateUpdate

Update와 마찬가지로 매 프레임 호출된다. 하지만 LateUpdate는 언제나 Update와 FixedUpdate가 호출된 이후에 호출된다. 

현재 프레임에서 모든 오브젝트에 LateUpdate가 호출되었을 때는 이미 Update와 FixedUpdate가 호출되었다는 것을 의미한다.

1인칭 카메라를 구현하는 경우, 현재 프레임에서 항상 오브젝트의 마지막 위치를 따라가도록 움직임을 구현할 때

LateUpdate의 이런 속성을 유용하게 활용할 수 있다.


OnDisable  

게임 오브젝트가 SetActive(false)되어 비활성화 되었을 때 호출된다. (Coroutine는 사용할 수 없다.)

OnDestory 

오브젝트가 Destroy되어 씬안에서 영영 없어지기전에 마지막 프레임 업데이트가 모두 끈난후 실행된다.

OnApplicationQuit 

응용프로그램 종료 전에 모든 오브젝트에서 호출된다.


씬에서 여러 오브젝트들이 함께 포함된 경우, 같은 순서레벨을 갖는 실행함수들 사이에서는 컴포넌트들마다 어느쪽이 먼저 실행되는지 예측할 수 없다. 
따라서 그 순서를 명확히 제어해 줄 필요가 있을 경우(Edit > Project Settings > Script Execution Order) 수동으로 순서를 조작해야 한다.

unity 실체 처리 흐름도 (http://unity-michi.com/post-453/)



'UnityEngine > Editor 시스템' 카테고리의 다른 글

[코루틴] Coroutine  (0) 2018.06.06


Vector3.StaticProperties

이 structure 는 Unity 전체에서 3D위치와 방향을 전달하는 데 사용된다. 


Vector3.magnitude

public float magnitude { get; } 백터의 길이(크기)를 반환
public float sqrMagnitude { get; } 백터의 길이를 제곱하여 반환 

거리를 비교하는 조건식을 쓸 때 보다 성능이 우수한 sqrMagnitude 를 사용할 것


Vector3.normalized

public Vector3 normalized { get; } 크기가 1인 백터로 반환한다. [읽기 전용]

public static Vector3 Normalize (Vector3 value) 해당 백터의 크기를 1로 만든다.


+ Recent posts