独自クラス型の引数がActionノードで表示されない

Yumineko
Posts: 8
Joined: 2025/01/06 14:54

独自クラス型の引数がActionノードで表示されない

Post by Yumineko »

お世話になっております。
引数に独自classが含まれているメソッドでActionノードを作成すると、その引数だけ表示されない現象に悩まされております。

◆引数となる独自class

Code: Select all

using System;
using Unity.Cinemachine;
using UnityEngine;

namespace Game.Logic.Camera
{
    [Serializable]
    public class ThirdPersonCameraData
    {
        [SerializeField, HideInInspector]
        private InputAxis _horizontalLook = new()
            { Range = new Vector2(-180, 180), Wrap = true, Recentering = InputAxis.RecenteringSettings.Default };

        [SerializeField, HideInInspector]
        private InputAxis _verticalLook = new()
            { Range = new Vector2(-70, 70), Recentering = InputAxis.RecenteringSettings.Default };

        public InputAxis GetHorizontalLook() => _horizontalLook;
        public void SetHorizontalLook(InputAxis value) => _horizontalLook = value;

        public InputAxis GetVerticalLook() => _verticalLook;
        public void SetVerticalLook(InputAxis value) => _verticalLook = value;
    }
}

◆ノードとして使うLogicクラス

Code: Select all

using UnityEngine;

namespace Game.Logic.Camera
{
    public static class ThirdPersonCameraRotater
    {
        public static void Rotate(ThirdPersonCameraData data, Vector2 axis, float rotationSpeed)
        {
            var horizontalLook = data.GetHorizontalLook();
            var verticalLook = data.GetVerticalLook();

            horizontalLook.Value += axis.x * rotationSpeed * Time.deltaTime * 100;
            verticalLook.Value += axis.y * rotationSpeed * Time.deltaTime * 100;

            horizontalLook.Validate();
            verticalLook.Validate();

            data.SetHorizontalLook(horizontalLook);
            data.SetVerticalLook(verticalLook);
        }

        public static void Update(ThirdPersonCameraData data, Transform rotateTarget)
        {
            var horizontalLook = data.GetHorizontalLook();
            var verticalLook = data.GetVerticalLook();

            var verticalChanged = verticalLook.TrackValueChange();
            var horizontalChanged = horizontalLook.TrackValueChange();
            verticalLook.UpdateRecentering(Time.deltaTime, verticalChanged);
            horizontalLook.UpdateRecentering(Time.deltaTime, horizontalChanged);

            rotateTarget.localRotation = Quaternion.Euler(verticalLook.Value, horizontalLook.Value, 0);

            data.SetHorizontalLook(horizontalLook);
            data.SetVerticalLook(verticalLook);
        }
    }
}

この場合、ThirdPersonCameraDataの引数のみノードで表示されなくなります。
Main.png
Main.png (43.66 KiB) Viewed 3895 times

なお、ScriptGeneratorでは引数を正常に認識できており、SerializableなのでBlackboardに設定することも可能です。
スクリーンショット 2025-01-09 095343.png
スクリーンショット 2025-01-09 095343.png (91.33 KiB) Viewed 3895 times
スクリーンショット 2025-01-09 102031.png
スクリーンショット 2025-01-09 102031.png (38.15 KiB) Viewed 3895 times

引数(Actionノードで左側にある入力口)を表示させるにはどうすればいいのでしょうか。
また、データを扱う上でもっとスマートなやり方があるようでしたらご教授願えれば幸いです。
Yumineko
Posts: 8
Joined: 2025/01/06 14:54

Re: 独自クラス型の引数がActionノードで表示されない

Post by Yumineko »

HideInInspectorを外したら表示されました。
BlackboardやInspector上で編集されたくないけどSerialize対象にしないと値が保存されないと思って隠していましたが、ノードにも影響するんですね。
インスタンスさえSerializableなら中のフィールドもまとめてインスタンスごと受け渡すのかと思っていましたが、厳密にはSerialize可能なフィールドのみ受け渡すのであって、インスタンスごと受け渡しているわけではないという認識が正しいのでしょうか?
User avatar
caitsithware
管理人
Posts: 95
Joined: 2024/03/26 01:56

Re: 独自クラス型の引数がActionノードで表示されない

Post by caitsithware »

ご質問内容を整理すると、ノード内のフィールドのエディタ拡張について知りたいということで良いでしょうか。

NodeComponentの各フィールドは基本的にSerializedPropertyが取得可能であればPropertyFieldを使用して表示しています。
HideInInspectorを外したら表示されたということですので、内部フィールドに表示できるものが無ければ元から表示しないのがPropertyFieldのデフォルトの仕様のようですね。
この表示はPropertyDrawerを使用すればカスタマイズできます。
ただしPropertyDrawerはノード内に限らずInspectorなどPropertyFieldを介して表示する箇所すべてで使用されます。
PropertyDrawerで作成したVisualElementがどこで使用されているかはUIToolkitの知識が必要となります。
使用場所に応じて表示を切り替えたい場合はVisualElement.GetFirstOfTypeなどで判定してください。

またメンバー呼び出し用に生成したスクリプトについては、各引数を InputField<フィールドの型> などで保持しております。
その「フィールドの型」にはSystem.Serializable属性を適用していない型も使用可能ですが、適用されていない型はエディタでの編集ができないため"Non serializable"表記となり直接設定ができず、ポートからの入力のみ受け付けるようになります。
Yumineko
Posts: 8
Joined: 2025/01/06 14:54

Re: 独自クラス型の引数がActionノードで表示されない

Post by Yumineko »

となると、基本はSerializableとSerializeFieldで取得を容易にしたほうが良さそうですね。
ありがとうございます。
Post Reply