全記事を再構成中。3記事に分けて、ソースコードをこの記事に集めることにする。
アニメーター・コントローラーとは何か編:http://qiita.com/muzudho1/items/85cd11ba0c7b1b7d496d
アニメーター・コントローラーの何をC#スクリプトで作成できるか編:
http://qiita.com/muzudho1/items/f6d8a10d057307057b7f
アニメーター・コントローラーを取得する方法
例えば、こんな感じ。
using UnityEditor;
using UnityEditor.Animations;
using UnityEngine;
/// <summary>
/// 開発中に使うメニュー
/// </summary>
public class ToolMenu {
#region アニメーター・コントローラー編集
/// <summary>
/// アニメーター・コントローラーの編集
/// </summary>
[MenuItem("Tool/Animator Controller")]
static void AnimatorController()
{
AnimatorController ac = AssetDatabase.LoadAssetAtPath<AnimatorController>("Assets/Resources/AnimatorControllers/AniCon@Char3.controller");
}
#endregion
}
Assetsフォルダーの下に 〇〇.controller ファイルがあると思うので、そのパスを指定すればいい。
#鈍臭いスキャン部分の抜粋
最初 何から組んだらいいのか分からないと思うんで、例えば次のような 全件走査とかどうだろうか。
/// <summary>
/// アニメーター・コントローラーの編集
/// </summary>
[MenuItem("Tool/Animator Controller")]
static void AnimatorController()
{
AnimatorController ac = AssetDatabase.LoadAssetAtPath<AnimatorController>("Assets/Resources/AnimationClips/Player.controller");
Debug.Log("パラメーター数 = " + ac.parameters.Length);
foreach (AnimatorControllerParameter parameter in ac.parameters) {Debug.Log("引数 = " + parameter.name);}
Debug.Log("レイヤー数 = " + ac.layers.Length);
foreach (AnimatorControllerLayer layer in ac.layers)//レイヤー
{
Debug.Log("レイヤー = "+ layer.name);
foreach (ChildAnimatorStateMachine stateMachine_wrapper in layer.stateMachine.stateMachines)//ステートマシン
{
AnimatorStateMachine stateMachine = stateMachine_wrapper.stateMachine;
Debug.Log("ステートマシン = " + stateMachine.name + " ステート数 = " + stateMachine.states.Length);
foreach (ChildAnimatorState state_wrapper in stateMachine.states)//ステート
{
AnimatorState state = state_wrapper.state;
Debug.Log("ステート = " + state.name + " トランジション数 = " + state.transitions.Length);
foreach (AnimatorStateTransition transition in state.transitions)//トランジション
{
if (null != transition.destinationState)
{
Debug.Log("遷移先 = " + transition.destinationState.name);
}
else
{
Debug.Log("遷移先なし");
}
}
}
}
}
}
GUIで見ると ステートマシンは ツリー構造のような見た目をしているが、フラットに格納されている。
全てのステートの exitTime を 0 にしてみよう
アンドゥ期待できないんで、データのバックアップを取っておいてから試そう。
/// <summary>
/// アニメーター・コントローラーの編集
/// </summary>
[MenuItem("Tool/Animator Controller")]
static void AnimatorController()
{
AnimatorController ac = AssetDatabase.LoadAssetAtPath<AnimatorController>("Assets/Resources/AnimationClips/Player.controller");
foreach (AnimatorControllerLayer layer in ac.layers)//レイヤー
{
foreach (ChildAnimatorStateMachine stateMachine_wrapper in layer.stateMachine.stateMachines)//ステートマシン
{
AnimatorStateMachine stateMachine = stateMachine_wrapper.stateMachine;
foreach (ChildAnimatorState state_wrapper in stateMachine.states)//ステート
{
AnimatorState state = state_wrapper.state;
foreach (AnimatorStateTransition transition in state.transitions)//トランジション
{
if (0!= transition.exitTime)
{
Debug.Log("遷移先 " + (null != transition.destinationState ? transition.destinationState.name : "なし") + " のトランジションの exitTime = " + transition.exitTime + " を 0 にします");
transition.exitTime = 0;
}
}
}
}
}
}
// 書きかけ