小编Rik*_*iki的帖子

我应该使用什么方法进行C#脚本编写

我正在写一个粒子系统.(对于游戏和粒子编辑器)在这个系统中有一个0到n的修饰符.它们每帧都会修改粒子系统中的粒子.

例如,你可以有一个名为"GravityModifier"的预定义修饰符,它只对每帧的每个粒子执行以下操作:"particle.Velocity.Y + = 9.81"或类似的东西.

现在我希望用户能够在运行时(在编辑器中)编写其他修饰符.我希望能够只使用C#.由于粒子系统是写入JSON文件的,因此自定义修饰符脚本应该作为源代码(可能是base64编码)写入文件.

-

我的问题是:假设游戏想要加载这样一个粒子系统文件.如何将自定义修饰符编译为可执行代码?

回答这个问题时要考虑的另一个非常重要的事情:请注意,这将是游戏的粒子系统.编译的代码每帧调用超过3000次.(大多数是60fps)因此,编译代码执行的时间比其他游戏功能要长得多,这一点非常重要.将修饰符脚本编译成表单的委托会很好:委托void ModifyParticle(ref Particle p);

这可能吗?如果是这样,怎么样?

c# scripting delegates

6
推荐指数
2
解决办法
443
查看次数

应用程序中的“加水印”如何工作?

带有水印的意思是:一个字节数组,以某种方式集成到.exe / .dll文件中,可以进行搜索。许多反盗版/反工程师程序都包含一个称为“水印”的系统。例如VMProtect。

这是如何运作的?如果有人要破解和/或复制受保护的二进制文件,那么到底是什么阻止了他仅仅删除水印。想法是,作为软件的创建者,您可以下载自己程序的盗版副本,然后您可以查看谁确切泄漏了该副本或将其上传。究竟是什么阻止攻击者仅扫描水印并将其删除??

该问题的第二部分:据说(或应该)在二进制文件的不同,随机位置处多次包含(或应包含)水印。显然,它们不是完全随机的。因为这将以损坏硬盘的方式损坏二进制文件。可以肯定的是,该程序不能只覆盖带有水印的二进制代码。保护程序如何在二进制文件的不同(随机)位置中包含水印?如何选择这些位置?

第三部分:假设我有带水印的二进制文件。保护程序以后将如何扫描水印。如何再次找到水印?

另外,水印中如何包含信息(一个小字符串,标识副本的原始所有者)?信息是否以某种方式加密到水印中?

language-agnostic protection watermark piracy-prevention

5
推荐指数
0
解决办法
1624
查看次数

使用Json.NET序列化XNA矩形

我正在使用Json.NET 首先看看这个:

using System.Drawing;
string json = JsonConvert.SerializeObject(new Rectangle(-3,6,32,32), Formatting.Indented);
Console.WriteLine(json);
Rectangle deserializedRectangle = JsonConvert.DeserializeObject<Rectangle>(json);
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.控制台输出为:"3,6,32,32"

但是当我想用XNA Rectangle做同样的事情时,我得到一个错误.(刚刚使用Microsoft.Xna.Framework替换旧的使用;")

控制台输出为:"{X:-3 Y:6宽度:32高度:32}"

它抛出的错误是:"转换值"{X:-3 Y:6宽度:32高度:32}时出错"输入'Microsoft.Xna.Framework.Rectangle'."

  1. 为什么会这样?

  2. 什么是错的,我该如何解决这个问题?

c# xna serialization json.net

5
推荐指数
1
解决办法
2176
查看次数

C#脚本和安全性

在我的游戏中(也用C#编写)我希望包含某种自定义支持.速度是一个很大的问题因为我打算将游戏的主要部分卸载到脚本中.因此,我选择使用C#来编写游戏事件和内容的脚本.用户还应该能够在C#中为游戏编写脚本和插件.(我知道C#不是一种脚本语言.)

我将为用户提供一个(静态)类,其中包含与游戏交互所需的所有功能.用户还可以提供代码作为源代码(在这种情况下游戏将编译它). 在某些情况下,编译的用户"脚本"也可以/将被传输给其他玩家.例如,用户可以在他的家中或其他任何地方构建脚本陷阱.

这是我的问题:

  1. 安全

    如何确保所提供的代码仅被强制调用所提供的API(类)的内容?为了防止欺骗脚本,恶意活动......

    有没有办法在某种VM或低信任环境中运行已编译的代码?

  2. 速度

    这种方法会足够快吗?(每隔一帧或每隔一帧调用多达100个自定义程序集的功能).关于这个的任何提示?

    也许通过将所有用户内容编译成一个大型组件或其他任何东西来获得速度优势?

  3. 尺寸

    如何使编译后的代码变小(除了压缩它)?因为玩家可能需要下载数十个脚本......

    有没有办法去除不是绝对​​必要的东西?像调试信息或类名等...

运行时编译对我来说是相当新的(这就是我在这里问的原因).因此,指出一些重大的初学者错误和/或安全问题会很好.

编辑:

只是为了澄清:用户插件/脚本或任何你想要调用它的类将是一个类(也用C#编写),它必须实现特定的功能,如"GetAddonInfo","Init","Update"...就像一个普通的C#类,派生自我的抽象"Addon"类.

c# security scripting dynamic-compilation

3
推荐指数
1
解决办法
815
查看次数

如何使用restsharp上传多个文件?

我想将文件上传到此api https://support.crowdin.com/api/add-file/

如何files使用RestSharp 创建一个名为的参数并向其中添加多个文件?

到目前为止,我已经编写了此代码,但是它不起作用,RestSharp似乎没有按预期上传文件。

        var addUrl = new Uri($"https://api.crowdin.com/api/project/{projectIdentifier}/add-file?key={projectKey}&json=");


        var restClient = new RestSharp.RestClient("https://api.crowdin.com");
        var request = new RestSharp.RestRequest($"api/project/{projectIdentifier}/add-file", RestSharp.Method.POST);
        request.AlwaysMultipartFormData = true;

        request.AddQueryParameter("key", projectKey);
        request.AddQueryParameter("json", "");

        var files = new Dictionary<string, byte[]>
        {
            { "testfile", File.ReadAllBytes(fileName) }
        };
        request.AddParameter("files", files, RestSharp.ParameterType.RequestBody);

        var restResponse = restClient.Execute(request);
Run Code Online (Sandbox Code Playgroud)

这给我

{
  "success":false,
  "error":{
    "code":4,
    "message":"No files specified in request"
  }
}
Run Code Online (Sandbox Code Playgroud)

c# file-upload http restsharp

1
推荐指数
1
解决办法
5621
查看次数