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);
    }
Beispiel #2
0
    // Устанавливает главенствующий редактор, считает различие масштабов
    public void SetParentStation(BuildStation parentStation)
    {
        parent = parentStation;

        // Синхронизируем размеры редакторов перед инициализацией
        size = parent.size;

        base.Awake();

        // Считаем различие между масштабами редактора и дисплея
        scaleDif = VectorUtils.Divide(blockSize, parent.blockSize);
    }
Beispiel #3
0
    // Считает число блоков между двумя крайними блоками, которые будет занимать объект (минимум один блок)
    protected Vector3i CalculateBlockMagnitude(GameObject obj)
    {
        var objSize = CalculateSize(obj);

        return(VectorUtils.Max(VectorUtils.RoundAroundToInt(VectorUtils.Divide(objSize, blockSize), maxObjectProtrusion), Vector3i.one));
    }
Beispiel #4
0
    /* События Unity */

    // Считает размер блоков
    protected virtual void Awake()
    {
        OpenDebugFile();
        blockSize        = VectorUtils.Divide(transform.localScale, size);
        debugTotalBlocks = size.x * size.y * size.z;
    }