Итак, я делаю небольшую мобильную игру и пытаюсь структурировать все как можно лучше... но есть вопросы.
Предположим, у вас есть коллекция оружия в массиве. Насколько плохо было бы создать ссылку (activeWeapon) на оружие в коллекции и использовать ее, а не обращаться к коллекции непосредственно в массиве?
Например.
public Weapon activeWeapon; // Accessing this, and re-assigning from collection when changing weapon.
public Weapon[] weaponCollection;
Я предполагаю, что «activeWeapon» — это просто указатель адреса, верно? То есть назначение его другому оружию в коллекции не должно давать слишком много мусора?
Или я плохой человек?
В этом нет ничего плохого, как вы сказали, это просто указывает на GameObject. Использование одной ссылки и ссылки из массива даст один и тот же результат, и ссылка будет обновлена в обеих переменных.
Переменные ссылочного типа не являются «мусором», это просто переменные, которые ссылаются на объекты. Объекты (типизированные как тип ref) становятся «мусором», когда на них больше нет ссылок. В большинстве программ вам обычно не нужно слишком много думать о проблемах с мусором и сборщиком мусора. Есть два ключевых момента для беспокойства. 1) когда вы создаете много объектов, которые быстро становятся мусором (с этим хорошо справляется конкатенация строк в цикле), и 2) когда вы непреднамеренно держите ссылку на объект намного дольше, чем нужно, не давая ему стать мусором . Как правило, вещи в основном "просто работай"
Я вижу, это многое проясняет. Спасибо за быстрые ответы =)





Если вы определили Weapon как класс в C# (т. е. не структуру), это вполне нормально сделать так, как вы описали. activeWeapon — это просто ссылка, поэтому вы можете изменять ее столько раз, сколько хотите, и это не вызовет никакого дополнительного мусора, поскольку у вас все равно будет один экземпляр этого Weapon, даже если вы ссылаетесь на него дважды из двух разных мест.
Подробнее о ссылочных типах можно прочитать здесь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types
Большое спасибо за ответ. Я совершенно забыл, что фактический указатель находится в стеке и ссылается только на кучу. Спасибо еще раз.
Это просто указатель на объект