[Unity3D]Unity3D游戏开发之自己主动寻路与Mecanim动画系统的结合

大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei

这段时间博主将大部分的精力都放在了研究官方演示样例项目上,主要是希望能够从中挖掘出有价值的东西分享给大家。这样博主和大家能够共同学习。好了,那么今天博主想和大家分享的是自己主动寻路与Mecanim动画系统结合起来实现的一个小案例,希望对大家学习Unity3D能够有所帮助。

博主以前告诉大家。博主是一个仙剑迷,平时学习编程累了的时候,博主就会玩玩仙剑。如图是博主偶尔回去玩玩的《新仙剑OL》。仙剑的网游化道路似乎一直不曾平坦,从最初的《仙剑OL》到如今的《新仙剑OL》,仙剑的网游化一直处于不温不火的状态。

尽管博主比較反感网游。但是作为一款由博主喜欢的单机游戏改编的网游,博主还是忍不住去尝试了一下。基于Unity3D的《新仙剑OL》尽管从画面质量上与同类网页游戏拉开了距离,然而在游戏的玩法和体验上依旧没有摆脱国产网游的固定模式,博主叹息之余。便依据这款游戏在自己主动寻路上的设计写出了这篇文章。说到自己主动寻路。这差点儿是眼下全部网页游戏的标准配置了。在博主看来。自己主动寻路在简化玩家寻找目标的途径的同一时候。弱化了玩家的參与,使得本该玩家自行探索的游戏世界。变成了枯燥无味的鼠标游戏。曾几何时,我们在迷宫中探索着远方的路,曾几何时,我们开启机关、破解阵法收获着游戏的乐趣。在这样一个快节奏的时代,我们却仅仅能一遍遍地回忆着过去的生活。那个时候没有电脑、没有智能手机、没有电影.....但是我们却经常怀念那个时候简单的生活,所以,小时候,幸福是件简单的事情,长大后,简单是件幸福的事情。尽管博主讨厌自己主动寻路这一设定。但是这与我们学习Unity3D无关。由于我们仅仅是为了更好地使用这个引擎来做出好的游戏产品。好了,闲话少叙,我们继续说《新仙剑OL》中的自己主动寻路,在游戏中玩家能够通过鼠标来控制人物,假设距离较远。则人物会以奔跑的形式到达目标位置,否则人物将步行到目标位置。而这就是我们今天想要实现的效果。好了。以下我们正式開始今天的内容,今天的内容呢,分为两个部分,第一部分讲述Mecanim动画系统,第二部分讲述自己主动寻路。

第一部分:Mecanim动画系统

在这一部分,我们主要讲的是动画的切换,由于从刚才的描写叙述中我们知道,角色的动画有三种状态,即Idle、Walk、Run。

通过前面的学习呢。我们知道通过Mecanim动画系统的状态机我们能够非常方便地实现动画状态的切换。由此我们就能够理出一个大致的思路,通过鼠标点击获取鼠标位置,然后我们利用射线的方法,从摄像机发射一条经过该点的射线,则射线与地面的交点就是我们寻路的目标点,我们通过计算角色与目标点之间的距离来确定角色要採用什么样的动画,而寻路则交给Unity3D的Nav Mesh Agent组件来完毕,这就是我们今天的实现思路,事实上博主在之前的一篇文章中已经讲述过这样的方法,这里只是是在之前的基础上。结合Mecanim动画系统和自己主动寻路组件做了些改进而已。好了。我们打开我们的项目,如图,是博主创建的一个简单的场景,我们今天的内容就以这个场景来展开:

接下来。我们利用Mecanim动画系统来设计角色的动画,如图,在今天的项目中角色仅仅有三种状态,因此我们能够将三种状态连接起来,这里我们定义了两个Bool类型的变量IsWalk和IsRun,默觉得False,这是我们今天用来切换动画的两个变量开关。

剩下的工作就是编写脚本来控制动画了,这一步我们放在第二部分来讲。

第二部分:自己主动寻路

在这一部分。我们首先要对场景进行烘培,由于Nav Mesh Agent组件是依据网格来计算寻路的路线的,所以烘培的过程相当于是在保存场景中的网格信息。仅仅有这样我们才干够使用Unity3D的寻路组件。

以下我们就来解说下场景的烘焙:

首先我们选中场景中不须要与玩家发生交互的物体,或者能够觉得这些物体是我们的角色须要避开的障碍物,将其设置为Static,如图:

接下来我们通过Windowe->Navigation命令打开Navigation窗体,此时被选中的物体以深色显示。确认无误后,点击Bakebutton对场景进行烘焙,这样我们就完毕了场景的烘焙工作。

