Table of Contents

自定义属性

中级

你可以导入在 Maya 等建模工具中创建的自定义属性(Custom Attribute)。

目前,你只能导入带动画的自定义属性。未带动画的属性无法导入。

Maya 属性

1. 导入自定义属性

  1. 导入动画。有关说明,请参见导入动画。

  2. 在资产视图中,选择动画资产。

    资产视图中的资产

  3. 在属性网格中,选择 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);
        }
    }
}