粗略解析《Nvidia Flast For Unity Example》

工程github地址:GitHub - NVIDIAGameWorks/Blast: A modular destruction SDK designed for performance and flexibility, replacing APEX destruction

        首先我们需要知道它用在哪里,这个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值