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