MoonSharp 文档三

devtools/2025/3/11 9:18:49/

MoonSharp 文档一-CSDN博客

MoonSharp 文档二-CSDN博客

MoonSharp 文档四-CSDN博客

MoonSharp 文档五-CSDN博客

7.Proxy objects(代理对象)

如何封装你的实现,同时又为脚本提供一个有意义的对象模型

官方文档:MoonSharp

在现实世界的场景中,脚本往往会超出你的控制范围。这带来了几个问题,包括:

•  安全性:这部分内容与本页主题无关,但如果你的脚本来自非严格控制的环境,请阅读有关沙盒化的部分。

•  向后和向前兼容性:MoonSharp 尽力避免引入与过去或未来的兼容性问题,但你的 API 设计是你的责任!

实现上述两点的一个关键方法是封装你的实现细节,确保没有 API 不应该调用的字段被调用,并且你可以按照自己的意愿发展你的内部模型,几乎不用担心意外破坏脚本。

有两种封装方式,一种是以一些非常复杂的方式复制所有你的 API。另一种是通过“代理对象”(一种 “脚本用的 DTOs”)。

这个概念非常简单。对于每一个你想要封装并暴露给脚本的类型,你必须提供一个“代理类型”,这是一个类,它操作一个被封装(目标)类型的实例。

用一个例子来说明更直观:

// Declare a proxy class
class MyProxy
{MyType target;[MoonSharpHidden]public MyProxy(MyType p){this.target = p;}public int GetValue() { return target.GetValue(); }
}// Register the proxy, using a function which creates a proxy from the target type
UserData.RegisterProxyType<MyProxy, MyType>(r => new MyProxy(r));// Test with a script - only the proxy type is really exposed to scripts, yet everything it works
// just as if the target type was actually used..Script S = new Script();S.Globals["mytarget"] = new MyType(...);
S.Globals["func"] = (Action<MyType>)SomeFunction;S.DoString(@"x = mytarget.GetValue(); func(mytarget); 
");

除了封装,还可以使用代理对象进行一些巧妙的操作。

其中一个方法非常简单但非常有用——正确地访问值类型;例如,你可以包装 Unity 的 Transform 类——这个类完全由值类型组成,但它是一个引用类型——用一个不同的接口来保持正确的引用!


http://www.ppmy.cn/devtools/166248.html

相关文章

RISC-V医疗芯片工程师复合型转型的路径与策略

从RISC-V到医疗芯片:工程师复合型转型的路径与策略 一、引言 1.1 研究背景 在科技快速发展的当下,芯片技术已然成为推动各行业进步的核心驱动力之一。其中,RISC-V 架构作为芯片领域的新兴力量,正以其独特的优势迅速崛起,对整个芯片产业的格局产生着深远影响。RISC-V 架…

【Linux docker 容器】关于想要让虚拟机在开机时候也docker自己启动,容器也自己启动,省去要自己开docker和容器

确认 Docker 服务状态&#xff1a; 首先&#xff0c;你需要确保 Docker 服务已经在虚拟机上安装并正确配置。你可以使用如下命令来检查 Docker 服务的状态&#xff1a; systemctl status docker.service 如果服务没有运行&#xff0c;你可以使用以下命令启动它&#xff1a; s…

Flink-DataStreamAPI-生成水印

下面我们将学习Flink提供的用于处理事件时间戳和水印的API&#xff0c;也会介绍有关事件时间、流转时长和摄取时间&#xff0c;下面就让我们跟着官网来学习吧 一、水印策略介绍 为了处理事件时间&#xff0c;Flink需要知道事件时间戳&#xff0c;这意味着流中的每个元素都需要…

Rust 模式匹配中的可反驳性与不可反驳性

1. 什么是可反驳模式和不可反驳模式&#xff1f; 1.1.不可反驳模式&#xff08;Irrefutable Patterns&#xff09; 不可反驳模式是 总能匹配任何可能值 的模式。例如&#xff0c;下面的 let 语句&#xff1a; let x 5;x 是一个不可反驳模式&#xff0c;它匹配 任何值&#…

#函数探幽

c内联函数 内联函数与其他函数的区别&#xff08;这必须深入到程序的内部&#xff09;&#xff1a;编译的最终产品是可执行程序-----它是由机械语言指令组成。运行时程序&#xff0c;操作系统会把这些指令载入到计算机内存中&#xff0c;分配内存逐步执行。在调用函数时&#x…

深入解析K8s VolumeMounts中的subPath字段及其应用

文章目录 前言一、什么是subPath二、subPath使用场景三、场景一示例1.资源准备2.使用subPath字段 四、场景二示例1.资源准备2.测试 前言 在Kubernetes中&#xff0c;挂载存储卷是容器化应用的常见需求。然而当我们将整个卷挂载到容器中的某个目录时&#xff0c;可能会覆盖目标…

深入理解网络通信:从OSI七层模型到TCP/IP协议栈

在网络技术飞速发展的今天&#xff0c;无论是日常浏览网页、在线观看视频&#xff0c;还是企业级的数据交换和云计算服务&#xff0c;背后都离不开复杂而精密的网络通信机制。这些机制确保了数据能够在全球范围内的不同设备间准确无误地传输。为了更好地理解和掌握这一过程&…

HTML页面中divborder-bottom不占用整个底边,只占用部分宽度

根据豆包提示&#xff0c;有2个方案&#xff1a;使用使用伪元素 ::after&#xff0c;使用 linear-gradient 背景 方案1&#xff1a;通过伪元素 ::after 可以创建一个新的元素&#xff0c;并为其设置样式&#xff0c;模拟只显示一半宽度的底部边框。 解释&#xff1a; .half-…