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); }
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); }