好了。以下我们选中场景中的角色。为其加入Nav Mesh Agent组件。此时场景中会显示出绿色的区域。其含义是这些区域角色能够到达。关于Nav Mesh Agent组件的參数。大家能够自行查阅API文档,这里不做解释了,好了,以下我们编写脚本:

using UnityEngine;
using System.Collections;

public class PeopleScripts : MonoBehaviour {

	//动画组件
	private Animator mAnim;
	//移动速度
	public float MoveSpeed=2.5F;
	//寻路组件
	private NavMeshAgent mAgent;
	//寻路目标标记
	private GameObject Ball;

	//寻路标记预制件
	public GameObject PrefabBall;

	void Start () {
	  //获取动画组件
	  mAnim=GetComponent<Animator>();
	  //获取寻路组件
	  mAgent=GetComponent<NavMeshAgent>();
	}

	void Update () {
		//按下鼠标左键
		if(Input.GetMouseButton(0))
		{
			//获取鼠标位置
			Vector3 mPos=Input.mousePosition;
			//利用射线法取得目标位置
			Ray mRay=Camera.main.ScreenPointToRay(mPos);
			RaycastHit mHit;
			if(Physics.Raycast(mRay,out mHit))
			{
				//这里相应于场景中的地面、墙体、楼梯三种结构
				if(mHit.collider.tag=="Ground" || mHit.collider.tag=="Wall" || mHit.collider.tag=="Ti")
				{
				   //获得目标位置
				   Vector3 mTarget=mHit.point;
				   //使用全然面向目标的旋转
				   transform.LookAt(mTarget);
				   //使用平滑转身转向目标
				   //SmoothRotate(mTarget);
				   //计算距离
				   float mDistance=Vector3.Distance(mTarget,this.transform.position);
				   //当距离大于4时奔跑到目标位置。否则步行到目标位置
				  if(mDistance>4F){
					  mAnim.SetBool("IsRun",true);
				  }else{
					  mAnim.SetBool("IsWalk",true);
				  }

				  //依据不同的结构生成不同高度的寻路目标标记
				  if(mHit.collider.tag=="Ground"){
				     //标记寻路目标
				     Ball=(GameObject)Instantiate(PrefabBall,new Vector3(mTarget.x,0.5F,mTarget.z),
						  Quaternion.identity);
				  }else{
						//标记寻路目标
						Ball=(GameObject)Instantiate(PrefabBall,new Vector3(mTarget.x,3.0F,mTarget.z),
						     Quaternion.identity);
				  }
				  //设置寻路目标
				  mAgent.SetDestination(mTarget);
				}
			}
		}
	}	

	void OnTriggerEnter(Collider mCollider)
	{
		if(mCollider.tag=="Ball")
		{
			//获取目标标记
			GameObject mBall=mCollider.gameObject;
			//销毁目标标记
			Destroy(mBall);
			//将角色状态设为Idle
			mAnim.SetBool("IsRun",false);
			mAnim.SetBool("IsWalk",false);
		}
	}

	//平滑转身,參考自Stealth
	void SmoothRotate(Vector3 target)
	{
		//构造目标朝向
		Quaternion targetRotation = Quaternion.LookRotation(target, Vector3.up);
		//对目标朝向进行插值
		Quaternion mRotation = Quaternion.Lerp(transform.rotation, targetRotation, 15F * Time.deltaTime);
		//赋值
		transform.rotation=mRotation;
	}
}

最后,我们来看看最后的效果吧。为了让大家更清楚的看到寻路的效果,博主在寻路点处添加了一个紫色的小球,便于大家观察:

每日箴言:别低头,别诉苦。他们以为你无坚不摧,那就随他们喜欢;别人不知道的,你不是必需反驳给他听。

喜欢我的博客请记住我的名字:秦元培,我博客地址是blog.csdn.net/qinyuanpei。
转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/38981669

时间: 2024-12-08 13:36:28

[Unity3D]Unity3D游戏开发之自己主动寻路与Mecanim动画系统的结合的相关文章

Unity3D/2D游戏开发从0到1

这篇是计算机中Oracle类的优质预售推荐>>>><Unity3D/2D游戏开发从0到1> Unity3D/2D游戏开发从0到1(含DVD光盘1张) 采用 "案例化"教学思路, 以个人长期线下培训讲义为蓝本:讲解透彻.循序渐进.突出与优化游戏开发实战技巧:附有全国Unity游戏研发职位笔试面试真题集锦.Unity开发常见错误与分析.游戏开发职位简历模板 编辑推荐 按照"案例化"教学特点,全书贯穿两个重量级游戏的开发全过程讲解,让学

