유니티 오브젝트 파괴/파편 (Collider/Rigidbody 이용)

in #unity7 years ago (edited)

게임 배경 리소스를 제작하다보면, 오브젝트 중에서 캐릭터가 파괴 시킬수 있는 오브젝트가 필요합니다.

이러한 파괴 가능한 오브젝트를, 유니티의 Rigidbody를 이용해서, 파괴 오브젝트로 만들 수 있습니다.

Collidr (콜라이더 ): Collider 컴포넌트는 물리 충돌 처리를 위한 오브젝트의 형태를 정의합니다.
콜라이더는 보이지 않는 요소이므로 오브젝트의 메시와 정확히 동일한 모양일 필요는 없으며,
실제로는 게임플레이 시에는 대략적인 근사치로도 크게 구분되지 않으며 더 효율적입니다.

Rigidbody(리지드바디) : Rigidbody 는 GameObject 가 물리 제어로 동작하게 합니다.
리지드바디는 힘과 토크를 받아 오브젝트가 사실적으로 움직이도록 해줍니다.
리지드바디가 포함된 모든 게임 오브젝트는 중력의 영향을 받아야 하며 스크립팅을 통해 가해진 힘으로 움직이거나 NVIDIA PhysX 물리 엔진을 통해 다른 오브젝트와 상호 작용해야 합니다.

Collider 범위를 이용한 오브젝트 제어를, 아래 글에서 읽어보시면, 배경 그래픽 디자이너도 쉽게

유니티 스크립트를 제작해서 만들 수 있습니다.

유니티에서는 RigidBody가 적용된 오브젝트 2개를 서로 겹치게 배치하고, 플레이 버튼을 실행하면

서로 튕겨내는 것을 확인 할 수 있습니다.

이렇게 서로 튕겨내는 성질을 이용해서 파괴 오브젝트를 스크립트로 제어가 가능합니다.

내장된 RigidBody를 이용하는것이기 때문에 비용적인 측면에서도 크게 비싸지 않을것입니다.

디아블로3 처럼 화면에 몇 십개씩 존재하는 파괴 오브젝트도 스크립트 한개로 제어가 가능합니다.

  1. 우선 파괴 시킬 오브젝트를 준비 해야 합니다.
  • 파괴 시킬 오브젝트를 폴리곤 단위로 분리는 해야 합니다. 자동으로 유니티에서 분리시켜 파괴되지 않으니까..

  • 파괴 시킬 오브젝트는 대략 5-7개 정도로 분리하는게 적당.

  1. 주니된 파괴 오브젝트를 Assets 으로 등록합니다.

  2. Game object > Create Empty
    빈 오브젝트를 만들고 빈 오브젝트에 자식으로 파괴 오브젝트를 등록 합니다.

4.등록된 오브젝트에 Collider 와 Rigidbody 컴포넌트를 추가
부모로 만든 빈 오브젝트와 자식으로 등록된 오브젝트에 Box Collider와 Rigidbody 컴포넌트를 추가합니다.
Box Collider와 RIgidbody 컴포넌트 또한 스크립트로 추가가능.

  1. 파괴될 오브젝트의 컴퍼넌트 Rigidbody -> Constraints 를 보면 Freeze Position XYZ, Freeze Rotation XYZ 가 있습니다.
  • Position , Rotation의 X,Y,Z 부분을 모두 체크해서, Freeze 시키면, 파편들이 안 움직입니다.

  • Constraints 를 Freeze 체크, 체크 해제가 스크립트의 핵심 부분이 될 것입니다.

  • 부모로 만든 빈 오브젝트의 Collider 범위를 무기가 접촉(OnTriggerEnter)을 하면 자식 오브젝트의 Constraints를 체크 해제하면 됩니다.

  1. 부모로 만든 빈 오브젝트의 "Box Collider -> Is Trigger를 체크.(파괴될 자식 오브젝트는 이 부분 체크 안합니다.)
  • 부모로 만든 빈 오브젝트의 Collider 의 위치와, 크기 조절을 합니다.
  1. Project 탭에서 마우스 오르쪽 버튼을 클릭해서 Create -> C# 스크립트 선택하고, 스크립트를 만들어 줍니다.
  • 대소문자 주의!

아래는 스크립트입니다.
using UnityEngine;
using System.Collections;

public class destroyobject : MonoBehaviour { // destroyobject 는 스크립트 이름입니다.

  public Collider[] colliders;                           // 자식오브젝트에 순차적으로 컴퍼넌트를 값을 변경하기 위한 배열
  public float Mass = 1;                                  // Rigidbody Mass 제어
  public float Drag = 2;                                   // Rigidbody Drag 제어

 void Awake(){                                           // 실행 전, 사전 준비를 하기 위해서 Awake() 사용합니다.

   colliders = gameObject.GetComponentsInChildren<Collider>();   // 자식 오브젝트의 컴퍼넌트를 가져옵니다.
   foreach(Collider item in colliders)                                         // For 문과 비슷하게 자식 오브젝트 개수만큼 반복
       {
         item.rigidbody.constraints = (RigidbodyConstraints)126;    // rigidbody.constraints 값을 수정(Freeze All 상태)
         item.rigidbody.mass = Mass;
         item.rigidbody.drag = Drag;
       }

}

  void OnTriggerEnter(Collider col)      //부모로 만든 빈 오브젝트의 Collider를 건드리면 (누가 건드렸는지 확인)
   {
    if(col.tag == "Weapon")                 // 만약 "Weapon" 태그로 지정된 무기가 Collider를 건드리면
       {
         colliders = gameObject.GetComponentsInChildren<Collider>();
         foreach(Collider item in colliders)
            { 
              item.rigidbody.constraints = (RigidbodyConstraints)0;     //rigidbody.constraints 체크 해제
              Destroy(gameObject, 10);                                           // 파괴된 오브젝트는 10초 후에 삭제, 사라지게함
           }
      }
  }

}

  1. 부모로 만든 빈 오브젝트에 스크립트를 적용하면 됩니다.
  • Mass, Drag 부분은 직업 수치를 입력해서 파괴되는 오브젝트의 중력을 제어 가능

파괴 성공
GetComponentsln Children > 자식오브젝트의 컴포넌트를 가져 올 수 있음

public Collider[] colliders;

 void Awake(){                                           

   colliders = gameObject.GetComponentsInChildren<Collider>();   
   foreach(Collider item in colliders)                                         
       {
         item.rigidbody.constraints = (RigidbodyConstraints)126;

        }

}

Sort:  

Congratulations @bustbit, you have decided to take the next big step with your first post! The Steem Network Team wishes you a great time among this awesome community.


Thumbs up for Steem Network´s strategy

The proven road to boost your personal success in this amazing Steem Network

Do you already know that @originalworks will get great profits by following these simple steps, that have been worked out by experts?

Coin Marketplace

STEEM 0.16
TRX 0.15
JST 0.028
BTC 54225.25
ETH 2280.38
USDT 1.00
SBD 2.29