IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> [Unity] ACT 战斗系统学习 9:Bolt 和 FlowCanvas -> 正文阅读

[游戏开发][Unity] ACT 战斗系统学习 9:Bolt 和 FlowCanvas

我在 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%

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:42:53  更:2022-04-04 12:43:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 -2025/4/22 10:37:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码