Unity로 건물이나 3D Model이 부서져 무너지는 효과를 만드는 방법
Probuilder Package를 이용해 건물이 부서졌을때 조각나는 부위의 GameObject들을 만들고 건물이 부서지면 미리 조각해놓은 오브젝트로 대체해버리는 방식
Probuilder Package로 건물을 조각낼때 조각낼 부위를 Cube GameObject를 사용해 범위를 지정해줄수 있음
- Probuilder 설치
Unity Package Manager에 가서 Probuilder를 설치, 필자의 경우 Probuilder 5.0.7 version을 사용
부서질 모델 오브젝트에 Probuilder MeshFilter Component를 추가할 예정
- Probuilder MeshFilter 추가
오브젝트가 부서졌을 때 조각난 오브젝트들을 만들기 위해, 부서질 오브젝트에 Probuilder MeshFilter를 추가
- 부서질 오브젝트의 Mesh Component가 있는 GameObject를 선택
- Tools > Probuilder > Probuilder Window 선택
- Probuilder Window에서 Probuilderize를 선택하여 Mesh가 포함된 게임오브젝트에 Probuilder MeshFilter를 추가
- 3D Model을 자르기 위한 Cube 생성
3DModel의 자르고자 하는 부위에 Cube를 생성
Cube 또한 위와 같이 Probuilder MeshFilter를 설정해 줘야 함
- 조각낼 범위를 Cube GameObject를 이용해 잡아줌
- 3D Model 조각내기
3D Model을 조각내기 위해선 Probuilder의 Experimental Features를 enabled 해야 함
- Unity > Preferences > Probuilder 로 들어가 Experimental Features Enabled를 체크
- Tools > Probuilder / Experimental > Boolean(CSG) Tool 로 이동해 자르기 시작
- Probuilder MeshFilter Component를 가진 3D Model과 Cube를 양쪽에 Drag하여 수행
- 자르고자 하는 Model을 왼쪽에 자르는 범위를 설정하는 Cube는 오른쪽에 놓음
- Operation을 선택할 수 있음
- Intersection: Cube와 3D Model이 겹쳐진 부분의 3D Model 생성
- union: 두 오브젝트를 하나로 합침
- subtraction: Cube와 3D Model이 겹쳐진 부분이 제거된 3D Model 생성
- 새로 생성된 Model이 Camera의 방향에 따라 보여지지 않는 Issue가 있을 수 있음
- Probuilder Window로 이동하여 Vertex Selection 선택
- SetPivot를 클릭 하면 해당 이슈는 해결 됨
- 파괴효과 만들기
- 멀쩡한 3D Model과 위 방식을 이용해 파괴되었을때 쪼개진 게임오브젝트들을 가진 GameObject를 준비
- 쪼개진 게임오브젝트들을 가진 GameObject는 멀쩡한 3D Model 게임오브젝트와 Pivot의 위치를 똑같이 맞춰줌
- Intersection으로 자른 조각들에 Mesh Collider Component추가 후 Convex 활성화
- Intersection으로 자른 조각 GameObject에 Rigidbody Component도 추가
오브젝트가 파괴되었을때 원본 3D Model은 비활성화 혹은 Destroy 하고 조각난 게임오브젝트들을 가진 GameObject로 대체한 후 AddExplosionForce 함수로 힘을 준다
[SerializeField] private Transform pfBrokenObject;
public void DestroyObject()
{
Transform brokenObjectTransform = Instantiate(pfBrokenObject, transform.position, transform.rotation);
brokenObjectTransform.localScale *= 4f;
foreach(Transform child in brokenObjectTransform)
{
if (child.TryGetComponent<Rigidbody>(out Rigidbody childRigidbody))
{
childRigidbody.AddExplosionForce(100f, transform.position, 5f);
}
}
gameObject.SetActive(false);
}
'Unity' 카테고리의 다른 글
Unity 3D Object Drag & Drop (0) | 2024.06.04 |
---|---|
Unity Design Pattern - Object Pool (2) | 2024.06.03 |
Unity Android Plugin 만들기 (2) | 2024.01.28 |
Mac에서의 classes.jar 위치 (0) | 2021.10.31 |
[Unity] Animator Animation 재시작 방법 (0) | 2021.10.29 |