Visual Effect Graph——C# Component API

视觉效果组件API

为了在场景中创建一个视觉效果图(Visual Effect Graph)的实例,Unity使用了视觉效果组件(Visual Effect component)。视觉效果组件附加到场景中的游戏对象,并引用定义了视觉效果的视觉效果图。这允许您在不同的位置和方向创建不同的效果实例,并独立地控制每个效果。为了在运行时控制效果,Unity提供了c# API,你可以使用它来修改视觉效果组件和设置属性(Property)覆盖。

本文档展示了常见的用例,并描述了在使用组件API(component API)时需要考虑的良好实践。

设置一个视觉效果图

要在运行时更改视觉效果图,请分配一个新的视觉效果图资产给effect.visualEffectAsset属性。当您更改视觉效果图时,组件将重置其某些属性的值。

重置的值为:

  • 总时间:当您更改图形时,API调用Reset()函数,该函数将此值设置为0.0f。
  • 事件属性:组件丢弃所有事件属性Attribues

没有重置的值是:

  • 暴露的属性重载(Exposed Property Overrides):如果新的视觉效果图资产暴露了与前一个资产的属性具有相同名称和类型的属性,则此属性的值不会重置。
  • 随机种子和播放时重置的种子。
  • 默认事件重载。
  • 渲染设置重载。

控制播放状态

你可以使用API来控制效果回放。

通用控制:

Play :播放——使用effect.Play(),如果需要事件属性则使用effect.Play(eventAttribute)

Stop :停止——使用effect.Stop(),如果需要事件属性则使用effect.Stop(eventAttribute)

Pause :暂停——使用effect.pause = true或者effect.pause = false。Unity不会序列化这个变化。

Step :步骤——使用effect.AdvanceOneFrame ()。这只有在effect.pause被设置为true才有效。

Reset Effect :重置效果——使用effect.Reinit()

  • 将总时间(TotalTime)重置为0.0f。
  • 将默认事件重新发送到视觉效果图。

Play Rate :播放率——使用effect.playRate = value。Unity不会序列化这个变化。

默认事件

当视觉效果组件(或它所连接的GameObject)启用时,它将向图形发送一个事件(Event)。默认情况下,这个事件是OnPlay,这是生成环境(Spawn Contexts)的标准起点。

您可以通过以下方式更改默认事件:

  • 在“视觉效果检查器(Visual Effect Inspector)”上,更改初始事件名称字段。
  • 在组件API中:initialEventName = "MyEventName";。
  • 在组件API中:initialEventID = Shader.PropertyToID("MyEventName");。
  • 使用曝光属性助手类(ExposedProperty Helper Class)。

随机种子的控制

每个效果实例都有随机种子的设置和控制。您可以修改种子以影响视觉效果图使用的随机值。

  • resetSeedOnPlay = true/false:控制每次调用ReInit()函数时Unity是否计算一个新的随机种子。这导致视觉效果图使用的每个随机值都不同于之前的模拟。
  • startSeed = intSeed:手动设置随机数操作符用于为该视觉效果创建随机值的种子。如果resetSeedOnPlay设置为true,则Unity将忽略此值。

属性接口

要访问公开属性的状态和值,您可以在视觉效果组件中使用多个方法。大多数API方法允许通过以下方法访问该属性:

  • 字符串(string)的属性名。这很容易使用,但却是最不优化的方法。
  • 整型(int )的属性ID。要从字符串属性名生成此ID,请使用Shader.PropertyToID(string name)。这是最优化的方法。
  • 属性助手类(ExposedProperty Helper Class)。这结合了字符串属性名的易用性和整数属性ID的效率。

检查暴露的属性

您可以检查组件的视觉效果图是否包含特定的公开属性。要做到这一点,你可以使用来自以下组对应的属性类型的方法:

  • HasInt(property)
  • HasUInt(property)
  • HasBool(property)
  • HasFloat(property)
  • HasVector2(property)
  • HasVector3(property)
  • HasVector4(property)
  • HasGradient(property)
  • HasAnimationCurve(property)
  • HasMesh(property)
  • HasTexture(property)
  • HasMatrix4x4(property)

对于每个方法,如果视觉效果图包含正确类型的暴露属性,且具有与传入的名称或ID相同的名称或ID,则该方法返回true。否则方法返回false。

