UDK 使用 .NET。那么也许有可能以某种方式使用 UnrealScript 中的 .NET?
将 C# 与 UnrealScript 一起使用真的很棒。
当然可以构建 C++ 层以在 .NET 和使用dllimport的UnrealScript 之间进行交互,但这不是这个问题的主题。
UDK 使用 .NET。那么也许有可能以某种方式使用 UnrealScript 中的 .NET?
将 C# 与 UnrealScript 一起使用真的很棒。
当然可以构建 C++ 层以在 .NET 和使用dllimport的UnrealScript 之间进行交互,但这不是这个问题的主题。
所以似乎没有办法直接从 UnrealScript 访问 .NET 库,但是可以将C# 的 [DllExport] 扩展和 UnrealScript 互操作系统结合起来与 .NET 交互,而无需中间的 C++ 包装器。
让我们看一下在 C# 中与 int、string、struct 交换和填充 UnrealScript String 的简单示例。
1 创建 C# 类
using System;
using System.Runtime.InteropServices;
using RGiesecke.DllExport;
namespace UDKManagedTestDLL
{
struct TestStruct
{
public int Value;
}
public static class UnmanagedExports
{
// Get string from C#
// returned strings are copied by UnrealScript interop system so one
// shouldn't worry about allocation\deallocation problem
[DllExport("GetString", CallingConvention = CallingConvention.StdCall]
[return: MarshalAs(UnmanagedType.LPWStr)]
static string GetString()
{
return "Hello UnrealScript from C#!";
}
//This function takes int, squares it and return a structure
[DllExport("GetStructure", CallingConvention = CallingConvention.StdCall]
static TestStructure GetStructure(int x)
{
return new TestStructure{Value=x*x};
}
//This function fills UnrealScript string
//(!) warning (!) the string should be initialized (memory allocated) in UnrealScript
// see example of usage below
[DllExport("FillString", CallingConvention = CallingConvention.StdCall]
static void FillString([MarshalAs(UnmanagedType.LPWStr)] StringBuilder str)
{
str.Clear(); //set position to the beginning of the string
str.Append("ha ha ha");
}
}
}
2 将 C# 代码编译为 UDKManagedTest.dll 并放置到 [\Binaries\Win32\UserCode](或 Win64)
3 在 UnrealScript 方面,应放置函数声明:
class TestManagedDLL extends Object
DLLBind(UDKManagedTest);
struct TestStruct
{
int Value;
}
dllimport final function string GetString();
dllimport final function TestStruct GetStructure();
dllimport final function FillString(out string str);
DefaultProperties
{
}
然后就可以使用这些功能了。
唯一的技巧是填充 UDK 字符串,就像在 FillString 方法中显示的那样。由于我们将字符串作为固定长度缓冲区传递,因此必须初始化此字符串。初始化字符串的长度必须大于或等于 C# 可以使用的长度。
进一步阅读可以在这里找到。