Table of Contents

カスタム属性

中級

Maya などのモデリング ツールで作成したカスタム属性をインポートすることができます。

現状では、カスタムアニメーション属性だけをインポートすることができます。それ以外のカスタム属性はインポートできません。

Maya properties

1. カスタム属性をインポートする

  1. アニメーションをインポートします。手順については、アニメーションのインポートをご覧ください。

  2. アセットビューで、アニメーションアセットを選択します。

    Assets in Asset View

  3. プロパティグリッドで、[Import custom attributes] を選択します。

    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 になることがあります。
            // Animation result may be Null if animation hasn't been played yet.
            var animResult = animationProcessor.GetAnimationClipResult(animationComponent);
            if (animResult == null)
                return;

            // カスタムアニメーション属性の値を読み取ります。
            // Read the value of the animated custom attribute:
            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;
                    }
                }
            }

            // 読み取った値をマテリアルパラメーターに割り当てます。
            // Bind the material parameter:

            MyMaterial.Passes[0].Parameters.Set(MaterialKeys.EmissiveIntensity, emissiveIntensity);
        }
    }
}