Ejemplo n.º 1
0
    static public bool Fit(Vector3 pos, out Vector3 result, int size = 1, CollisionLayers mask = CollisionLayers.Walk)
    {
        int index = instance.MapToIndex(pos);

        int maxIterations = 100;
        int sign          = 1;

        for (int i = 1; i < maxIterations; ++i, sign = -sign)
        {
            int end = index + sign * i;
            for (; index != end && index > size && index < instance.map.Length - size - 1; index += sign)
            {
                if (Passable(index, mask, size))
                {
                    result = instance.MapToIso(index);
                    return(true);
                }
            }

            end = index - sign * i * instance.width;
            int step = -sign * instance.width;
            for (; index != end && index > size && index < instance.map.Length - size - 1; index += step)
            {
                if (Passable(index, mask, size))
                {
                    result = instance.MapToIso(index);
                    return(true);
                }
            }
        }

        result = new Vector3();
        return(false);
    }
Ejemplo n.º 2
0
    public static bool Passable(int index, int size = 1, bool debug = false, GameObject ignore = null)
    {
        UnityEngine.Profiling.Profiler.BeginSample("PassableTile");
        if (index - size - size * instance.width < 0 || index + size + size * instance.width >= instance.map.Length)
        {
            return(false);
        }

        index = index - size / 2 - size / 2 * instance.height;
        int step = instance.width - size;

        for (int y = 0; y < size; ++y)
        {
            int end = index + size;
            while (index < end)
            {
                if (debug)
                {
                    var tilePos = instance.MapToIso(index);
                    Iso.DebugDrawTile(tilePos, 0.1f);
                }

                var cell = instance.map[index];
                if (!cell.passable && (ignore == null || ignore != cell.gameObject))
                {
                    UnityEngine.Profiling.Profiler.EndSample();
                    return(false);
                }
                ++index;
            }
            index += step;
        }

        UnityEngine.Profiling.Profiler.EndSample();

        return(true);
    }