오브젝트 폭발 시키기, 산산조각 내기

정제로·2023년 10월 12일
0

Unity

목록 보기
18/19

게임을 하다보면 아래와 같이 플레이어나 적, 아이템등이 산산조각 나는 효과를 본적 있을것이다

이와 똑같이는 아니지만 비슷하게 구현할 수 있는 방법이 있어 소개하겠다

Project ExplodeDebris 폭발하여 산산조각내기 프로젝트

우선 일반 형태의 오브젝트1개, 산산조각낼 형태의 오브젝트 1개가 필요하다

사진과 같이 일반 형태의 오브젝트(우)와 산산조각낼 형태의 오브젝트(좌)를 만들었다.

이중 중요한 것은 좌측의 산산조각낼 형태의 오브젝트이다.
자세히 살펴보자

Debris Object


크게 잘 살펴보면 이와같이 산산조각내어질 형태의 작은 오브젝트가 수십개 모여서
하나의 큰 큐브 형태 (일반 형태의 오브젝트와 같은크기)로 생성되어있다.

최상위 오브젝트는 여러개의 산산조각내어질 Debris들을 담은 빈 오브젝트이다.

코드

코드는 비교적 간단하다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DebrisCube : MonoBehaviour
{
    public GameObject debrisPrefab = null;      //파편프리팹오브젝트
    public float explodeForcePower = 0f;        //파편이 튕겨져 나갈 파워
    public Vector3 debrisOffset = Vector3.zero; //파편이 튕겨져 나갈 위치

    public void Explosion()
    {
        GameObject clonePrefab = Instantiate(debrisPrefab, transform.position, Quaternion.identity); // var에 프리팹 생성해서 담아주기

        Rigidbody[] cloneRigids = clonePrefab.GetComponentsInChildren<Rigidbody>(); // 자식오브젝트의 RigidBody컴포넌트를 전부 Rigidbody배열에 담아주기

        for (int i = 0; i < cloneRigids.Length; i++)
        {
            cloneRigids[i].AddExplosionForce(explodeForcePower, transform.position + debrisOffset, 10f);
        }
        gameObject.SetActive(false);
    }
}

구현방식은 아래와 같다.

  1. 위에서 생성한 Debris들을 담은 빈 오브젝트를 프리팹 화 시킨다.
  2. 해당 오브젝트와 같은 크기의 오브젝트를 생성한다.
  3. 그 오브젝트의 컴포넌트로 위의 스크립트를 집어넣는다.
  1. Debris프리팹 연결시켜주기

  2. 필요한 부분에서 Explosion 실행시켜주기
    2-1. explosion이 실행될때, Debris프리팹 생성시켜주고, Rigidbody배열에 Debris프리팹의 모든 자식오브젝트의 Rigidbody컴포넌트 넣어주기

2-2. for문을 돌며 해당 Rigidbody배열 내부에 있는 모든 값들을 AddExplosionForce를 이용하여 폭발효과 준 후 본 오브젝트 꺼주기 (켜져있으면 터졌음에도 계속 모양이 남아있어서 이상함)

추가적으로 코루틴을 이용하여 자동적으로 생성되고 터지도록 만들었다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DebrisCube : MonoBehaviour
{
    public GameObject debrisPrefab = null;      //파편프리팹오브젝트
    public float explodeForcePower = 0f;        //파편이 튕겨져 나갈 파워
    public Vector3 debrisOffset = Vector3.zero; //파편이 튕겨져 나갈 위치

    public void Explosion()
    {
        GameObject clonePrefab = Instantiate(debrisPrefab, transform.position, Quaternion.identity); // var에 프리팹 생성해서 담아주기

        Rigidbody[] cloneRigids = clonePrefab.GetComponentsInChildren<Rigidbody>(); // 자식오브젝트의 RigidBody컴포넌트를 전부 Rigidbody배열에 담아주기

        for (int i = 0; i < cloneRigids.Length; i++)
        {
            cloneRigids[i].AddExplosionForce(explodeForcePower, transform.position + debrisOffset, 10f);
        }
        gameObject.SetActive(false);
    }

    IEnumerator Make()
    {
        while (true)
        {
            yield return new WaitForSeconds(1f);
            float x = transform.position.x;
            Instantiate(gameObject, new Vector3(x, transform.position.y, transform.position.z), Quaternion.identity);
            x += 5;
            yield return new WaitForSeconds(0.3f);
            Explosion();
        }
    }

    void Start()
    {
        StartCoroutine(Make());
    }
}

결과!

profile
초보자입니다.. 잘못된 정보, 달게 받겠습니다..

0개의 댓글