인벤토리 시스템
- https://rito15.github.io/posts/unity-study-rpg-inventory/
FixedUpdate
- https://rito15.github.io/posts/unity-fixed-update-and-stuttering/
Application.targetFrameRate
를 이용하여 프레임레이트 지정 (Fixed Time Step이 0.02일때 targetFrameRate는 50)- edit > project settings > time에서 Fixed Time Step변경 (기본값 0.02) (1 / Frame Rate)계산하여 입력
-
targetFrameRate 설정 후 Fixed Time Step을 맞추어 조정
- 캐쥬얼, 아케이드 30
- FPS, 액션 게임 60
객체참조
- https://rito15.github.io/posts/unity-bad-coding-practices/
- GameObject.Find()는 비추천
- public, [SerializeField] private 선언하여 드래그 드랍으로 참조
- FindObjectOfType<> 통해 클래스 타입으로 참조
StartCoroutine(nameof(MyCoroutine));
- nameof()를 사용하면 변수, 메서드, 클래스 이름을 문자열 상수로 사용가능 메서드 이름이 변경되거나 할때 바로 에러를 띄움
LayerMask.NameToLayer("Post Processing");
레이어 마스크를 문자열로 찾는 방법- 상수를 담고있는 클래스 형태로 문자열을 관리하고 해당 상수에서 문자열을 가져다 쓴 것이 가장 나아보임
Transform
변환
- https://rito15.github.io/posts/unity-transform-transformation-methods/
- TransformPoint() : 위치, 회전, 크기 변환 적용
- TransformVector() : 회전, 크기 변환 적용
- TrnasformDirection() : 회전 변환 적용
월드-로컬
- InverseTransformPoint()
- InverseTransformVector()
- InverseTransformDirection()
- 내적을 통해 적이 캐릭터의 왼쪽 또는 오른쪽에 있는지 파악
Vector3 enemyPos = ...; // 적의 현재 월드 위치
Vector3 playerPos = transform.position; // 플레이어 캐릭터의 현재 월드 위치
Vector3 playerToEnemyDir = enemyPos - playerPos;
Vector3 localEnemyDir = transform.InverseTransformDirection(playerToEnemyDir);
float d = Vector3.Dot(localEnemyDir, Vector3.right);
// d >= 0 : 적은 플레이어 캐릭터의 우측에 존재
// d < 0 : 적은 플레이어 캐릭터의 좌측에 존재
- https://rito15.github.io/posts/unity-rigidbody-and-collider/
- 2D의 경우 OnTriggerEnter2D(Collider2D)
Collision
- isTrigger가 체크되면 안됨
- OnCollisionEnter(Collider)
- OnCollisionStay(Collider)
- OnCollisionExit(Collider)
Trigger
- OnTriggerEnter(Collider)
- OnTriggerStay(Collider)
- OnTriggerExit(Collider)
RigidBody
- Rigidbody.position
-
Rigidbody.rotation
- 물리조작의 움직임은 FixedUpdate()에서
- Is Kinematic 체크시 물리적움직임이 고정, AddForce()도 적용안됨.
- 플랫폼, 여닫이문, 발판
내적 외적 활용
- https://rito15.github.io/posts/game-math-dot-cross/
Queue
- https://rito15.github.io/posts/unity-process-after-initalization/
private Queue<Action> afterInitJobQueue = new Queue<Action>();
afterInitJobQueue.Enqueue(() => playerList.Add(player)); //집어넣기
Action action = afterInitJobQueue.Dequeue(); //꺼내기
action?.Invoke(); //호출하기
afterInitJobQueue = null; //힙에서 해제하기
- Action이라는 타입으로 메서드를 등록하고 호출이 가능
스크립트로 태그, 레이어 추가
- https://rito15.github.io/posts/unity-add-tag-or-layer-in-script/
[System.Diagnostics.Conditional("UNITY_EDITOR")]
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty tagsProp = tagManager.FindProperty("tags");
tagsProp.GetArrayElementAtIndex(인덱스); //인덱스값으로 태그 가져오기
SerializedProperty n = tagsProp.InsertArrayElementAtIndex(tagCount); //배열에서 인덱스에 빈요소 삽입
n.stringValue = "태그명";
tagManager.ApplyModifiedProperties(); //태그적용
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty layersProp = tagManager.FindProperty("layers");
//나머지 이용법은 tag와 동일
- 배열.InsertArrayElementAtIndex(인덱스); //배열에서 지정된 인덱스에 빈요소 삽입하기
- string.IsNullOrWhiteSpace(문자열); //글자가 없거나 스페이스로만 되어있는지 검사 (true/false)
[InitializeOnEnterPlayMode] //플레이 모드에 진입하면
[InitializeOnLoadMethod] //온로드 되면
AddNewLayer("레이어 이름"); //레이어 이름 추가
레이케스트
- https://rito15.github.io/posts/raycast-to-aabb/
물리기반 먼지 시뮬레이터
- https://rito15.github.io/posts/unity-million-dust-simulation/
데이터 직렬화
- https://rito15.github.io/posts/unity-serialize-tree-object/