一、模型准备
共需准备两个模型,一个原始模型,一个破碎后的模型。
破碎后的模型制作教程:
- 下载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);}}}
}