Unity가 편한 개발 엔진이라고 아무런 기본 지식 없이 마냥 닥치는대로 하려다보니 이래저래 어려움이 많다. 이 포스팅에서는 Unity를 사용하면서 개인적으로 계속 헷깔렸던 부분들을 정리 한다.
Transform.SetParent 의 worldPositionStays 인자
- worldPositionStays 가 true일 경우 :
SetParent시 자식이 되는 오브젝트의 월드 좌표는 변경되지 않는다(화면상으로 보기엔 그냥 그대로 있는것 같다는 말).
하지만 부모가 변경 되었으므로 로컬 좌표가 변경된다(이것을 이해하기 위해서는 월드 좌표와 로컬 좌표의 개념을 알아야 한다. 하지만 나는 이미 알고 있으므로 이 포스트에서는 다루지 않는다).
예를 들어 부모가 없는 두 오브젝트(부모가 없다는 것은 월드 포지션과 로컬 포지션이 같다는 의미) A가 (0, 1)에, 오브젝트 B가 (1, 0)에 있는 경우, SetParent 함수 호출시 worldPositionStays를 true로 하면 자식이 되는 오브젝트 B의 월드 포지션은 여전히 (1, 0)이고 부모와의 관계를 나타내는 로컬 포지션은 (1, -1)로 변경 된다(유니티 인스펙터에는 로컬 포지션이 표시된다). - worldPositionStatys가 false일 경우 :
자식이 되는 오브젝트의 로컬 좌표 값을 새로운 부모와 그대로 유지한다. 오브젝트 B가 오브젝트 A의 자식이 되는 경우 B의 로컬 포지션(1, 0)은 그대로 유지되며 대신 월드 포지션이 변경 된다.
LLVM(Low Level Vritual Machine)
프로그램을 컴파일 타임, 링크 타임, 런타임 상황에서 프로그램의 작성 언어에 상관 없이 최적화를 쉽게 구현할 수 있도록 구성. LLVM으로 언어에 가상 기계를 생성, 가상 기계가 언어에 독립적인 최적화를 실행한다.
IL2CPP(Intermediate Language to CPP)
- 내용이 길어 url로 설명을 대채 한다 https://blogs.unity3d.com/2015/05/06/an-introduction-to-ilcpp-internals/
유니티 2차원 좌표계
- 유니티는 x 축의 경우 왼쪽으로 갈수록 좌표 값이 감소, 오른쪽으로 갈수록 증가한다. y 축의 경우 아래쪽으로 갈수록 좌표 값이 감소, 위쪽으로 갈수록 증가 한다.
- 단, GUI와 GUILayout의 경우, y 축이 내려갈수록 증가한다.
Resources
- Assets 폴더 밑 어느 곳에라도 Resources 폴더를 만들고 asset들을 넣어두면 Resources.Load로 접근 가능
- 개인적으로 Resources 폴더를 어디에 만들어야 할지 몰라 한참을 고생했었기에 기록에 남긴다.
- Resources 디렉토리 밑에 스프라이트를 두면 SpritePacker로 아틀라스를 만들지 못한다.
- http://docs.unity3d.com/ScriptReference/Resources.html
GameObject
- Unity scene 안에 있는 모든 것들의 베이스 클래스
- http://docs.unity3d.com/ScriptReference/GameObject.html
Transform
- http://docs.unity3d.com/ScriptReference/Transform.html
- scene 안에 있는 모든 객체들이 가지고 있는 위치, 스케일, 회전 정보
- transform은 부모 transform을 가질 수 있다
- localPosition은 부모의 transform에 상대적 위치 정보
- GetComponentXXX<T> 함수들을 잘 이용하면 객체들을 찾기가 쉬워진다.
RectTransform
- http://docs.unity3d.com/ScriptReference/RectTransform.html
- 주로 UI를 위해 사용 됨(아마도..)
- 위치, 사이즈, 앵커, 피봇 관련 정보들을 담고 있음
- sizeDelta : RectTransform의 앵커 기준 상대적 사이즈. 만일 앵커가 붙어 있다면 sizeDelta는 size와 동일하다. 만일 앵커가 부모의 각 네 코너에 맞춰져 있다면 sizeDelta는 부모의 사각형 대비 얼마나 크거나 작은지를 나타낸다.
- rect : eg. rectTransform.rect.height 으로 RectTransform 객체의 높이를 가져 올 수 있다
Gizmo
- 유니티에서 씬뷰에서 디버깅에 필요한 비주얼 요소를 제공
- http://docs.unity3d.com/ScriptReference/Gizmos.html
- http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnDrawGizmos.html
애니메이션 종료 여부 알아 내기
SVN 연동시 무시 되어도 될 디렉토리와 파일 리스트
- http://answers.unity3d.com/questions/22604/which-unity-project-files-can-be-ignored-for-versi.html
- http://docs.unity3d.com/Manual/ExternalVersionControlSystemSupport.html
안드로이드에서 파일 read/write 하기
- http://forum.unity3d.com/threads/help-with-access-write-files-on-android.72819/
- Application.dataPath는 write access를 하면 안된다
saving and loading player game data in unity
- http://www.sitepoint.com/saving-and-loading-player-game-data-in-unity/
- http://gamedevelopment.tutsplus.com/tutorials/how-to-save-and-load-your-players-progress-in-unity--cms-20934
4.6 UI Text rect does not expand automatically
- http://answers.unity3d.com/questions/789561/46-ui-text-rect-does-not-expand-automatically.html
- http://docs.unity3d.com/Manual/BuildingAssetBundles5x.html
ScreenToWorldPoint
- 유니티의 입력 값은 스크린 좌표 값인데 게임월드 상의 오브젝트를 다루려면 월드 좌표를 사용해야 한다. 이를 위해서 유니티에서는 ScreenToWorldPoint(http://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html) 함수를 제공한다.
Touch Input Position
- Event.current.mousePosition은 화면의 좌하단이 (0, 0)이다.
- 터치 입력과 같은 좌표계(화면 좌 상단이 0, 0)를 사용하는 Input.mousePosition(http://docs.unity3d.com/ScriptReference/Input-mousePosition.html)을 사용하자.
BoxCollider
- BoxCollider 를 설정하고 IsTrigger 옵션을 선택하면 OnCollisionXXX 대신 OnTriggerXXX 함수가 호출 된다. IsTrigger 셋팅이 되어있다면 오브젝트간 물리적 상호 작용은 없고 서로 겹칠때 알림만 온다.
Dictionary 시리얼라이즈
content size fitter
부모 객체의 rect를 자식 객체들에 맞춰서 변경 시켜주는 역할. 하지만 자식에 Vertical Layout 혹은 Horizon Layout 같은 Layout이 붙어야 한다. 텍스트 같은 경우는 아마도 예외인것 같다.