获取公开属性的值

组件API允许您在组件的视觉效果图中获取公开属性的值。要做到这一点,你可以使用来自以下组对应的属性类型的方法:

  • GetInt(property)
  • GetUInt(property)
  • GetBool(property)
  • GetFloat(property)
  • GetVector2(property)
  • GetVector3(property)
  • GetVector4(property)
  • GetGradient(property)
  • GetAnimationCurve(property)
  • GetMesh(property)
  • GetTexture(property)
  • GetMatrix4x4(property)

对于每个方法,如果视觉效果图包含正确类型的公开属性,并且具有与传入的名称或ID相同的名称或ID,则该方法将返回该属性的值。否则,该方法将返回属性类型的默认值。

设置公开属性的值

组件API允许您在组件的视觉效果图中设置公开属性的值。要做到这一点,你可以使用来自以下组对应的属性类型的方法:

  • SetInt(property,value)
  • SetUInt(property,value)
  • SetBool(property,value)
  • SetFloat(property,value)
  • SetVector2(property,value)
  • SetVector3(property,value)
  • SetVector4(property,value)
  • SetGradient(property,value)
  • SetAnimationCurve(property,value)
  • SetMesh(property,value)
  • SetTexture(property,value)
  • SetMatrix4x4(property,value)

每个方法都用传入的值覆盖相应属性的值。

重置属性覆盖和默认值

组件API允许您将属性重写回其原始值。为此,使用ResetOverride(property)方法。

事件

发送事件

组件API允许您在运行时将事件发送到组件的视觉效果图。为此,请使用以下方法之一:

  • SendEvent(eventNameOrId)
  • SendEvent(eventNameOrId, eventAttribute)

eventNameOrId参数可以是以下类型之一:

  • 字符串(string)的属性名。这很容易使用,但却是最不优化的方法。
  • 整型(int )的属性ID。要从字符串属性名生成此ID,请使用Shader.PropertyToID(string name)。这是最优化的方法。
  • 属性助手类(ExposedProperty Helper Class)。这结合了字符串属性名的易用性和整数属性ID的效率。

可选的eventAttribute参数将事件属性有效负载附加到事件。它们的有效负载提供了图形使用事件处理的数据。

注意:当您发送事件时,Visual Effect组件将在下一帧中处理它的下一个 Update()。

事件属性

事件属性是附加到事件上的属性,可以通过视觉效果图进行处理。要创建和存储事件属性,请使用VFXEventAttribute 类。视觉效果组件负责创建VFXEventAttribute 类的实例,并根据当前分配的视觉效果图创建它们。

创建事件属性

要创建VFXEventAttribute,请使用视觉效果组件的CreateVFXEventAttribute()方法。如果希望多次发送具有相同属性的相同事件,应该存储VFXEventAtrribute,而不是每次发送事件时都创建一个新事件。当您将一个事件发送到一个视觉效果图时,Unity会创建一个EventAttribute当前状态的副本并发送副本。这意味着,在发送事件之后,您可以安全地修改EventAttribute,而不会影响发送到视觉效果图的信息。

设置属性的有效负载

创建事件属性之后,使用与属性接口部分中描述的Has/Get/Set属性方法类似的API来设置属性有效负载。

  • Has : HasBoolHasVector3HasFloat,... 检查属性是否存在.
  • Get : GetBoolGetVector3GetFloat,... 获取属性的值.
  • Set : SetBoolSetVector3SetFloat,... 设置属性的值.

有关完整的属性API文档,请参阅Unity脚本参考中的VFXEventAttribute

属性名或ID可以是以下类型之一:

  • 字符串(string)的属性名。这很容易使用,但却是最不优化的方法。
  • 整型(int )的属性ID。要从字符串属性名生成此ID,请使用Shader.PropertyToID(string name)。这是最优化的方法。
  • 属性助手类(ExposedProperty Helper Class)。这结合了字符串属性名的易用性和整数属性ID的效率。

生命周期和兼容性

当您创建一个事件属性时,它与当前分配给视觉效果组件的视觉效果图形资产兼容。这意味着您可以使用相同的VFXEventAttribute将事件发送到相同图的其他实例。如果将可视化效果组件的visualEffectAsset属性更改为另一个图形,则不能再使用相同的VFXEventAttribute向其发送事件。

