// Считает позицию объекта с оффсетом и диапазон подходящих координат блоков 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); }