-
Unity의 물리 엔진을 사용하지 않고도 폭발에 의한 유닛 튕겨나감을 공식으로 직접 구현할 수 있습니다.
✅ 핵심 아이디어
- 폭발 중심점에서 유닛까지의 방향 벡터 계산
- 거리 기반으로 힘의 세기를 감소
- 해당 방향으로 속도(또는 위치)를 직접 갱신
🔧 예제 코드 (Rigidbody 없이 구현)
using UnityEngine; public class ExplosionNoPhysics : MonoBehaviour { public float radius = 5f; public float explosionForce = 10f; public AnimationCurve forceOverDistance; // 거리별 힘 조절용 커브 (선택) public void Explode() { // 범위 내 유닛 찾기 Collider[] colliders = Physics.OverlapSphere(transform.position, radius); foreach (var col in colliders) { // 대상이 폭발 반응 가능한 유닛인지 확인 var unit = col.GetComponent<FakePhysicsUnit>(); if (unit != null) { Vector3 dir = (col.transform.position - transform.position).normalized; float distance = Vector3.Distance(transform.position, col.transform.position); float distanceRatio = Mathf.Clamp01(distance / radius); // 거리 기반 힘 감소 (예: 커브 또는 역제곱) float power = explosionForce * (1 - distanceRatio); // 또는: float power = explosionForce / (distance * distance + 1); unit.AddVelocity(dir * power); } } } }
🔧 유닛 쪽 스크립트 예제 (FakePhysicsUnit.cs)
using UnityEngine; public class FakePhysicsUnit : MonoBehaviour { Vector3 velocity; public float gravity = 9.8f; void Update() { // 중력 적용 velocity.y -= gravity * Time.deltaTime; // 위치 갱신 transform.position += velocity * Time.deltaTime; // 바닥 도달 시 멈춤 처리 등 if (transform.position.y < 0f) { transform.position = new Vector3(transform.position.x, 0f, transform.position.z); velocity = Vector3.zero; } } public void AddVelocity(Vector3 v) { velocity += v; } }
📌 보충 설명
- AddVelocity(): 외부에서 힘을 전달하는 인터페이스
- Gravity 적용: 간단한 수직 낙하 효과
- **AnimationCurve**를 사용하면 거리 기반 힘 감소를 더 자연스럽게 조절할 수 있습니다
- OverlapSphere는 여전히 사용 중이지만, 물리 계산 없이 위치만으로 충돌체 탐지를 합니다
🎮 장점
- Rigidbody 없이 가벼운 구현
- 더 정밀한 커스터마이징 가능 (공중 회전, 경직 등 추가도 쉬움)
- 게임 스타일(예: RTS, 2D 액션 등)에 맞춰 조정 가능