// Считает позицию объекта с оффсетом и диапазон подходящих координат блоков protected Vector3 CalculatePositionAndRanges(GameObject obj, out Vector3i rangeStart, out Vector3i rangeEnd) { // Реальная позиция с учетом оффсета var offset = CalculateOffset(obj); var objPosition = obj.transform.position - transform.rotation * offset; // Нам нужна локальная позиция повернутая в противоположную сторону редактору // Вращаем вокруг центра редактора var localObjPosition = (Quaternion.Inverse(transform.rotation) * (obj.transform.position - transform.position) + transform.localScale / 2 - offset); // Локальная позиция в блоках var localObjPositionInBlocks = Vector3.Scale(localObjPosition, VectorUtils.Divide(size, transform.localScale)); // Сколько блоков вокруг текущего нам подходят var addedRange = new Vector3(maxBlockDistance, maxBlockDistance, maxBlockDistance); // Начало и конец диапазона подходящих блоков rangeStart = VectorUtils.Max(VectorUtils.FloorToInt(localObjPositionInBlocks - addedRange), Vector3i.zero); rangeEnd = VectorUtils.Min(VectorUtils.CeilToInt(localObjPositionInBlocks + addedRange), size - Vector3i.one); // Debug.DrawRay(localObjPosition + transform.position - transform.localScale / 2, transform.localScale / 2); // Debug.LogFormat("{2} - {0} {1}", rangeStart, rangeEnd, localObjPosition); return(objPosition); }
// Устанавливает главенствующий редактор, считает различие масштабов public void SetParentStation(BuildStation parentStation) { parent = parentStation; // Синхронизируем размеры редакторов перед инициализацией size = parent.size; base.Awake(); // Считаем различие между масштабами редактора и дисплея scaleDif = VectorUtils.Divide(blockSize, parent.blockSize); }
// Считает число блоков между двумя крайними блоками, которые будет занимать объект (минимум один блок) protected Vector3i CalculateBlockMagnitude(GameObject obj) { var objSize = CalculateSize(obj); return(VectorUtils.Max(VectorUtils.RoundAroundToInt(VectorUtils.Divide(objSize, blockSize), maxObjectProtrusion), Vector3i.one)); }
/* События Unity */ // Считает размер блоков protected virtual void Awake() { OpenDebugFile(); blockSize = VectorUtils.Divide(transform.localScale, size); debugTotalBlocks = size.x * size.y * size.z; }