如果您希望在同一个场景中管理多个视觉效果实例,并希望共享事件有效负载,那么可以存储一个VFXEventAttribute,并在所有实例上使用它。

示例(在MonoBehaviour中)


VisualEffect visualEffect;
VFXEventAttribute eventAttribute;

static readonly ExposedProperty positionAttribute = "Position"
static readonly ExposedProperty enteredTriggerEvent = "EnteredTrigger"

void Start()
{
    visualEffect = GetComponent<VisualEffect>();   
    // Caches an Event Attribute matching the
    // visualEffect.visualEffectAsset graph.
    eventAttribute = visualEffect.CreateVFXEventAttribute();
}

void OnTriggerEnter()
{
    // Sets some Attributes
    eventAttribute.SetVector3(positionAttribute, player.transform.position);
    // Sends the Event
    visualEffect.SendEvent(enteredTriggerEvent, eventAttribute);
}

调试

每个视觉效果组件包含以下调试属性:

  • aliveParticleCount:整个效应中活粒子的数目。

注意:组件每秒钟异步计算该值,这意味着结果可能是在访问该属性前一秒内渲染的帧中的活粒子数。

  • culled:表示是否有摄像机在前一帧中剔除了效果。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、Visual Graph重要文件 1.bin\ide.exe是绘图软件,您在此可以设计图库、绘制图形文件,这个软件的所有界面都是可以修改的。 2.bin\vg.dll是ActiveX控件,在许多编程语言中使用,使用步骤如下: a)运行bin\registeractivex.bat注册控件到您的计算机,如果失败,以管理员身份运行cmd.exe,然后再运行regsvr32.exe bin\vg.dll注册(请不要把v.dll拷贝到windows\system32目录下)。 b)进入编程语言,在工具栏上安装COM组件Visual Graph ActiveX control(Visual Graph不能运行在WEB服务端,如果开发ASP.net,工具栏看不到这个) c)把控件拖动到画面中 d)在窗口的Load事件(或Show)事件中编写如下代码: vgctrl1.Design( "" )设计一个新图形文件 vgctrl1.Run( "" )运行一个新图形文件 vgctrl1.Design( vgctrl1.DefaultPath + "..\demo\电力\秦山核电站.tbl" )设计秦山核电站这张电力接线图 vgctrl1.Run( vgctrl1.DefaultPath + "..\demo\电力\秦山核电站.tbl" )是秦山核电站这张电力接线图的运行状态 接下来就可以通过程序对画面上的各种图形对象进行编程了,具体请参考入门手册 http://www.visual-graph.com/rumen.htm 3.bin\vg.chm是帮助系统 4.source目录下是csharp2010、delphi7.0、vb6.0、vc6.0使用Visual Graph ActiveX的示例 5.web目录下是互联网应用中使用的cab文件打包批处理程序 6.lib目录下是若干例子图库 7.demo目录下是若干图形文件的示例 二、发布Visual Graph ActiveX时必需要包含的文件 1 : bin\vg.dll ActiveX控件 2 : bin\funcs.dll 外部函数库 3 : bin\kernel.dll 技术核心库 4 : bin\units.dll 基础图形库 5 : bin\consts.bas 启动脚本,在此可以定义一些非常重要的全局常量 6 : bin\arrows.tbl 自定义线条箭头库 7 : bin\cursors.tbl 光标库,没有这个,鼠标移动时将看不见 8 : bin\hintwindow.tbl 提示窗口,当鼠标移动到某对象时显示的那种提示窗口 9 : bin\library.tbl 基础图形的画法,包含线条的各种画法 10: bin\page.tbl 打印设置对话盒 11: bin\controls.tbl 打印设置窗口使用的控件库,包括按钮、下拉列表框、选择框等等 12: bin\patterns.tbl 图案文件 三、如果在互联网(IE)使用,需要把用到的文件打包成CAB文件,可参考web\makecab.bat里面的内容,自行增加要打包的文件,然后运行这个批处理程序,打包后的CAB文件的使用方法参见web\design.htm,自行打包的CAB文件在IE里会被拦截,请调低IE的安全等级,允许ActiveX在IE中使用和运行脚本。如果想不被IE拦截,请使用我公司网站上提供的http://www.visual-graph.com/activex/vg.cab,或者自行向数字签名公司购买签名服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值