FlowCanvas 很容易自定义节点
可以看官方文档 从 6.1. Creating Simplex Nodes 开始
http://www.paradoxnotion.com/files/flowcanvas/FlowCanvas%20Documentation.pdf
我之前说错了,FlowCanvas 中有 Delegate 的 += 和 -=,只是没有以运算符的形式给出来
FlowCanvas 中 += 为 Combine -= 为 Remove
Bilibili 上面倒是有一个简短的教程很实用,是一个大佬对自己的魔改版的教学视频,比如支持在 FlowScript 中使用 ToLua 啥的
https://www.bilibili.com/video/BV1Tt411X7mx
https://note.youdao.com/ynoteshare/index.html?id=6c6748dd043f124049a5b53ae281b950&type=note&_time=1649039338969
虽然我暂时还不会去想着魔改 FlowCanvas,但是看看别人的基础操作就好
1. FlowCanvas 中的 Delegate
1.1 += -=
测试代码
// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 28/03/2022 17:43
// 最后一次修改于: 04/04/2022 9:08
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------
using System;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Events;
namespace MeowFramework.Core
{
public class ActorBase : SerializedMonoBehaviour
{
/// <summary>
/// 血量
/// </summary>
[Tooltip("血量")]
public ActorAttribute<float> HP = new ActorAttribute<float>();
/// <summary>
/// 最大血量
/// </summary>
[Tooltip("最大血量")]
public ActorAttribute<float> MaxHP = new ActorAttribute<float>();
public Action TestAction1;
public Action TestAction2;
public void Awake()
{
TestAction1 += () => {
Debug.Log("Actor TestAction1!"); };
TestAction2 += () => {
Debug.Log("Actor TestAction2!"); };
}
}
}
测试 FlowScript
测试 FlowScript 运行结果
这确定了在 FlowCanvas 中,委托的 +=
和 -=
是可行的
但是 Delegate Callback 的委托连出来了一个 null,也说明 FlowCanvas 中的 Delegate CallBack 并不是我想的那样简单,它是不能和一般的 Action
相加的
1.2 Delegate Callback
测试代码
public void DoSomething(Action action)
{
action.Invoke();
}
测试 FlowScript
所以 Delegate CallBack 似乎是专门用来传递给一个函数的 Action
参数的
如果这个函数的参数是 Action<T>
那么是连不上 Delegate CallBack 的
测试代码
public void DoSomething(Action<float> action)
{
action.Invoke(1);
}
测试 FlowScript
2. FlowCanvas 中的 Event
2.1 Custom Event,Event CallBack
FlowCanvas 中的事件节点很简单
新建事件用 Custom Event
发送事件用 Send Event
保证发送者的 Send Event 中填写的事件名就是接收者实现的 Custom Event 的事件名就好了
UnityEvent 的订阅和取消订阅可以通过 Flow 入口调用
CallBack 是执行内容的 Flow 入口
2.2 制作绑定指定类中指定委托的 EventNode
根据官方教程,事件节点的模板为
我现在有一个需求就是,要能够在 FlowCanvas 中绑定 C# 脚本中指定类中的指定委托
指定测试类
// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 01/04/2022 14:32
// 最后一次修改于: 04/04/2022 0:05
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------
using System;
using Sirenix.OdinInspector;
using UnityEngine;
namespace MeowFramework.Core
{
/// <summary>
/// 角色属性泛型
/// </summary>
public class ActorAttribute<T>
{
/// <summary>
/// 是否使用字面值
/// </summary>
[Tooltip("是否使用字面值")]
public bool IsLiteral = true;
/// <summary>
/// 角色属性的值
/// </summary>
[ShowIf("@IsLiteral")]
[Tooltip("值")]
private T value;
/// <summary>
/// 可资产化值
/// </summary>
[ShowIf("@!IsLiteral")]
[ShowInInspector]
[Tooltip("可资产化值")]
private ScriptableGenericVariable<T> scriptableValue;
public T Value
{
get => value;
set
{
AfterSetValue(this.value, value);
this.value = value;
}
}
/// <summary>
/// 设置值时进行的委托
/// 同时承担验证验证值改变是否合法的功能
/// </summary>
[HideInInspector]
public Action<T,T> AfterSetValue;
}
}
依赖指定测试类的 Mono 脚本为
// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 28/03/2022 17:43
// 最后一次修改于: 04/04/2022 0:02
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------
using