关于《Unity3D/2D游戏开发从0到1》书籍再版说明

关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于Unity4.6版本的教学知识体系,则略显滞后.    随着2017年7月份,Unity2017.1正式版本的推出,<Unity3D/2D游戏开发从0到1>书籍的再版,则正式提上日程. 目前2017年8月份再版工作已经进行过半,现在给各位小伙伴汇报一下工作,希望得到更好的建议.现在说说第二版本的总体

《Unity3D/2D游戏开发从0到1》正式出版发行啦

书籍信息:   书籍的名称: <Unity3D/2D 游戏开发从0到1>   书号(ISBN): 978-7-121-26239-5    出版社: 电子工业出版社   发行时间:2015年7月1日 写作背景:    2015年6月30日我收到电子工业出版社张迪老师寄来,正式发行的<Unity3D/2D游戏开发从0到1>书籍.这本凝结着大半年心血的作品让我感慨万千.   本人从事游戏.软件与教学十多年,一直梦想可以进一步服务于全国广大的游戏与软件从业开发人员.14年下半年电子工业出

Unity3D 入门 游戏开发 Unity3D portal game development

Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:[email protected] E-mail: 313134555 @qq.com 视频学习链接:Video learning link: [教学视频]深入浅出Unity3D--第一篇-何韬-CSDN学院-在线学习教程 u3d 4.6 c#  性能上 比 java脚本 好一些 C # is better than a Java

《Unity3D/2D游戏开发从0到1》正式出版发行

去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息: 书籍的名称: <Unity3D/2D 游戏开发从0到1> 书号(ISBN): 978-7-121-26239-5 出版社: 电子工业出版社 发行时间:2015年7月1日 写作背景: 2015年6月30日我收到电子工业出版社张迪老师寄来,正式发行的<Unity3D/2D游戏开发从0到1>书籍.这本凝结着大半年心血的作品让我感慨万千. 本人从事游戏.软件与教学十多年,一直梦想可以进一步服务于

Unity3D ARPG游戏开发《最初的幻想》之第一张地图与跳跃的改善详解

前面我们终于实现了人物动画.相机控制及昼夜系统,现在继续吧,为了方便继续编写的敌人之类的脚本,所以打算今天先把第一张地图画个大概.结果,画了我好久的地图….. ≡(▔﹏▔)≡ 我对美术方面的天赋简直是惨不忍睹了…..加之地图中途画的差不多的时候Unity又崩溃了一次….忘了保存(ㄒoㄒ).于是又忙活半天….这个地图完全靠临时发挥了,第一张地图我画了好几次了,基本上每次画出来的地形之类的都完全不一样,所以就不多解释了,就上一张大概的场景图吧: 看起来好简单吧?唉……开启编辑器,这时侯如果在场景中转

Unity3D ARPG游戏开发《最初的幻想》之强化敌人AI,折腾的GUI

 昨天搞了死亡的完善与提示栏的工作.今天的话,首先再升级一下敌人的Ai吧.毕竟在玩家在敌人身后使劲攻击的话,这敌人也都不会有反应的,太不合理了. 打开Enemy脚本,在最前面"变量"标签中,先定义一个计数器,因为必须考虑到被同类"误伤"的情况: private int m_attackMeCount=0;//被一个同类对象攻击的次数 然后再在最下面的WaitForAttack函数中将自己的对象传入自己的攻击对象,以作判断: m_damageTarget.m_ch

Unity3D ARPG游戏开发《最初的幻想》之GUI背包系统实现

昨天做了角色暴击…GUI浮动提示栏.现在的话,终于该继续前天被残忍打断的物品栏之类的GUI界面了! 首先还是把“属性”.“物品”.“技能”.“系统设置”几个按钮放上去罢. 我是这样设计的: 美工方面确实不是俺的长处,资源也都是用的DaikonGUI自带的. 新建一个Panel,用于盛放这几个按钮,Anchor设置为Right和Bottom即可. 然后再将这个Panel命名为“MyBottomBar”,在这个Panel中新建四个按钮,放上相应的图标即可.如果为了好看点,还可以设置Havor状态的显

Unity3D游戏开发之Unity3D动画与Mecanim动画系统

Unity3D游戏开发之Unity3D动画与Mecanim动画系统 欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. Mecanim是Unity新增的动画系统,其功能强大而灵活,让人类和非人类角色栩栩如生.Mecanim的重定向极大的提供了工作效率,而且占用极少CPU周期.使用从Unity资源商店找到的动画资源,或