Unity3D之迷宫寻路使用_直接寻路

学了一段时间的寻路,在网上也学了挺多算法,今天整理了一下,使用到Unity的3D界面中用于寻路,首先是简单的寻路算法,以下是地图:

地图数组:

using UnityEngine;
using System.Collections;

public static class MapsArray {

    public static int[,] MazeItem = new int[15, 10]   //初始化迷宫
		{
			{1,1,1,1,1,1,1,1,1,1},
			{1,0,1,1,1,0,0,0,1,1},
			{1,0,0,1,1,0,1,0,1,1},
			{1,0,0,0,0,0,1,0,1,1},
			{1,1,0,1,0,1,1,0,1,1},
			{1,1,0,1,0,0,0,0,1,1},
			{1,0,0,0,1,1,1,0,1,1},
			{1,1,0,0,0,0,0,0,1,1},
			{1,1,0,1,1,1,0,0,0,1},
			{1,1,0,0,1,1,1,0,1,1},
            {1,1,1,0,0,0,0,0,1,1},
            {1,1,1,1,0,0,1,0,1,1},
            {1,0,0,0,0,1,1,0,0,1},
            {1,0,1,1,1,0,1,1,0,1},
            {1,1,1,1,1,1,1,1,1,1}
		};
}

然后是简单寻路的代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TestPathing : MonoBehaviour {

    private int[,] MazeItem;   //初始化迷宫

	private GameObject npc;             // npc
	private List<Vector3> path;         // 路径
    private Vector3 target = Vector3.zero;
    private float speed = 4;            // npc移动速度
    private int n = 0;                  // 当前已经移动的路点
    private const int xStart = 1;
    private const int yStart = 1;
    private const int xEnd = 8;
    private const int yEnd = 8;
	void Start () {
        MazeItem = MapsArray.MazeItem;  // 初始化迷宫数组
		path = new List<Vector3> ();
		StartCoroutine (CreateMap());
	}

    void Update()
    {
        if (target != Vector3.zero)
        {
            if (path.Count > 0)
            {
                npc.transform.position = Vector3.MoveTowards(npc.transform.position, target, Time.deltaTime * speed);
                if (npc.transform.position == target)
                {
                    target = GetTarget();
                }
            }
        }
    }

    // 创建地图
	IEnumerator CreateMap () {
        // 地图全局
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
		yield return cube;
		for (int i = 0; i < MazeItem.GetLength(0); i++) {
			for (int j = 0; j < MazeItem.GetLength(1); j++) {
				if(MazeItem[i, j] == 1) {
					Instantiate(cube, new Vector3(i, j, 0), Quaternion.identity);
				}
			}
		}

        // 起始点标记
        GameObject start = Instantiate(cube, new Vector3(xStart, yStart, 0), Quaternion.identity) as GameObject;
        start.transform.localScale = Vector3.one * 0.3f;
        start.renderer.material.color = Color.grey;
        GameObject end = Instantiate(cube, new Vector3(xEnd, yEnd, 0), Quaternion.identity) as GameObject;
        end.transform.localScale = Vector3.one * 0.3f;
        end.renderer.material.color = Color.blue;
		yield return new WaitForEndOfFrame();
        StartCoroutine(CreateNPC());

	}

    // 创建NPC
    IEnumerator CreateNPC()
    {
        GameObject npc_Prefab = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        yield return npc_Prefab;
        if (MazeItem[1, 1] == 0)
        {
            npc = Instantiate(npc_Prefab, new Vector3(1, 1, 0), Quaternion.identity) as GameObject;
            npc.renderer.material.color = Color.green;
            target = npc.transform.position;        // 设置初始点
        }
        yield return new WaitForEndOfFrame();
        StartCoroutine(Pathing());

    }

    // 开始寻路
    IEnumerator Pathing() {
        if (GoPathing(xStart, yStart, xEnd, yEnd))
        {
            print("有路!!!");
        }
        else
        {
            print("没路!!!");
        }
        yield return new WaitForEndOfFrame();
    }

    bool GoPathing(int startX, int startY, int endX, int endY)
    {
        if (startX < 0 || startX >= MazeItem.GetLength(0) || startY < 0 || startY >= MazeItem.GetLength(1) || MazeItem[startX, startY] == 1)
            return false;
        MazeItem[startX, startY] = 1;// 防止重复走
        if ((startX == endX && startY == endY) ||
            GoPathing(startX - 1, startY, endX, endY) || GoPathing(startX + 1, startY, endX, endY) ||
            GoPathing(startX, startY - 1, endX, endY) || GoPathing(startX, startY + 1, endX, endY))
        {
            // 存储路径点
            path.Add(new Vector3(startX, startY, 0));
            print("X:" + startX + "Y:" + startY);
            return true;
        }
        else
        {
            return false;
        }
    }

    // 获取路径
    Vector3 GetTarget()
    {
        Vector3 point = npc.transform.position;
        if (path.Count > 0 && n < path.Count)
        {
            point = path[path.Count - n - 1];
            n++;
        }
        return point;
    }
}

