首先我们需要知道它用在哪里,这个Nvidia Flast主要是一套模拟破碎效果的方案,这里给出一些Nvidia的示例图:
运行场景test可以看到具体效果,在Unity的Hierarchy面板中可以看到主要的代码一共就两个,一个控制摄像机移动的代码挂载Main Camera物体下,另一个控制整个场景主要逻辑的代码demo被挂载在Demo的空物体上。其他预制都是场景中演示时需要用到的物体,包括一个directional Light灯光以及一个Plane用于放置生成出来的“City”的平板,一个用于演示施加受力点的HitSphere小球游戏物体。
抛开控制摄像机的常规移动逻辑代码不谈,这里Demo主要的逻辑放在Demo物体下的Demo代码中,而Demo的实现看起来也十分简单易懂,只有一个在Awake生命周期里实现生成模拟的“City”的代码方法generateCity以及一个在Update里实时检测Hit施加力的代码方法 applyRadialDamage。施加力的代码比较简单这里就不赘述了,源码如下所示:
private IEnumerator applyRadialDamage(Vector3 position, float minRadius, float maxRadius, float compressive, float explosive = 3000.0f)
{
var hits = Physics.OverlapSphere(position, maxRadius);
foreach (var hit in hits)
{
var rb = hit.GetComponentInParent<Rigidbody>();
var family = hit.GetComponentInParent<CubeFamily>();
if (rb != null && family != null)
{
family.ApplyRadialDamage(rb, position, minRadius, maxRadius, compressive);
}
}
yield return new WaitForEndOfFrame();
hits = Physics.OverlapSphere(position, maxRadius);
foreach (var hit in hits)
{
var rb = hit.GetComponentInParent<Rigidbody>();
if (rb != null)
{
rb.AddExplosionForce(explosive, position, maxRadius, 3.0f);
}
}
}
private void Update()
{
hitSphere.SetActive(false);
bool isActive = false;
if (true)
{
var ray = Cam