Благодаря ответу Марка Гравелла я придумал эту концепцию (и, по общему признанию, новое решение мне нравится больше, чем старое, поэтому еще раз спасибо!)
Изменения, внесенные в класс Void:
public class Void : TilePrototype {
public static Void instance = new Void();
public static Tile get {
get {
return new Tile(instance.id);
}
}
public Void() {
isBlocking = true;
}
public override RenderTile render(Tile tile){
return new RenderTile(0, new Color(0, 0, 0, 0));
}
}
Итак, как вы можете видеть, я сделал переменную "get" свойством, чтобы она оценивалась позже, когда вам действительно нужен тайл, а не на строительстве.
Я изменил все "get" таким образом.
Второе изменение в TilePrototype:
public class TilePrototype {
public static Dictionary<int, TilePrototype> tilePrototypeDictionary = new Dictionary<int, TilePrototype>();
public static void registerPrototype(int id, TilePrototype tp){
tp.id = id;
tilePrototypeDictionary.Add(id, tp);
}
public static bool registered = false;
public static void registerAll(){
if( registered ) return;
registerPrototype(0, Void.instance);
registerPrototype(1, Air.instance);
registerPrototype(2, Floor.instance);
registerPrototype(3, Wall.instance);
(...)
Здесь я добавил функции registerPrototype и registerAll.
Это дает мне легкий доступ ко всем зарегистрированным идентификаторам типов (скажем, Wall.instance.id), а также наоборот (от идентификатора к экземпляру через словарь)
У меня также есть все зарегистрированные вещи в одном месте, с возможностью добавления во время выполнения еще
В целом, намного аккуратнее, и здесь я уверяю, что все плитки зарегистрированы правильно и им присвоены правильные идентификаторы.
Смена идентификатора проста и в одном месте и везде, доступ к этому идентификатору осуществляется через короткий .instance.id
Еще раз спасибо за помощь:)