惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy International News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
T
Tailwind CSS Blog
WordPress大学
WordPress大学
Scott Helme
Scott Helme
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - Franky
C
CERT Recently Published Vulnerability Notes
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
雷峰网
雷峰网
Schneier on Security
Schneier on Security
博客园 - 聂微东
T
Tor Project blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
AI
AI
T
Troy Hunt's Blog
Security Latest
Security Latest
T
The Blog of Author Tim Ferriss
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
Check Point Blog
T
Threat Research - Cisco Blogs
W
WeLiveSecurity
V
Vulnerabilities – Threatpost
Recorded Future
Recorded Future
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Cisco Talos Blog
Cisco Talos Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cloudbric
Cloudbric
J
Java Code Geeks
罗磊的独立博客
C
Cyber Attacks, Cyber Crime and Cyber Security
aimingoo的专栏
aimingoo的专栏
L
LangChain Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Privacy & Cybersecurity Law Blog
Google DeepMind News
Google DeepMind News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
I
InfoQ
MongoDB | Blog
MongoDB | Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
The Hacker News
The Hacker News
H
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Proofpoint News Feed
N
News and Events Feed by Topic

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟 从Python转向Pharo https://blog.just4fun.site/post/iot/iot-open-source-projects/ Python异步编程笔记 https://blog.just4fun.site/post/iot/iot-open-source-hardware-community/ 万物积木化开发者社区 CodeLab ❤️ Blender Scratch3技术分析之云变量 API(第7篇) [译]对管道(Pipes)的偏爱 [译]提出正确的问题比得到正确答案更重要 蓝牙设备与Scratch3.0 创建你的第一个Scratch3.0 Extension Scratch3技术分析之项目内部数据(第6篇) Scratch3技术分析之社区 API(第5篇) Scratch3技术分析之User API(第4篇) Scratch3技术分析之项目主页API(第3篇) Scratch3技术分析之静态资源API(第2篇) Scratch3.0、micro:bit与Windows7 https://blog.just4fun.site/post/iot/zerynth-vs-micropython/ 核聚变、方所与半宅空间 可视化编程为何是个糟糕的主意 codelab.club周末聚会 关于codelab.club '下一件大事'是一个房间 Hungry Robot - Eat everything 编程作为一种思考方式 今日简史 史蒂夫·乔布斯传 罗素自选文集 https://blog.just4fun.site/post/edx/tianjin-scratch-ai/ https://blog.just4fun.site/post/edx/richie-cms-openedx/ 徒步武功山 WebUSB与micro:bit 积木化编程与3D场景 夜宿武功山顶 scratch3-adapter接入优必选Alpha系列机器人 https://blog.just4fun.site/post/edx/video-migration-note/ scratch3-adapter重构笔记 https://blog.just4fun.site/post/edx/edx-community-members/ 两种硬件编程风格的比较 使用micro:bit自制PPT翻页笔 柏拉图对话集 scratch3.0 + micro:bit 七月电影放映计划 非营利组织的管理 Screenly--用树莓派让任何屏幕变为可编程的数字标牌 以最佳实践开始你的Django项目 micro:bit与事件驱动 为Scratch3.0设计的插件系统(上篇) OCR应用一例 近两年读过的一些好书 blockly开发之使用python驱动浏览器中的turtle(2) 牛顿新传 文学理论入门 逻辑的引擎 人生的意义 blockly开发之生成并运行js代码(1) blockly开发之hello world(0) micro:bit使用笔记 神器之Termux https://blog.just4fun.site/post/iot/micropython-notes/ Cozmo what is this Scratch的前世今生 下段旅程 我行在远方 爆裂 途中杂记 https://blog.just4fun.site/post/edx/open-edx-startup/ cozmo系列之入门 - 有性格且可编程的机器人 PaperWeekly开发笔记 创业二三事
Unity 学习笔记之消息传递
种瓜 · 2023-08-20 · via 夜行人

文章目录

前言

上一篇文章提到:

@Lounsen 上周末向我展示了 Unity Visual Scripting 出色的面向对象设计,使我对 Unity 产生强烈兴趣。我们预计很快就可以在 Unity 中制作兼容于 DynaTalk 的 Agent。

我们打算让 DynaTalk 支持 Unity 的一个主要原因是: 对项目有更多控制权。我们之前的探索环境–Roblox 是一个云端优先的软件,你无法部署自己的作品,它必须运行在 Roblox 的云端设施上。

Visual Scripting

在 Unity 中编程,比预想的愉快。Unity 中编程体验,是强烈的面向对象风格, 场景(Scene)中所有实体的基类都是 GameObject。Unity 甚至有不错的 Liveness(活性),支持 Live Coding。

最惊艳我的是 Visual Scripting, Visual Scripting 是 Unity 的图形化编程环境。

我们来看看官方对它的介绍:

Visual scripting 支持创作者使用图形环境开发游戏机制或交互逻辑,而不是编写传统代码。

实现程序员、艺术家和设计师之间更加无缝的协作,更快地进行原型制作和迭代

Visual scripting 是设计师和艺术家的绝佳选择,他们可以通过它来测试想法、进行修改或更直接地控制自己的工作。非程序员也可以利用技术成员创建的自定义节点和图。

