Page 1 of 1

AnimatorOverrideControllerをAgentControllerのAnimatorに設定するとエラーが発生する

Posted: 2022/03/12 09:17
by nanatsuki
OS: Windows11
Unityバージョン: 2021.2.15f1
Arborバージョン: 3.8.9
再現方法: AnimatorOverrideControllerをAgentControllerのAnimatorに設定する

エラー内容
ArgumentNullException: Value cannot be null.
Parameter name: key
System.Collections.Generic.Dictionary`2[TKey,TValue].FindEntry (TKey key) (at <feaaa6313e32495d9f259b175aa6b597>:0)
System.Collections.Generic.Dictionary`2[TKey,TValue].TryGetValue (TKey key, TValue& value) (at <feaaa6313e32495d9f259b175aa6b597>:0)
ArborEditor.EditorGUITools.GetAnimatorParameters (UnityEditor.Animations.AnimatorController animatorController) (at Assets/Plugins/Arbor/Internal/Editor/EditorGUITools.cs:1954)
ArborEditor.EditorGUITools.AnimatorParameterField (UnityEngine.Rect position, UnityEngine.Animator animator, UnityEditor.SerializedProperty nameProperty, UnityEditor.SerializedProperty typeProperty, UnityEngine.GUIContent label, System.Boolean hasType, UnityEngine.AnimatorControllerParameterType parameterType) (at Assets/Plugins/Arbor/Internal/Editor/EditorGUITools.cs:1973)
ArborEditor.EditorGUITools.AnimatorParameterField (UnityEngine.Animator animator, UnityEditor.SerializedProperty nameProperty, UnityEditor.SerializedProperty typeProperty, UnityEngine.GUIContent label, UnityEngine.AnimatorControllerParameterType parameterType) (at Assets/Plugins/Arbor/Internal/Editor/EditorGUITools.cs:2078)
ArborEditor.AgentControllerInspector.OnInspectorGUI () (at Assets/Plugins/Arbor/BuiltInBehaviours/Editor/Components/AgentControllerInspector.cs:70)
UnityEditor.UIElements.InspectorElement+<>c__DisplayClass59_0.<CreateIMGUIInspectorFromEditor>b__0 () (at <fa4830dcb55b4d21a18ffd468621039e>:0)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)

AnimatorOverrideControllerの場合、Assets/Plugins/Arbor/Internal/Editor/EditorGUITools.cs の L1969

Code: Select all

AnimatorController animatorController = animator.runtimeAnimatorController as AnimatorController;
がnullになるためにエラーが発生し設定できないようです。
以下のようにAnimatorOverrideControllerの場合を考慮するとエラーが解消され設定できるようになりました。
ご確認よろしくお願いいたします。

Code: Select all

AnimatorController animatorController;
if (animator.runtimeAnimatorController is AnimatorOverrideController)
{
	var animatorOverrideController = animator.runtimeAnimatorController as AnimatorOverrideController;
	animatorController = animatorOverrideController.runtimeAnimatorController as AnimatorController;
}
else
{
	animatorController = animator.runtimeAnimatorController as AnimatorController;
}

Re: AnimatorOverrideControllerをAgentControllerのAnimatorに設定するとエラーが発生する

Posted: 2022/03/12 10:16
by nanatsuki
少々説明が不適切だったため以下の通り訂正いたします。

× 再現方法: AnimatorOverrideController を AgentController の Animator に設定する
○ 再現方法: AnimatorOverrideController を Controller に設定したAnimatorを AgentController の Animator に設定する

Re: AnimatorOverrideControllerをAgentControllerのAnimatorに設定するとエラーが発生する

Posted: 2022/03/12 10:19
by caitsithware
ご報告ありがとうございます。
確認の後修正いたします。

Re: AnimatorOverrideControllerをAgentControllerのAnimatorに設定するとエラーが発生する

Posted: 2022/03/12 11:08
by caitsithware
確認したところ再現できましたので次回の更新で修正いたします。
AgentController以外でもruntimeAnimatorControllerからAnimatorControllerを取得している箇所がありますので、そちらも併せて修正いたします。

対処方法についてはご提示していただいた方法で問題なさそうです。

暫定対処方法まとめ
  • EditorGUIToolsに以下のようなメソッド追加。

    Code: Select all

    public static AnimatorController GetAnimatorController(Animator animator)
    {
    	if (animator == null)
    	{
    		return null;
    	}
    
    	var runtimeAnimatorController = animator.runtimeAnimatorController;
    	if (runtimeAnimatorController is AnimatorOverrideController overrideController)
    	{
    		runtimeAnimatorController = overrideController.runtimeAnimatorController;
    	}
    
    	return runtimeAnimatorController as AnimatorController;
    }
    
  • animator.runtimeAnimatorControllerに直接アクセスしている箇所をGetAnimatorController(animator)に置き換え。

Re: AnimatorOverrideControllerをAgentControllerのAnimatorに設定するとエラーが発生する

Posted: 2022/03/12 11:18
by nanatsuki
早速の返信ありがとうございます。
修正よろしくお願いいたします。