実用編を書こうとしているのですが、なかなか難航しておりまして、一旦小ネタ集でお茶を濁します…。
小ネタ集
ノードベースエディターの本来の機能としてはいらないまでも、あると便利なxNodeの実装集です。ものによって実装がノード本体だったりエディターだったり(例えばNewNode.csとNewNodeEditor.cs)するので注意してください。
ノードの色を変える
ノードの定義にNodeTintアトリビュートを置きます。
[NodeTint("#FFFFFF")]
//[NodeTint(1.0f, 1.0f, 1.0f)] // こっちでも良い
public class NewNode : XNode.Node {
ただ、これだとクラスごとにしか設定できないので、ノードのパラメータ等によって色を変えたい場合はGetTint()をオーバーライドします。(こちらはEditor側なので注意)
public override Color GetTint()
{
var node = target as NewNode;
return node.Checked ? Color.green : Color.red;
}
グラフウィンドウのタイトルを変える
そのままだと全部"xNode"になってしまって分かりづらいので、変えましょう。
public override void OnOpen()
{
window.titleContent = new GUIContent("NewNodeGraph");
}
xNodeを使うすべてのノードがコンテキストメニューに出てしまうので関係あるものに絞る
単体だと問題ないんですが、複数のxNode実装を組み込むと、プロジェクト内のすべてのノードクラスがコンテキストメニューに出てしまいます。なので、実装をnamespaceで分けて、メニュー表示時に関係ないものを非表示にするという手法がサンプルで使われています。
以下は"namespace test"で定義した場合。ちなみに、メニューでは頭文字が大文字に変換されるので"Test"になります。
public override string GetNodeMenuName(System.Type type)
{
if (type.Namespace == "test") return base.GetNodeMenuName(type).Replace("Test/", "");
else return null;
}
コンテキストメニューに項目を追加する
コンテキストメニューでノード追加以外の処理を選択させたい場合はこのようにします。詳細はUnityEditor.GenericMenuのドキュメントを参照のこと。
public override void AddContextMenuItems(GenericMenu menu)
{
base.AddContextMenuItems(menu);
var graph = target as NewNodeGraph;
menu.AddSeparator("");
menu.AddItem(new GUIContent("Test Mode"), graph.TestMode, () => { graph.TestMode = !graph.TestMode; });
}
ノードを繋ぐ線の色を変える
ノードを繋ぐ線(ヌードル?)はポートの型ごとに勝手に色が選択されますが、なかなか微妙な色彩センス…。コンテキストメニューのPreferencesから変更可能ではあるんですが、ユーザーに変えさせるのも混乱の元なので、こちら側で設定します。
public override Color GetTypeColor(Type type)
{
if (type == typeof(MissionPort[]) || type == typeof(MissionPort)) return Color.white;
else return base.GetTypeColor(type);
}
ポートの位置を変える
ポートは宣言した順に上から表示されます。InputとOutputを必ずしも順に並べる必要はありません。
[Input] public float a;
[Output] public float c;
[Input] public float b;
パラメーター以外のUIを配置する
Inspectorと同じように置きます。サンプルを見る限り、GUILayoutかEditorGUILayoutを使うべきのようです。base.OnBodyGUIを呼ぶのを忘れないように。NodeEditor側に記述するので、ランタイムで必要な実装はここには入れないように。
public override void OnBodyGUI()
{
base.OnBodyGUI();
var node = target as NewNode;
if (GUILayout.Button("Process"))
node.Process();
}
ノードのタイトルを変える
ノードのnameフィールドがそのまま表示されているのでこれを変更すればいいんですが、実はノードのタイトルエリアで右クリックするとメニューが出るのでそこでRenameできます。
おわりに
♪チャッチャッチャ! (CASIOPEA "Road Rhythm")