`

Unity3D之AStarPathFinding插件的使用

 
阅读更多

声明: 本博客文章原创类别的均为个人原创,版权所有。转载请注明出处:http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com


对于AStarPathFinding,很多人应该不会陌生。这个算是Unity3D里最好用的寻径插件了。不论是3D游戏,还是2D游戏,我们都可以使用它来进行A*算法的寻径。之前翻译的“使用免费工具进行2D游戏开发”的教程中本来应该有一节是AStarPathFinding寻径的,但是在这个教程翻译了三节之后,发现后面其实作者只是单纯把脚本什么的都给出下载地址,并未做介绍,而对Orthello的介绍在前面几节就结束了,所以就没有继续翻译。这里另外开一篇文章来单独介绍寻径。


下面我们来看看,应该如何使用AStarPathFinding


首先制作一个游戏场景。

大家可以看到,这个是使用了一个Terrain,然后放置了几个房子和灯光以及树木等。

我们创建一个空的Object,然后通过Component->Pathfinding->PathFinder添加脚本。这个是AStarPathFinder里最重要的脚本。将它改名为AStar。



我们可以从右边看到有很多的栏目。

其实寻径的原理,还是以网格的形式分布到地面,排除掉一些障碍物的相应的层,亦或者进行高度测试使得一定的高度不可行走。然后使用AStar寻径算法来寻找最短的路径。

首先创建一个Grid Graph


然后在这边调整网格的数目和大小。

对于我们的3D游戏而言,网格的大小可以就设置为1( 2d游戏通常根据地图单元格大小来设置)。然后设置WidthDepth调整整个网格的大小。记住高度一定要与地形高度相同。

最后点最下面的Scan。会搜索出所有可行走的路径,然后以某种颜色的形式显示在网格上。


这里有几个很重要的参数。

首先是Max ClimbClimb Axis。这个是指的最大攀爬的高度以及攀爬的轴的方向。通常而言,这个轴一定要与地形垂直,不然地面所有地方将无法通过。


然后是Collision Test。这里是在寻径中对碰撞的一些检测。

例如上图,我们对Default层进行了碰撞的检测,那么在寻径的时候,路径将不会通过这个帐篷的周边。



我们看看内部,内部出了中间放置了一盘食物的位置为寻径无法通过的,其他地方都是可以通过的。



当我们把Collision Test取消选中,然后重新Scan,那么在寻径中,整个帐篷的范围将都列入可行走的范围。


这里要记住寻径上网格的可移动的范围,并不代表你的角色可以从这些范围行走。它只代表的,寻径算法将把这些范围列入为可通过的。然后,如果你的角色跟帐篷有碰撞,那么即使AStar计算出的路径要穿做帐篷,你的角色也是无法做到的。


当AStar的PathFinder找到路径是,会在Scene中显示一条绿线。

这条绿线就是寻找到的路径。



同样的,通过限制图层碰撞等,我们也可以在2D游戏中使用AStarPathFinding。如上图,虽然绿线不是很清晰,但我们依然可以看到怪物走到我们角色的路径。


下面我们来看一下,找到路径之后,怎么对路径进行处理。这里是上面2D游戏里的一些简单脚本。


	public void Start ()
	{
		controller = GetComponent<Controller> ();
		seeker = GetComponent<Seeker> ();
		seeker.pathCallback += searchComplete;
		
		StartCoroutine(RepeatTrySearch());
	}
	
	
	IEnumerator RepeatTrySearch(){
		while(true){
		  TrySearchPath();
		  yield return new WaitForSeconds(searchRate);
		}
	}
	
	IEnumerator WaitForRepath(){
		if (waitingForRepath) yield break;
		 waitingForRepath = true;
	     yield return new WaitForSeconds(searchRate - (Time.time-lastRepath));
		 waitingForRepath = false;
		 TrySearchPath();
	}
	
	public void TrySearchPath(){
		if(Time.time - lastRepath >= searchRate && isCanSearch && isCanSearchAgain){
			lastRepath = Time.time;
		  	seeker.StartPath (transform.position, target.position);	
			isCanSearchAgain = false;
		}else {
		    StartCoroutine(WaitForRepath());	
		}
	}
	
	
	
	public void searchComplete (Path p)
	{
		path = p;
		nowPosition = 0;
		if (path != null) {
			vPath = path.vectorPath;	
			nextNode = vPath [nowPosition];
			Debug.Log ("Find Path:" + vPath.Count + "," + vPath [0]);
		} else {
			Debug.Log ("Find No Path");	
		}
		isCanSearchAgain = true;
		isMoveFinished = false;
	}

这是一个重复搜索路径的代码。由于我们的角色在不停的移动,所以怪物需要在一定时间内,改变搜索目标地点,进行二次寻径。

寻径完成后,我们可以通过path.vectorPath得到一个path数组,里面是一个List<Vector3>类型的链表。记载着路径中的每一个点的坐标。我们可以进行逐个点的移动和处理。

这就是一个简单的AStar寻径的过程了。


转载请注明出处:http://blog.csdn.net/ml3947


分享到:
评论

相关推荐

    UNITY3D编辑器插件编写教程

    * 编辑器插件可以访问UNITY3D编辑器的GUI系统,并可以使用UNITY3D的内置控件来构建自定义的编辑器界面。 UNITY3D编辑器插件编写的步骤: 1. 使用[MenuItem]声明来添加菜单项,并在菜单项被点击时执行对应的函数。 ...

    Unity3d 高亮描边插件

    在使用Unity3d 描边插件时,开发者应该了解如何调整和定制效果,包括但不限于: - 着色器编程:虽然插件提供了现成的解决方案,但理解着色器工作原理可以帮助你更好地优化和扩展效果。 - 层级系统:了解如何在对象...

    unity3d 各种插件

    收集到的unity3d 各种插件 有些使用过 有些没用过 看用的上的就用 部分插件在unity3d2.6中使用过 GUIX 、RiverTool、PublicRoadPathTool、Terrain Toolkit

    Unity3D寻路插件AStarPathfindingProjectPro

    "AStarPathfindingProjectPro"就是针对这一需求设计的专业寻路插件,被誉为Unity3D中最强大的寻路解决方案之一。 A*(读作"A-star")是一种广泛应用的图形搜索算法,用于在图中寻找从起点到目标的最短路径。它结合...

    unity 3D webview插件

    Unity 3D Webview插件是一款专为Unity 3D开发者设计的工具,它允许你在三维游戏场景中集成网页内容,使用户能够在游戏或者应用的特定位置或对象上浏览网页。这种功能对于创建互动式体验、展示多媒体内容、提供在线...

    Unity3d 管道建模插件

    Unity3d可以使用插件在场景中使用各种管道预设进行管道建模。

    unity 3d 真实地形插件

    Unity3d以灵活方便和强大的功能为很多从事虚拟现实和游戏的朋友所青睐,但是对于高速公路、高铁、油田、煤矿、机场、港口、码头、车站、航运、海洋、天然气管道输送、热力管网、南水北调、电力电网、自来水管网、...

    Unity3d语音控制插件- Word Detection

    在给定的“Unity3d语音控制插件- Word Detection”中,我们关注的核心技术是如何利用语音识别来控制游戏中的角色行为。 语音控制是一种通过识别用户的口头指令来操作游戏或应用程序的技术。在Unity3D中实现这一功能...

    Unity3D引擎各大插件免费下载地址1

    在本文中,我们将探讨几个关键的Unity3D插件,这些插件不仅可以增强开发者的生产力,还能提供丰富的功能和效果。 首先,2D Toolkit是针对想要从3D转向2D游戏开发的开发者的一款理想组件。它专为2D游戏设计,提供了...

    Unity3D创建道路插件EasyRoads的使用

    Unity3D创建道路插件EasyRoads的使用

    Unity3D动画存储插件1

    Unity3D 动画存储插件1 Unity3D 动画存储插件1 是一个功能强大且实用的 Unity3D...Unity3D 动画存储插件1 是一个功能强大且实用的 Unity3D 插件,能够满足不同层次人的需求,并提供了多种免费动作供开发者下载和使用。

    Unity3d插件实现半透明效果

    今天,我们将讨论如何使用 Unity3d 插件实现半透明效果绘制被遮挡部分。 Unity3d 插件实现半透明效果的原理是通过在游戏对象上应用特殊的 shader 实现的。Shader 是一个小程序,它可以在 GPU 上运行,实现图形处理...

    unity3d的各种插件1

    在这个"unity3d的各种插件1"压缩包中,我们可以预见到包含了一系列有助于提升Unity3D开发效率和功能扩展的工具。下面将详细介绍Unity3D插件及其可能包含的知识点。 1. **Unity Asset Store**:Unity官方提供的Asset...

    安卓Arcore Unity3D插件

    ARCore Unity3D插件的使用,首先需要开发者具备Unity3D的基本知识,包括场景构建、对象交互、脚本编写等。这个插件通过Unity的Asset Store提供,通常以`.unitypackage`格式打包,例如文件名`arcore-unity2017-sdk-...

    Unity 3D web插件 3D WebView for Android and iOS Web Browser 4.2.2

    文件列表中的"3D WebView for Android and iOS Web Browser 4.2.2.txt"可能是包含插件的使用指南、API文档或安装步骤的文本文件。而"3D WebView for Android and iOS Web Browser 4.2.2.unitypackage"是Unity的资源...

    Unity3D之进度条插件Loading Component

    ### Unity3D之进度条插件Loading Component 在游戏开发过程中,加载屏幕或者进度条是不可或缺的一部分,它们不仅能够提升玩家的游戏体验,还能为开发者提供一个优雅地处理资源加载问题的方式。今天我们要介绍的是一...

    unity3D 画线插件测试能用包含三个版本

    unity3D 画线插件测试能用包含三个版本unity3D 画线插件测试能用包含三个版本

    Unity3D中用Vectrosity插件画直线、画点、画曲线、画方框2

    Unity3D 中用 Vectrosity 插件画直线、画点、画曲线、画方框 Vectrosity 插件是 Unity3D 目前发现的一个画线最好的工具插件。该插件可以用来画直线、画点、画曲线、画方框等各种图形。 画直线: 在 Vectrosity ...

    Unity3D EZ GUI插件

    Unity3D EZ GUI插件比Unity3D 平台提供的GUI 界面美观,制作起来要快捷简便。

    Unity3d特效 插件 UIEffect

    Unity3d特效 插件 UIEffect unity3d 亲测可用

Global site tag (gtag.js) - Google Analytics