微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Unity astar 寻路项目——如何从网格中随机选取一个位置?

如何解决Unity astar 寻路项目——如何从网格中随机选取一个位置?

我最近买了 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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。