游戏开发之什么怪物AI都包含ai的单词那些

程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之游戏开发中的人工智能AI(三十八)
Unity3D研究院之游戏开发中的人工智能AI(三十八)
围观37539次
编辑日期: 字体:
很久没有写Unity3D相关的东西了,是因为这段时间我深陷一款IOS的软件开发中。不过以后我还是会回归Unity3D游戏开发的。什么语言都在用,生活与工作都挺给力的嚯嚯。今天还是打开了久违的Unity3D编辑器,那我就写点东西吧,今天我想说的是游戏中的人工智能。人工智能这个东西在游戏中是非常重要的,人工智能说简单了就是根据随机的数字让敌人执行一些动作或逻辑,说难了TA需要一个非常复杂的算法,本文我主要说说Unity3D中人工智能的脚本如何来编写。
首先你应该搞清楚的一点AI脚本属于一个工具类脚本,工具类脚本的含义就是他应当是由策划人员来绑定游戏对象使用的。也就是说AI脚本程序员应当写的非常的灵活,策划人员可以通过修改脚本对外的变量数值接口就能控制其中的敌人AI。接着创建一个c#脚本AI.CS ,如下图所示,目前脚本对外留出枚举接口变量,策划人员在使用这条脚本时选择对应敌人类型即可。(注:这里仅仅是示例,细致的话还可以将很多敌人详细的信息写入,如:攻击速度、技能类型、移动速度、命中率、攻击百分比、等等,但是一定要让你的脚本写的比较灵活,策划人员在外面选择即可完成)因为目前是一个示例,所以我在这里只简单的区分的敌人类型。
下面时这段简单AI的脚本
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
using UnityEngine;using System.Collections;&//这里是枚举选择敌人类型public enum EnemyType{ Enemy0, Enemy1}&public class AI : MonoBehaviour {& //敌人类型枚举 有策划人员选择 public EnemyType enemyType = EnemyType.Enemy0;& //主角游戏对象 public GameObject player;& //敌人状态 普通状态 旋转状态 奔跑状态 追击主角状态 攻击主角状态 private const int EMEMY_NORMAL=0; private const int EMEMY_ROTATION=1; private const int EMEMY_RUN = 2; private const int EMEMY_CHASE = 3; private const int EMEMY_ATTACK = 4;& //记录当前敌人状态 根据不同类型 敌人播放不同动画 private int state; //旋转状态,敌人自身旋转 private int rotation_state; //记录敌人上一次思考时间 private float aiThankLastTime; & void Start () {
//初始话标志敌人状态 以及动画为循环播放
state = EMEMY_NORMAL;
this.animation.wrapMode = WrapMode.Loop; }& void Update () {
//根据策划选择的敌人类型 这里面会进行不同的敌人AI
switch(enemyType)
case EnemyType.Enemy0:
updateEnemyType0();
case EnemyType.Enemy1:
updateEnemyType1();
} }& //更新第一种敌人的AI void updateEnemyType0() {
//这个AI比较简单, 当主角与他的距离小于10米时,他将始终朝向这主角
if(Vector3.Distance(player.transform.position,this.transform.position) &= 10)
this.transform.LookAt(player.transform);
} }& //更新第二种敌人的AI void updateEnemyType1() {&
//判断敌人是否开始思考
if(isAIthank())
//敌人开始思考
AIthankEnemyState(3);
//更新敌人状态
UpdateEmenyState();
} }& int getRandom(int count) {&
return new System.Random().Next(count);& }& bool isAIthank() {
//这里表示敌人每3秒进行一次思考
if(Time.time - aiThankLastTime &=3.0f)
aiThankLastTime = Time.time;
return true;&
return false; }& //敌人在这里进行思考 void AIthankEnemyState(int count) {
//开始随机数字。
int d = getRandom(count);&
//设置敌人为站立状态
setEmemyState(EMEMY_NORMAL);
//设置敌人为旋转状态
setEmemyState(EMEMY_ROTATION);
//设置敌人为奔跑状态
setEmemyState(EMEMY_RUN);
}& }& void setEmemyState(int newState) {
if(state == newState)
state = newState;&
string animName = "Idle";
switch(state)
case EMEMY_NORMAL:
animName&&=&&"Idle";
case EMEMY_RUN:
animName&&=&&"Run";
case EMEMY_ROTATION:
animName&&=&&"Run";
//当敌人为旋转时, 开始随机旋转的角度系数
rotation_state = getRandom(4);
case EMEMY_CHASE:
animName&&=&&"Run";
//当敌人进入追击状态时,将面朝主角方向奔跑
this.transform.LookAt(player.transform);
case EMEMY_ATTACK:
animName&&=&&"Attack";
//当敌人进入攻击状态时,继续朝向主角开始攻击砍人动画
this.transform.LookAt(player.transform);
//避免重复播放动画,这里进行判断
if(!this.animation.IsPlaying(animName))
//播放动画
this.animation.Play(animName);
}& }& //在这里更新敌人状态 void UpdateEmenyState() {
//判断敌人与主角之间的距离
float distance = Vector3.Distance(player.transform.position,this.transform.position);
//当敌人与主角的距离小于10 敌人将开始面朝主角追击
if(distance &= 10)
//当敌人与主角的距离小与3 敌人将开始面朝主角攻击
if(distance &= 3)
setEmemyState(EMEMY_ATTACK);
&&&&//否则敌人将开始面朝主角追击
setEmemyState(EMEMY_CHASE);
//敌人攻击主角时 主角迅速奔跑 当它们之间的距离再次大于10的时候 敌人将再次进入正常状态 开始思考
if(state == EMEMY_CHASE || state == EMEMY_ATTACK)
setEmemyState(EMEMY_NORMAL);
switch(state)
case EMEMY_ROTATION:
//旋转状态时 敌人开始旋转, 旋转时间为1秒 这样更加具有惯性
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler(0,rotation_state * 90,0),&&Time.deltaTime * 1);
case EMEMY_RUN:
//奔跑状态,敌人向前奔跑
transform.Translate(Vector3.forward *0.02f);
case EMEMY_CHASE:
//追击状态 敌人向前开始追击
transform.Translate(Vector3.forward *0.02f);
case EMEMY_ATTACK:&
如下图所示,我们在游戏世界中添加两个敌人,此时给敌人们都绑定上AI的脚本,编辑器中设置不同的敌人类型,敌人执行各自的生命周期,当你控制主角与接近敌人时,敌人开始追击你并且向你展开攻击。
demo仅仅是一个示例,主要希望大家明白一个道理。在编写Unity游戏脚本时,一定要想想这条脚本和对象的生命周期,切记每一条脚本只管和自己有关的东西,和自己无关的东西一概不要管。不然你会发现你的脚本会越写越乱,下一篇文章我会写点我平时在Unity3D开发中时如何搭建架构的,希望大家多多讨论,互相学习。
下载地址:
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!Unity3D游戏开发之怪物AI - 推酷
Unity3D游戏开发之怪物AI
& & & & 在上一篇文章中,我们基本上实现了一个小地图的功能,今天呢,我们来实现怪物AI,所谓怪物AI就是指我们为怪物编写一定的算法,使其可以具备一定程度的智能化,以增强游戏的可玩性。在一般的RPG游戏中,怪物通常在一个游戏设定的范围内巡逻,当玩家进入怪物的警戒范围时,怪物就会由巡逻状态转变为攻击状态,向玩家进行攻击,那么,我们今天就来实现一个简单的怪物AI吧,下面我们一起来看代码:
using UnityE
using System.C
public class AI : MonoBehaviour {
//定义怪物的四种状态:站立、行走、奔跑、无所事事
public const int STATE_STAND=0;
public const int STATE_WALK=1;
public const int STATE_RUN=2;
//怪物当前状态
private int NowS
//游戏角色
public GameObject H
//怪物思考时间
public const int AI_THINK_TIME=2;
//触发怪物攻击的临界距离
public const int AI_ATTACT_DISTANCE=10;
//上一次思考的时间
private float LastThinkT
void Start ()
void Update ()
//当敌人与怪物间的距离小于攻击范围半径的时候
if(Vector3.Distance(transform.position,Hero.transform.position)&AI_ATTACT_DISTANCE)
//敌人开始奔跑
this.GetComponent&Animation&().Play(&run&);
//敌人进入奔跑状态
NowState=STATE_RUN;
//使敌人面向角色
transform.LookAt(Hero.transform);
//向玩家靠近
transform.Translate(Vector3.forward*Time.deltaTime * 5);
//当当前时间与上一次思考时间的差值大于怪物的思考时间时怪物开始思考
if(Time.time-LastThinkTime&AI_THINK_TIME)
//开始思考
LastThinkTime=Time.
//获取0-3之间的随机数字
int Rnd=Random.Range(0,2);
//根据随机数值为怪物赋予不同的状态行为
switch(Rnd)
//站立状态
this.GetComponent&Animation&().Play(&idle&);
NowState=STATE_STAND;
//行走状态
//使怪物旋转以完成行走动作
Quaternion mRotation=Quaternion.Euler(0,Random.Range(1,5)*90,0);
transform.rotation=Quaternion.Slerp(transform.rotation,mRotation,Time.deltaTime*1000);
//播放动画
this.GetComponent&Animation&().Play(&walk&);
//改变位置
transform.Translate(Vector3.forward*Time.deltaTime * 3);
NowState=STATE_WALK;
//奔跑状态
this.GetComponent&Animation&().Play(&run&);
transform.Translate(Vector3.forward*Time.deltaTime * 5);
NowState=STATE_RUN;
} & & & & & 在上面的代码中,能够触发怪物状态发生变化的有两个条件,第一,是玩家进入了怪物的警范围,此时怪物将面向玩家奔跑靠近;第二,当前时间与怪物上一次思考的时间之差大于怪物的思考时间,此时,怪物将随机作出反应。
& & & & & 好,下面我们回到游戏界面当中来。
& & & & 如图,博主事先从官方资源商店里下载了一个人物模型。在这个模型中,设计者已经为我们设计好了人物动画,我们将这个模型拖放到场景中,调整到合适的位置,并将人物默认动画设置为idle,下面我们将刚才写好的脚本拖放到此模型上,并设置Hero为我们的玩家对象,在这里我们使用了官方提供的第三人称角色控制器组件,最终实现的效果如下 :
& & & &可以看到,在不同的时刻,怪物可以自己执行不同的状态动作,当玩家靠近怪物的时候,会被敌人追击,这就是今天的内容啦,谢谢大家!
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 ai插图包含非法操作 的文章

 

随机推荐