ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 폭발 처리
    카테고리 없음 2025. 5. 13. 10:14

    Unity의 물리 엔진을 사용하지 않고도 폭발에 의한 유닛 튕겨나감을 공식으로 직접 구현할 수 있습니다.

    ✅ 핵심 아이디어

    1. 폭발 중심점에서 유닛까지의 방향 벡터 계산
    2. 거리 기반으로 힘의 세기를 감소
    3. 해당 방향으로 속도(또는 위치)를 직접 갱신

    🔧 예제 코드 (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 액션 등)에 맞춰 조정 가능

     

Designed by Tistory.