Part 5:GPU力场游戏对象

我们可以按现在的样子使用力场,但现在使用它并不是很直观。我们要编写一个小脚本,把力场作为一个游戏对象以便进行控制,这样我们能够轻松地在场景中将力场可视化,像处理普通对象一样进行缩放。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
[ExecuteInEditMode]
public class GPUParticleForceField : MonoBehaviour
{
    public Material material;
 
    void LateUpdate()
    {
        material.SetFloat("_ForceFieldRadius", transform.lossyScale.x);
        material.SetVector("_ForceFieldPosition", transform.position);
    }
 
    void OnDrawGizmos()
    {
        Gizmos.DrawWireSphere(transform.position, transform.lossyScale.x);
    }
}

ExecuteInEditMode属性允许脚本在编辑器未处于运行模式时执行,这样我们就可以使用脚本并即时查看结果。

我们定义了公开引用,用于指定使用CPU对象的力场材质。然后在LateUpdate函数中设置材质的半径和位置属性,以便应用于对该对象的任何改动和移动。

标量浮点半径和向量位置分别由对象Transform(X轴)的世界坐标大小和位置进行设置。世界坐标大小指总体大小,所以我们将该值除以2来用作半径,否则我们会传入直径作为半径。

我们使用OnDrawGizmos函数以及Transform位置和X轴的世界坐标大小,绘制球体线条来表示球体大小。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
[ExecuteInEditMode]
public class GPUParticleForceField : MonoBehaviour
{
    public Material material;
 
    void LateUpdate()
    {
        material.SetFloat("_ForceFieldRadius", transform.lossyScale.x / 2.0f);
        material.SetVector("_ForceFieldPosition", transform.position);
    }
 
    void OnDrawGizmos()
    {
        Gizmos.DrawWireSphere(transform.position, transform.lossyScale.x / 2.0f);
    }
}

现在将该脚本添加到游戏对象,并将材质拖到Material栏,我们就得到了下图的效果。
「U3D」GPU粒子力场

Part 6:粒子噪声

现在我们已经大致完成了,下面对粒子系统进行一些调整,使它获得预览图的效果。

启用Colour over Lifetime模块,应用快速浅入-维持原状-以合适时长淡出的变化效果。
「U3D」GPU粒子力场

启用Noise模块,将Frequency设为0.15,Scroll Speed设为0.25。
「U3D」GPU粒子力场

现在我们得了预览图的效果。