程序员可以赋予团队力量。使用 Visual scripting 创建自定义节点,可以让团队成员(从艺术家到设计师)之间的协作更加高效。无论他们编程知识水平如何,都可以方便地在原型设计或生产过程中共同合作。

Visual Scripting 相当强大,几乎涵盖 Unity 引擎的大部分功能,你在 C# 脚本中能够做到的事情,在 Visual Scripting 基本都能做到。

有过 Scratch 编程经验的用户,其心智模型可以轻松应用于 Visual Scripting。 如果你有过 Scratch 编程经验,Unity from Scratch 系列视频能够帮助你快速起步。

Visual Scripting 相当面向对象(和 Scratch 相似,友好性和一致性比 Scratch 差些):

  • 通过拼搭积木块,编写当前对象的行为
  • 对象之间通过消息进行通信

Visual Scripting 与 C# 之间的消息传递

尽管我打算将大多数工作都放在 Visual Scripting 里做,但有些工作,在代码中做起来会轻松很多。

所以我们需要让 Visual Scripting 与 C# 双向传递消息。

我喜欢将彼此通信的 C# 脚本和 图形化脚本 视为 2 个对象,这样一来,就可以使用"对象之间通过消息进行通信"进行思考。

有许多方式可以在 Visual Scripting 与 C# 之间传递消息,最简单、通用的一种可能是 CustomEvent

CustomEvent 支持以下方向的消息传递:

  • Visual Scripting -> Visual Scripting
  • C# -> Visual Scripting

但不支持:

  • Visual Scripting -> C#

查看 Visual Scripting(1.8.0) 源代码,发现这部分功能官方目前还没实现。

通过与 ChatGPT 的合作,我在没有入门 C# 的情况下实现了这个方向的通信:

1
2
// Visual Scripting -> C#
EventBus.Register<CustomEventArgs>(new EventHook(EventHooks.Custom, gameObject), HandleCustomEvent);

以下是一个更完整的例子,展示了如何在 Visual Scripting 与 C# 之间双向传递消息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Message Passing Manager

using Unity.VisualScripting;
using UnityEngine;

public class CodeTriggerCustomEvent : MonoBehaviour

    {
      private void Start(){
            EventBus.Register<CustomEventArgs>(new EventHook(EventHooks.Custom, gameObject), HandleCustomEvent);
      }

      void Update()
      {
         if (Input.GetKeyUp(KeyCode.C))
         {
            Debug.Log("C# Trigger...");
            CustomEvent.Trigger(gameObject, "test", "C# trigger");
         }
      }
      private void HandleCustomEvent(CustomEventArgs eventData)
         {
            Debug.Log($"C# Received event data: {eventData.name} {eventData.arguments[0]}");
         }
   }

为了

在 Unity 中制作兼容于 DynaTalk 的 Agent

我们需要在 Unity 中寻找消息传递机制,与 DynaTalk 通信。 Unity 提供了很多消息传递机制与外部系统通信, 诸如 HTTPwebsocket, 社区里有更过的第三方插件, 支持 MQTT 等消息传递机制。

我们打算采用之前探索得到的架构设计,以尽可能保持简单,同时尽可能复用我们的基础设施: 转发器、观察器、模拟器…

在我们之前的设计中,只需要使用 HTTP request, 就能完成与 DynaTalk 的双向通信。 在 Unity 中,这带来一个额外好处,编译为 WebGL 的游戏(运行在浏览器里!),也可以与 DynaTalk 通信。

DynaTalk Unity SDK

以下是一个简单演示:

以上演示使用了 DynaTalk Unity SDK(目前只是两个简单的C#文件)

DynaTalk Unity SDK 会将 DynaTalk 消息接口暴露给 C# 脚本 和 Unity Visual Scripting

以上演示视频,对应的 Visual Scripting 脚本如下所示(完全在 Unity 可视化编程环境中完成):

架构设计

架构的核心想法来自 Smalltalk:

  • 一切都是对象
  • 对象解释它所理解的消息
  • 对象通过消息进行沟通

它在 Actor 模型被表述为, 一个 Actor 可以:

  1. 响应收到的消息
  2. 发送消息
  3. 创建更多 Actor

面向对象(采用 Alan Kay 赋予它的含义)

Point of View is worth 80 IQ points – Alan Kay

面向对象不只是组织和编写代码的范式,更是一种强大隐喻和世界观。

  • 一切都是对象
  • 对象解释它所理解的消息
  • 对象通过消息进行沟通

这些观点,提供了强大的视角来看待和思考系统。很遗憾,现代面向对象(OOP),只看到了第一点。

一切都是对象。Unity 已经很好地支持了这点。我们无需再做什么。

对象解释它所理解的消息。 通过编写 Visual Scripting 与 C# 脚本,让对象使用 UnityEngine API 来合理地响应消息,实现消息所搭载的语义。

对象通过消息进行沟通。Unity 在这点上做的也不错。 Unity 支持很多消息通信的机制, 也许太多了:

  • Event
  • UnityEvent
  • EventBus
  • send message
  • CustomEvent

CustomEvent 足够通用和简单,我们将其用作内部的消息传递机制。而将 UnityWebRequest 用作 Unity 与外部系统的消息传递机制。

参考