Как распечатать Vector2D в нереализованном виде

У меня есть эта функция:

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, это станет громоздким для больших структур или классов.

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 и другие макросы. Посетите Globals.uci в Development/Src/Core, где также есть несколько полезных примеров.

Другие вопросы по тегам