0

我有这个功能:

function AddImpulse(Vector2D impulse)
{
    `log("ADD IMPULSE: " $ impulse);
}

问题是我收到错误“正确的类型与'$'不兼容。看起来,虽然内置的向量类会自动强制转换为字符串,但Vector2D类只是一个没有任何运算符重载的内置结构或自动转换。

我写了一个操作符重载来帮助这种情况,但是除非我将重载声明放在对象类中(我认为不应该这样做),否则我必须在每个可能使用它的类中声明它:

static final operator(40) string $ (string A, Vector2D B)
{
    return A $ string(B.x) $ ", " $ string(B.y);
}

有没有办法可以通用地做到这一点,这样我就不需要每次都这样做:

`log("ADD IMPULSE: " $ impulse.x $ "," $ impulse.Y);

虽然这在 Vector2D 的情况下还不错,但是对于较大的结构或类,这将变得很麻烦。

4

1 回答 1

1

不幸的是,您在 UnrealScript 中进行泛型编程的选择是有限的。`include一种选择可能是将运算符重载放在包含文件中,并使用宏将其包含在需要它的每个类中。

如果这不起作用,另一种选择可能是使用宏来调用特殊类中的静态函数来处理结构到字符串的转换。

首先在代码包的根文件夹中创建一个 Globals.uci 文件。Globals.uci 是一个特殊文件,编译器会自动将其包含在与其关联的包中的所有 UncrealScript 文件中。如果您的包名为 MyPackage,则 Globals.uci 将位于 Development/Src/MyPackage/Globals.uci。它应该在您的包的 Classes 文件夹旁边。

将您的宏放入 Globals.uci:

`define toString(type,name) class'MyStructConversions'.static.`{type}ToString(`{name},"`{name}")

将您的转换函数放在 MyStructConversions.uc 中:

class MyStructConversions;

static function string Vector2DToString (const out Vector2D A, string varname)
{
    return varname $ ": (" $ A.X $ ", " $ A.Y $ ")";
}

现在,当您`toString(Vector2D, impulse)从包中的任何位置调用时,宏将在编译时替换为对 Vector2DToString 函数的调用。然后,您可以通过将适当的定义添加到 MyStructConversions.uc 来支持更多结构类型,并且 toString 宏将与它们无缝协作。

UnrealScript 预处理器的文档有更多关于`include宏和其他宏的信息。查看 Development/Src/Core 中的 Globals.uci 以获得一些有用的示例。

于 2013-05-26T19:35:21.077 回答