为了不让整个博客界面太长,请看下一篇《Unity3D之迷宫寻路_A*最短路径寻路》

时间: 2025-01-07 21:30:24

Unity3D之迷宫寻路使用_直接寻路的相关文章

PHP树生成迷宫及A*自己主动寻路算法

PHP树生成迷宫及A*自己主动寻路算法 迷宫算法是採用树的深度遍历原理.这样生成的迷宫相当的细,并且死胡同数量相对较少! 随意两点之间都存在唯一的一条通路. 至于A*寻路算法是最大众化的一全自己主动寻路算法 完整代码已上传,http://download.csdn.net/detail/hello_katty/8885779 ,此处做些简单解释,还须要大家自己思考动手.废话不多说,贴上带代码 迷宫生成类: /** 生成迷宫类 * @date 2015-07-10 * @edit http://w

Unity3D之迷宫寻路_A*最短路径寻路

A*寻路相信很多人都听说过,也是比较基本的一种算法,具体概念我就不多说了,网上查找一下一大堆,我直接贴上我的A*应用方法,以下是地图: 接下来是地图数组: using UnityEngine; using System.Collections; public static class MapsArray { public static int[,] MazeItem = new int[15, 10] //初始化迷宫 { {1,1,1,1,1,1,1,1,1,1}, {1,0,1,1,1,0,0

NAV导航网格寻路(6) -- 寻路实现

这篇是转的文章,原文http://blianchen.blog.163.com/blog/static/13105629920103911258517/ 前面已经介绍了寻路的方法,现在给出我的一个实现. A*寻找网格路径 A*算法就不说了,网上很多,这里只说下三角形网格如何使用A*算法,如下图,绿色直线代表最终路径和方向,路径线进入三角形的边称为穿入边,路径线出去的边称为穿出边.每个三角形的花费(g值)采用穿入边和穿出边的中点的距离(图中红线),至于估价函数(h值)使用该三角形的中心点(3个顶点

NAV导航网格寻路(2) -- 寻路方法

这篇是转的文章,原文http://blianchen.blog.163.com/blog/static/1310562992010324046930/ nav寻路一般包含两部分,首先是使用工具根据地图信息生成寻路用的nav mesh,接下来就是在游戏中根据生成的nav mesh来自动寻路. 一般人首先关心的就是寻路方法,所以这里把顺序颠倒下,先说寻路. 一.  使用A*寻找所经过网格路径 下图为一个已经生成nav网格的地图,深红色区域为不可行走区域,浅红色区域为可以行走的区域. 如下图,现在如果

Unity3D编程学习 小知识_人物移动导航_2018Oct

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.AI; public class PlayerMove : MonoBehaviour { public GameObject myObj; void Start () { } void Update () { if (Input.GetMouseButtonUp (0)) { Ray myRay = Came

Unity3D编程学习 小知识_扇形攻击_2018Oct

当需要判断一物体是否位于当前物体前方扇形范围内时  运用距离差和角度差实现判断 //扇形攻击 实现类型_1 public bool UmbrellaAttact( Transform attacker ,Transform attacked ,float angle, float radius) { Vector3 deltaA = attacked.position - attacker.position; float tmpAngle = Mathf.Acos(Vector3.Dot(del

Unity3d 寻路功能 介绍及项目演示

Unity3d中的寻路,可以使用AStarPath 寻路插件.现在也可以使用Unity自带的 Navigation 功能来做. 来做一个例子: 上面的图片中,Cube 是阻碍物体,球 是代表玩家,要寻路. 设置Cube为不可通过物体 首先我们点击Window - Navigation 窗口,然后选中4个Cube,按照下图设置这4个Cube为不可通过,然后烘培 设置地面为可通过,然后烘培 我们给圆球也就是我们的主角加上控制脚本 using UnityEngine; using System.Col

Unity专题_简单的寻路导航

Unity专题_导航寻路 前言:导航寻路(NavMesh)技术是一种系统内置的强大寻路算法系统,可以方便.快捷的开发出各种复杂应用,被大量应用于各种RPG.设计.动作.冒险等游戏中. 一.基本的导航寻路                                                                                                                                           我们会在本章模拟游戏

A*算法、导航网格、路径点寻路对比(A-Star VS NavMesh VS WayPoint)

在Unity3d中,我们一般常用的寻路算法: 1.A*算法插件 与贪婪算法不一样,贪婪算法适合动态规划,寻找局部最优解,不保证最优解.A*是静态网格中求解最短路最有效的方法.也是耗时的算法,不宜寻路频繁的场合.一般来说适合需求精确的场合. 与启发式的搜索一样,能够根据改变网格密度.网格耗散来进行调整精确度. 使用较好的地方: a.策略游戏的策略搜索 b.方块格子游戏中的格子寻路 2.U3D自带的导航网格系统 U3D内置了NavMesh导航网格系统,一般来说导航网格算法大多是"拐角点算法"