[내일배움캠프 Unity 9기]

05/22 TIL 및 개인 과제 마무리

kyvv 2025. 5. 22. 22:40

## 🚉 이동 발판 위의 플레이어 이동 처리

- **문제**: 이동 중인 발판 위에 서 있는 플레이어가, 발판의 움직임에 따라 자연스럽게 따라가야 함.
- **기본 해결 방법**:
  - 발판의 `Rigidbody.velocity`를 매 프레임 `플레이어의 velocity`에 **더해주는 방식**이 일반적이다.
  - 이를 위해 Player 쪽에서 `isOnMovingPlatform` 상태를 체크하고, `curPlatform.velocity`를 가져와 반영해야 한다.
- **점프 시 고려 사항**:
  - 발판이 움직이고 있을 때 점프하면, 발판의 속도를 **점프에도 반영**해줘야 자연스러운 반응이 나온다.
  - 예: 점프할 때 `AddForce(jumpPower + curPlatform.velocity)` 방식으로 처리.

---

## 🔦 Raycast 처리 위치 (Update vs FixedUpdate)

- **Raycast는 물리 연산이다**:
  - Unity에서 Raycast는 기본적으로 **Physics 엔진의 연산**으로 취급되며, `FixedUpdate`에서 다루는 것이 이상적이다.
- **FixedUpdate가 적합한 이유**:
  - Rigidbody, Collider, Raycast 등은 **Fixed timestep**에 맞춰 업데이트되므로 이 안에서 호출하면 충돌 검사도 더 정확하고 예측 가능하다.
- **예외 상황**:
  - 프레임 렌더링 기준(시각적 표시)이나 UI 반응용 Raycast라면 `Update`에서 처리해도 무방하다.
- **Tip**: 너무 자주 검사할 필요가 없다면 `Time.time`과 `lastCheck` 등을 활용해 **0.1초 간격 검사**처럼 타이밍 제어 가능.

---

## 💥 OnCollision 관련 문제 해결

- **OnCollisionStay / Enter / Exit 사용 조건**:
  - 충돌 처리를 위해서는 두 오브젝트 중 **하나는 Rigidbody**, 다른 하나는 Collider여야 하며, 최소 하나는 `isKinematic == false`여야 함.
  - `OnCollision`은 **Collider가 isTrigger == false**일 때만 동작한다.
- **자주 호출되는 OnCollisionStay**:
  - 프레임마다 호출되기 때문에 불필요한 연산을 피하기 위해 **Tag 조건, LayerMask 조건, 상태 체크** 등을 병행해 사용해야 한다.
  - 예: `if (collision.gameObject.CompareTag("MovingPlatform")) { ... }`
- **OnTrigger와 혼용 주의**:
  - `OnTriggerEnter/Stay`는 Collider의 `isTrigger`가 true일 때 동작하므로, 혼용 시 조건과 구조를 명확히 해야 한다.

---

## 👤 플레이어 싱글톤화의 장단점

- **장점**:
  - 어디서든 `Player.Instance`를 통해 쉽게 접근 가능.
  - 게임 전체에서 유일한 플레이어 오브젝트를 관리하기 편하다.
- **단점 / 주의점**:
  - 다른 스크립트들이 플레이어를 **직접 참조**하게 되면, 종속성이 커지고 **유닛 테스트나 재사용이 어려워짐**
  - 발판 등 여러 오브젝트가 플레이어를 바라보면, **역참조가 복잡**해질 수 있다.
- **대안**:
  - 이벤트 기반 시스템 (예: `OnPlatformTouched`)으로 decoupling.
  - 필요 시 `FindObjectOfType<PlayerController>()`나 `Interface` 활용도 가능.

---

## 🔄 코루틴 실행 수와 동시성

- **코루틴은 동시에 여러 개 실행 가능**하다.
  - 예: `StartCoroutine(MovePlatform());`를 여러 오브젝트에서 동시에 호출해도 각자의 흐름으로 독립 실행됨.
- **주의 사항**:
  - 코루틴 간에 **공유 자원(예: static 변수)** 을 사용하면 경합이 생길 수 있음.
  - 코루틴 내부에서 `WaitForSeconds`, `yield return`을 적절히 사용해 흐름을 조절해야 함.
- **유용한 패턴**:
  - 발판의 왕복 이동, 공격 쿨다운, 애니메이션 타이밍 등 시간 흐름이 중요한 로직에 적합.