一、模型准备
共需准备两个模型,一个原始模型,一个破碎后的模型。
破碎后的模型制作教程:
- 下载Blender 导入原始模型
- 在添加偏好设置中添加Cell Fracture插件,调整模型碎裂效果。
- 导出,保存到项目预制体文件夹。
二、导入项目
将原始文件预制体拖入场景中,添加刚体,碰撞器等组件。组件属性效果根据项目自行调优。
三、为冰山添加自定义脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Crest;
public class IceBreak : MonoBehaviour
{
public GameObject brokenAfter; // 冰块破碎后的预制体
public float forceMultiplier = 1.0f; // 施加给碎片的力的倍数
public float maxRotationSpeed = 10.0f; // 碎片的最大旋转速度
void OnCollisionEnter(Collision collision)
{
Debug.Log("碰到了");
BreakIce();
return;
}
//碰撞效果
void BreakIce()
{
// 销毁原始冰块
Destroy(gameObject);
/*gameObject.SetActive(false);*/
// 实例化破碎的冰块碎片
if (brokenAfter != null)
{
// 在冰块位置实例化碎片
GameObject pieceInstance = Instantiate(brokenAfter, transform.position, Quaternion.identity);
//获取每个碎片子对象
GameObject[] p = new GameObject[pieceInstance.transform.childCount];
for (int i = 0; i < p.Length; i++)
{
p[i] = pieceInstance.transform.GetChild(i).gameObject;
//为碎片添加刚体
Rigidbody rb = p[i].AddComponent<Rigidbody>();
rb.mass = 10000; //质量
rb.drag = 10; //阻力
rb.useGravity = true; //重力
rb.angularDrag = 2; //角阻力
//为子对象添加Crest框架浮力脚本
var s = p[i].AddComponent<SimpleFloatingObject>();
s._boyancyTorque = 2f;
s._accelerateDownhill = 0.15f;
//添加网格碰撞器
MeshCollider Collider = p[i].AddComponent<MeshCollider>();
Collider.convex = true; //碰撞器形状设为凸面
// 随机施加力和旋转速度
Vector3 force = Random.insideUnitSphere * forceMultiplier;
rb.AddForce(force, ForceMode.Impulse);
}
}
}
}