Ваша главная проблема здесь в том, что вы не можете знать заранее, сравниваете ли вы зеркало с световым лучом, световой луч с зеркалом, зеркало с зеркалом или световой луч с световым лучом.Вы также предполагаете, что может быть добавлено больше типов сущностей, так что набор возможных сравнений начинает набухать, и, как вы правильно указали, все элементы в любом случае рассматриваются как базовая сущность.
Может показаться, чтоСамый простой ответ - разделить световые лучи и зеркала перед циклом сравнения, тогда у вас есть четко определенные отношения для сравнения.Вы могли бы сделать это, используя LINQ, но я понимаю, что с точки зрения предсказуемой производительности это может быть нежелательно.
Если вы не можете фактически хранить их отдельно в своих структурах игровых данных, вы можете построить два списка таким образом:
List<Entity> entities = entityManager.level.CurrentSection.Entities;
List<Mirror> mirrors = new List<Mirror>();
List<Lightbeam> lightbeams = new List<Lightbeam>();
for (int i = 0; i < entities.Count - 1; i++)
{
if (entities[i] is Mirror)
mirrors.Add((Mirror)entities[i]);
if (entities[i] is Lightbeam)
lightbeams.Add((Lightbeam)entities[i]);
}
После этого цикл становится следующим:
for (int i = 0; i < mirrors.Count - 1; i++)
{
for (int j = 0; j < lightbeams.Count; j++)
{
if(mirrors[i].boundingBox.Intersects(lightbeams[j].boundingBox))
{
collisionResponder.Collide(mirrors[i], lightbeams[j]);
}
}
}
Код по-прежнему будет нуждаться в обновлении для каждого добавляемого нового типа объекта, но ваши сравнения будут понятны.Я подозреваю, что ваше разделение между типами сущностей, вероятно, будет световыми лучами и препятствиями, поэтому я все еще ожидаю увидеть только две коллекции, так как я также ожидаю, что препятствия не могут занимать одну и ту же ограничивающую рамку, и это будетпользовательский интерфейс.Имея это в виду, вам никогда не придется проверять столкновение между препятствиями за пределами пользовательского интерфейса, только столкновение между световым лучом и препятствием.В любом случае, для меня имеет смысл рассматривать их как слои в структурах данных и поддерживать их отдельно.