Using .NET with UnrealScript

本文关键字:UnrealScript with NET Using | 更新日期: 2023-09-27 18:03:56

UDK使用。net。所以也许有可能从UnrealScript中使用。net ?
在UnrealScript中使用c#真的很棒。

当然可以构建c++层来在。net和UnrealScript之间进行交互,这将使用dllimport,但它不是这个问题的主题。

Using .NET with UnrealScript

所以似乎没有办法直接从UnrealScript访问。net库,但是可以结合c#和UnrealScript互操作系统的[DllExport]扩展来与。net交互,而不需要中间的c++包装器。

让我们看一个简单的例子,在c#中交换int, string, structure和填充UnrealScript string。

创建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)

在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
{
}

然后可以使用这些函数。


唯一的技巧是像FillString方法中显示的那样填充UDK字符串。由于我们将string作为固定长度的缓冲区传递,因此必须初始化该字符串。初始化字符串的长度必须大于或等于c#可以处理的长度。