自定义属性
中级
你可以导入在 Maya 等建模工具中创建的自定义属性(Custom Attribute)。
目前,你只能导入带动画的自定义属性。未带动画的属性无法导入。

1. 导入自定义属性
导入动画。有关说明,请参见导入动画。
在资产视图中,选择动画资产。

在属性网格中,选择 Import custom attributes。

构建资产时,Stride 会从 FBX 文件中导入自定义属性。
2. 用脚本控制自定义属性
添加一个脚本来读取自定义属性,并将它们的值复制到另一个属性。这可以是一个单独的脚本,也可以是另一个动画脚本的一部分。
要查找属性,请使用 NodeName_AttributeName。例如,如果节点 myNode 具有自定义属性 myAttribute,请使用 myNode_myAttribute。
脚本示例
using Stride.Animations;
using Stride.Engine;
using Stride.Rendering;
using Stride.Audio;
using Stride.Rendering.Materials;
using System.Linq;
namespace Sample
{
public class HologramScript : SyncScript
{
public Material MyMaterial;
private AnimationComponent animationComponent;
private AnimationProcessor animationProcessor;
public override void Start()
{
base.Start();
animationComponent = Entity.GetOrCreate<AnimationComponent>();
animationProcessor = SceneSystem.SceneInstance.Processors.OfType<AnimationProcessor>().FirstOrDefault();
}
public override void Update()
{
if (animationProcessor == null || MyMaterial == null)
return;
// 如果动画尚未播放,动画结果可能为 Null
var animResult = animationProcessor.GetAnimationClipResult(animationComponent);
if (animResult == null)
return;
// 读取带动画的自定义属性的值:
float emissiveIntensity = 0;
unsafe
{
fixed (byte* structures = animResult.Data)
{
foreach (var channel in animResult.Channels)
{
if (!channel.IsUserCustomProperty)
continue;
var structureData = (float*)(structures + channel.Offset);
var factor = *structureData++;
if (factor == 0.0f)
continue;
var value = *structureData;
if (channel.PropertyName == "myNode_myProperty")
emissiveIntensity = value;
}
}
}
// 绑定材质参数:
MyMaterial.Passes[0].Parameters.Set(MaterialKeys.EmissiveIntensity, emissiveIntensity);
}
}
}