我在 Bolt 里面跑的时候遇到的第一个问题是,他识别不到我的属性……太怪了
我把 value 调成了 public 他居然也没有显示
然后我在 SerializedMonoBehaviour MonoBehaviour 中新建属性和方法他也没有显示,自定义的类啥都不显示
好吧,是需要更新 Bolt
https://forum.unity.com/threads/bolt-can-not-find-my-monobehaviour-scripts-public-method.1132447/
他这个更新很奇怪,我每次带动代码之后,即使我添加了 [IncludeInSettings(true)]
,也还是要去 Tool/Bolt 里面更新,不然就会一直加载那个被更新的代码
更新了之后还有一个问题就是,可以显示方法但是不显示属性……
看了一下,Asset Store 是有 Bolt Enhanced 可以解决这个问题的
别的……再说吧
Bolt 还有一个问题就是它不支持委托相关的逻辑
测试代码:
Assets/MeowACT/Core/Actor/ActorBase.cs
// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 28/03/2022 17:43
// 最后一次修改于: 02/04/2022 11:55
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------
using System;
using Ludiq;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Events;
namespace MeowACT
{
[IncludeInSettings(true)]
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 float Value => HP.Value;
public UnityEvent<float> TestUnityEvent;
public Func<bool> TestFunc;
public Action TestAction;
public Predicate<bool> TestPredicate;
public delegate void TestDelegateType();
public TestDelegateType TestDelegate;
public void ExecuteBuff()
{
}
public void ExecuteAbility()
{
}
}
}
将 ActorBase 挂在 GameObject 上,然后再在这个 GameObject 上新建 FlowMachine,新建脚本,可以看到,我虽然能够 Set 委托,但是却没有办法给委托添加监听
开发者原话是说在可视化脚本中使用委托是很困难的
Replicating Action delegate behaviour in Bolt
我在别人的问答里面也看到是这样
https://forum.unity.com/threads/how-to-invoke-an-action-event-from-visual-scripting.1127753/
我的需求是 委托多播的 += 和 -=
但现在 Bolt 使得策划接触不到委托相关的 unit,并且需要程序来封装……我想想就头疼
我现在用的是 Unity2020,装 Bolt
Bolt 在 Unity 2021 开始变成了内置的包,叫做 Visual Scripting
根据它的文档,我应该是有委托的,比如我随便一搜就搜到了一个 Action 的,但是我也没在 Bolt 中找到
https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/api/Unity.VisualScripting.Action-5.html
然后我又搜到了这个
https://forum.unity.com/threads/how-to-use-callbacks-delegates-with-visual-scripting.1143230/#post-7339760
测试代码:
Assets/MeowACT/Core/Actor/ActorBase.cs
public Func<bool> TestFunc;
public void Awake()
{
TestFunc += TestFuncDebug;
}
public bool TestFuncDebug()
{
Debug.Log("TestFunc is working in C# script");
return true;
}
测试 Flow:
TestFunc is working in C# script 不会 Debug 出来
好吧,那看来这个帖子的意思并不是 Flow 中的 Custom Event 会触发同名委托
那就真的很难了……
我想到我实习的时候他们用的是 FlowCanvas
我去查了一下,还真的可以
https://flowcanvas.paradoxnotion.com/features-comparison/
测试代码不变
添加委托类型
直接就能连出 invoke
牛啊……
但是我并没有找到一个方式将函数加入委托
比如我尝试加入一个函数指针
或者是从函数里面连出来一个 + 号,都不太行
我查到一个回答,开发者说不推荐使用委托,这会让逻辑变得复杂
https://flowcanvas.paradoxnotion.com/forums/topic/new-list-nodes/
好吧……或许我要想一个别的方式了
顺便,我也测试一下属性,FlowCanvas 确实可以识别到
测试代码
private float hp;
public float HP
{
get => hp;
set => hp = value;
}
Flow
或许我可以魔改 FlowCanvas 但是这应该是很深的东西吧……
所以这还要我们实现更多的东西……
比如原来我希望策划能够完全控制 get 和 set 的内容,现在来看,只能用事件了,而使用事件的话,他是没有一个返回值的,所以会很难办到说完全控制内容,比如我原来可以把 set 里面的参数 value 传进来,然后通过委托给出去,这样策划可以修改 value 的内容,但是现在传不了的话,那么就必须放弃在属性里面设置事件,而是要在每一个属性修改之前放一套函数,这个函数最后才是修改变量,比如做一个 SetValue() 里面要经过 Buff 检查 要触发事件,最后才是 value = …
有好有坏吧
好的是这强迫我们定制属性修改流程
坏的是这个流程是确定的
99%的自由
或者说,我们努力的话可能达到99%的自由,但是这还需要努力,并且再怎么努力也完不成最后的1%
嗯……这似乎是合理的,毕竟架构的目的就是消除那1%