인벤토리 시스템

  • 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/