C# 指令碼與Unity Visual Scripting 互動,第一步(使用C# 指令碼觸發Script Graph的事件)(Custom Scripting Event)

2022-09-12 18:02:32

寫在前面

感謝Unity 川哥的幫助,解決了單獨呼叫GameObject的需求


首先 需要在Unity 中建立一個自定義事件指令碼(註釋非常重要)

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

/// <summary>
/// UnitTitle 在Script Graph 中展示的名字
/// UnitCategory 在Script Graph 展示的目錄層級
/// EventUnit<int> 泛型 int 是輸出引數的型別
/// </summary>
[UnitTitle("TestEvent")]
[UnitCategory("Events\\MyEvents")]
public class TestEvent : EventUnit<int>
{
    /// <summary>
    /// 定義引數輸出
    /// </summary>
    [DoNotSerialize]
    public ValueOutput result { get; private set; }// The Event output data to return when
    protected override bool register => true;
    /// <summary>
    /// 其實
    /// </summary>
    /// <param name="reference"></param>
    /// <returns></returns>
    public override EventHook GetHook(GraphReference reference)
    {
        // 特別宣告 如果不傳遞 gameObject 則呼叫時 會呼叫所有 Script Graph 使用的事件
        return new EventHook(nameof(TestEvent),reference.gameObject);
    }
    /// <summary>
    /// 定義函數 展示輸出事件
    /// </summary>
    protected override void Definition()
    {
        base.Definition();
        // 設定輸出的型別和顯示的名字
        result = ValueOutput<int>("output");
    }
    /// <summary>
    /// 設定引數傳入流中
    /// </summary>
    /// <param name="flow"></param>
    /// <param name="data"></param>
    protected override void AssignArguments(Flow flow, int data)
    {
        flow.SetValue(result, data);
    }

}

編寫完成後記得儲存程式碼,並且在專案設定中點選重新整理一下Visual Scripting的Nodes

還記得在程式碼 寫的目錄和 名稱嗎

  • Events\\MyEvents
  • TestEvent

 

成功新增了這個節點 輸出目前是一個int 型別

為了讓大家看的清楚一點 我輸出了

編寫一個觸發指令碼

 

成功觸發了,這時候我就可以愉快的將 Unity的連連看和自己寫的邏輯聯絡在一起了