问题描述
我最近买了 astarpathfinding project pro。 我正在制作敌人 ai,我希望它在找到目标之前随机移动。 我的项目是二维的。 如何在网格上随机选择一个位置? 如果可以,你能给我举个例子吗?
解决方法
不太确定您购买的插件,但是如果您使用的是瓷砖贴图,您可以遍历网格中每个瓷砖贴图中的每个瓷砖(仅在关卡加载时一次)并生成随机数的 x 和 y 以供选择一个有效的瓷砖位置,并使用 A* 算法使 Ai 移动到那里。
编辑:可能不是最好的写法,但这是我过去对它们进行迭代的方式,如果需要,您可以根据未来的需要添加或更改其中的内容。
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Tilemaps;
public class TileMapCollision : MonoBehaviour
{
[SerializeField] private GameObject gridObject;
private TileBase tile;
public List<Vector3> StoredStaticSolidTilePositions;
private void Awake()
{
TileSearch();
}
private void TileSearch()
{
List<Tilemap> tilemaps = gridObject.GetComponentsInChildren<Tilemap>().ToList();
foreach (Tilemap tilemap in tilemaps)
{
tilemap.CompressBounds();
BoundsInt TilemapBounds = tilemap.cellBounds;
for (int x = TilemapBounds.xMin; x < TilemapBounds.xMax; x++)
{
for (int y = TilemapBounds.yMin; y < TilemapBounds.yMax; y++)
{
Vector3Int localPos = new Vector3Int(x,y,(int)tilemap.transform.position.z);
Vector3 worldPos = tilemap.CellToWorld(localPos);
if (tilemap.HasTile(localPos))
{
if (tilemap.CompareTag("Solid"))
{
StoredStaticSolidTilePositions.Add(worldPos);
}
}
}
}
}
}
}
,
我不知道您使用的是什么工具,也不知道您的“网格”究竟长什么样,但从评论来看,您似乎有一个 TileMap
。
一般来说,从一个值中选择一个随机数有 Random.Range
。 (请注意,int
的第二个(上)参数是独占。)
然后您可以得到 TileMap.size
并简单地从 TileMap
维度内的三个随机索引生成一个位置
var gridSize = tilemap.size;
var randomPos = new Vector3Int(Random.Range(0,gridSize.x),Random.Range(0,gridSize.y),gridSize.z));
var randomTile = tilemap.GetTile(randomPos);