Intereting Posts
Как получить уведомление о завершении сборки локальной сборки Visual Studio? Async vs Sync Benchmarks на controllerе MVC с вопросами Скопируйте файл с его исходными разрешениями C # User Control, который может содержать другие элементы управления (при его использовании) Как правильно вернуть символ * из неуправляемой библиотеки DLL на C #? Лучший способ переключения между статическими активами и ресурсами на основе CDN для разработки и развертывания Корректность констант в C # с богатыми типами Отключить Alt + F4, но разрешить закрытие формы кодом, CloseReason.UserClosing не помогает Подсчитайте IOrderedEnumerable, не потребляя его Как я могу захватить значение внешней переменной внутри выражения lambda? Console.WriteLine не отображается в окне вывода C # 4.0: конвертировать PDF в байт и наоборот Когда я не должен использовать ThreadPool в .Net? Программно компилировать машинописные тексты в C #? Внедрение синтаксического выражения для обозначения префиксов с использованием Иронии

Как выбрать / вызвать объект сгенерированный GameObject внутри массива без индекса usind

В настоящее время я работаю над созданием случайной сетки для игровой карты, и я как бы зациклился на том, как я могу назвать экземпляр объекта на основе их координат игры (а не Vector3).

Это мой сценарий генерации шестнадцатеричного кода:

public HexCell cellPrefab; HexCell[] cells; void CreateCell (int x, int z, int i) { Vector3 position; position.x = (x + z * 0.5f - z / 2) * (HexMetrics.innerRadius * 2f); position.y = 0f; position.z = z * (HexMetrics.outerRadius * 1.5f); HexCell cell = cells[i] = Instantiate(cellPrefab); cell.coordinates = HexCoordinates.FromOffsetCoordinates(x, z); } 

Я могу назвать объект штрафом, используя массив объектов объектов, но я не могу склонить голову вокруг идеи вызвать его на основе его заданных координат.

Вот как я даю им координаты, основанные на каждой позиции гекса;

 public class HexCell : MonoBehaviour { public HexCoordinates coordinates; } public struct HexCoordinates { [SerializeField] private int x, z; public int X { get { return x; } } public int Y { get { return -X - Z; } } public int Z { get { return z; } } public HexCoordinates (int x, int z) { this.x = x; this.z = z; } public static HexCoordinates FromOffsetCoordinates (int x, int z) { return new HexCoordinates(x - z / 2, z); } } 

Итак, как мне выбрать / выбрать нужный гексагон на основе координат HexCell?

Итак, как мне выбрать / выбрать нужный гексагон на основе координат HexCell?

Это легко сделать, поскольку вы использовали int вместо float для представления координаты. Просто зациклируйте массив cells . В каждом цикле получите доступ к переменной coordinates из компонента HexCell затем сравните значения x, y и z. Если они совпадают, верните текущий HexCell в цикле. Если нет, просто верните null . Вы также можете сделать это с помощью linq но избегайте этого.

Ваш массив ячеек:

 HexCell[] cells; 

Получите HexCell от координат:

 HexCell getHexCellFromCoordinate(int x, int y, int z) { //Loop thorugh each HexCell for (int i = 0; i < cells.Length; i++) { HexCoordinates hc = cells[i].coordinates; //Check if coordinate matches then return it if ((hc.X == x) && (hc.Y == y) && (hc.Z == z)) { return cells[i]; } } //No match. Return null return null; } 

Поскольку координата находится в int вместо float , вы можете также использовать Vector3Int (требуется Unity 2017.2 и выше) для представления вместо x, y и z. Обратите внимание, что это отличается от Vector3 .

 HexCell getHexCellFromCoordinate(Vector3Int coord) { //Loop thorugh each HexCell for (int i = 0; i < cells.Length; i++) { HexCoordinates hc = cells[i].coordinates; //Check if coordinate matches then return it if ((hc.X == coord.x) && (hc.Y == coord.y) && (hc.Z == coord.z)) { return cells[i]; } } //No match. Return null return null; } 

Кроме того, вы можете использовать некоторые встроенные функции, чтобы сделать его более читаемым.

 HexCell getHexCellFromCoordinate(int x, int y, int z) { return cells.FirstOrDefault( cell => cell.x == x && cell.y == y && cell.z == z ); } HexCell getHexCellFromCoordinate(Vector3Int coord) { return cells.FirstOrDefault(cell => cell.x == coord.x && cell.y == coord.y && cell.z == coord.z ); } 

Стоит отметить, так как я не уверен, где вам нужно будет найти ячейки, FirstOrDefault делает выделение кучи и поэтому слишком часто FirstOrDefault на слишком большой список (например, десятки тысяч раз за кадр и / или против десятков тысяч объектов), это может привести к нежелательным сборам мусора, которые могут вызвать заикание в вашем приложении, и что заикание может быть заметным в сочетании с другим кодом, который использует распределение кучи волей-неволей.

Итак, как правило, начните с чего-то простого. Если ваше приложение начинает замедляться или занимает слишком много памяти, вернитесь и оптимизируйте его, начиная с самого жаркого (наименее совершенного) кода. Вы можете использовать профилировщик, чтобы помочь вам найти эти места. Но, пожалуйста, не заколлируйте свой код с помощью циклов, чтобы сохранить некоторые дополнительные циклы процессора.