Page 1 of 1

MonoBehaviourを継承したクラスのFlexibleField

Posted: 2018/06/20 13:58
by kudou
unity 2018.1.0 f2
Arbor3.1.2

MonoBehaviourを継承したクラスのFlexibleFieldを使用すると警告が出力されます。
こういった使い方は問題ありますでしょうか?

You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor()
Test:.ctor()
System.Activator:CreateInstance()
Arbor.FlexibleField`1:.ctor() (at Assets/Plugins/Arbor/Internal/Scripts/FlexibleField.cs:42)
FlexibleTest:.ctor()

手順
①下記のコードを作成
②ArborFSMをもつGameObjectを作成
③ステートを作成してTestStateBehaviourScriptの挙動を追加する
④UnityEditorを再生する

【TestVariable.cs】

Code: Select all

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Arbor;

[System.Serializable]
public class Test : MonoBehaviour
{
	// Declare Serialize Fields
}

[System.Serializable]
public class FlexibleTest : FlexibleField<Test>
{
}
【TestStateBehaviourScript.cs】

Code: Select all

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Arbor;

[AddComponentMenu("")]
public class TestStateBehaviourScript : StateBehaviour {

    public FlexibleTest test;

}

Re: MonoBehaviourを継承したクラスのFlexibleField

Posted: 2018/06/20 14:25
by caitsithware
ご質問ありがとうございます。

FlexibleFieldについては、Serializable属性をつけた非Unityオブジェクトクラスを扱うためのクラスとなっています。
そのため、MonoBehaviourの継承クラスへの使用は想定しておりませんでした。
(Contant値を扱うために内部的にnew T()しており、今回TがMonoBehaviourだったためUnityが警告を出した、ということになります)

自作コンポーネントへの参照方法ですが、FlexibleComponentとSlotTypeAttributeを使用することで可能です。

【TestStateBehaviourScript.cs】

Code: Select all

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Arbor;

[AddComponentMenu("")]
public class TestStateBehaviourScript : StateBehaviour {
    [SlotType(typeof(Test))]
    public FlexibleComponent test;

}
スクリプトリファレンス : FlexibleComponent
スクリプトリファレンス : SlotTypeAttribute

このあたりの詳細がドキュメントになかったので修正いたします。