Как распечатать 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, где также есть несколько полезных примеров.