LoginSignup
0
0

More than 1 year has passed since last update.

【Unity】xNodeの実践的な使い方

Last updated at Posted at 2022-07-07

 xNodeの実践的な使い方について丁寧に解説している日本語サイトが少ないので書きました。初めてのQiita記事なので、おかしいところはご指摘ください。実践例など順次更新していきます。

xNodeとは

xNodeは無料のノードエディターフレームワークです。独自のノードを追加してノードベースのプラグインなどを作ることができます。
MITライセンスなので、自分のアセットに同梱して配布できます。
https://github.com/Siccity/xNode

Unity対応バージョンは2019.4.0以上です。

導入と簡単な説明

https://ghoul-life.hatenablog.com/entry/2019/03/04/224229
こちらのサイトをご覧ください。

実践1 ノードに入力された文字をログに出力する

  1. NodeGraphの作成
  2. Nodeを置くためのNodeGraphを作成します。右クリック > Create > xNode > NodeGraph C# Script で新しいノードグラフスクリプトを作成し、適当にSampleNodeGraphと名前をつけます

    すると、右クリック > Create の欄に、新しくSampleNodeGraphが作成できるようになります。

    作成してダブルクリックすると、このような画面が出てきます。これがノードグラフで、この上にノードを置いたり繋げたりして使います。

  3. Nodeの作成
  4. ノードを作成します。右クリック Create > xNode > Node C# Script でノードスクリプトを作成します。ノードスクリプトを2つ作成し、HeadとLogと名前を付けます。
    Head.cs
    using XNode;
    
    public class Head : Node
    {
        [Output(connectionType = ConnectionType.Override)]
        public Node nextNode;
    }
    
    Log.cs
    using UnityEngine;
    using XNode;
    
    public class Log : Node
    {
        [Input(ShowBackingValue.Never, ConnectionType.Override)] 
        public Node beforeNode;
        [Input(connectionType = ConnectionType.Override)] 
        public string log; // 表示する文章を入力
        [Output(connectionType = ConnectionType.Override)] 
        public Node nextNode;
    }
    

    保存後、ノードグラフで右クリックすると作ったノードが追加できるようになっています。

  5. ノードの情報を使うスクリプトを作成
  6. 1.で作ったSampleNodeGraph.csを開いて以下のように書き換えます。
    SampleNodeGraph.cs
    using UnityEngine;
    using XNode;
    
    [CreateAssetMenu]
    public class SampleNodeGraph : NodeGraph {
        public Node current; // 
        public Node HeadNode() // Headノードを探します。
        {
            Head result = null;
            foreach (var node in nodes) // NodeGraph上のすべてのノードはnodesの中にあります。
            {
                result = node as Head; // nodeがHeadノードだったらresultに入れます。
                if (result != null) // 中身がある=nodeがHeadノードだったらループを抜ける。
                {
                    break;
                }
            }
            return result;
        }
    }
    
    ShowLog.cs
    using UnityEngine;
    using System;
    using XNode;
    
    public class ShowLog : MonoBehaviour
    {
        public SampleNodeGraph graph;
        bool nodeContinues = true;
        void Start()
        {
            ShowLogNode();
        }
    
        public void ShowLogNode()
        {
            graph.current = graph.HeadNode();
            NextNode();
            while (nodeContinues)
            {
                Log obj = (Log)graph.current;
                Debug.Log(obj.log);
                NextNode();
            }
            nodeContinues = true;
        }
    
        void NextNode()
        {
            foreach (NodePort p in graph.current.Ports)
            {
                if (p.fieldName == "nextNode")
                {
                    try
                    {
                        graph.current = p.Connection.node as Node;
                        // nextNodeに繋がっているノードに移動(currentノードに入れる)
                    }
                    catch(NullReferenceException e) // nextNodeに何も繋がっていなかったら
                    {
                        nodeContinues = false; // 上のwhile文を出ます
                    }
                }
            }
        }
    }
    
    

    これを空のゲームオブジェクトにアタッチして実行します。

    ノードにつなげた通りに表示されました。

    おまけ

    こちらのサイトを参考にして、インスペクターに実行ボタンを作りました。
    https://kan-kikuchi.hatenablog.com/entry/CustomEditor_Button

    ss6.png

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0