大家好。欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。

       在上一篇文章中,我们基本上实现了一个小地图的功能,今天呢,我们来实现怪物AI,所谓怪物AI就是指我们为怪物编写一定的算法。使其能够具备一定程度的智能化,以增强游戏的可玩性。在一般的RPG游戏中,怪物通常在一个游戏设定的范围内巡逻。当玩家进入怪物的警戒范围时,怪物就会由巡逻状态转变为攻击状态,向玩家进行攻击,那么,我们今天就来实现一个简单的怪物AI吧,以下我们一起来看代码:

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class AI : MonoBehaviour {  
  5.   
  6.     //定义怪物的四种状态:站立、行走、奔跑、无所事事  
  7.     public const int STATE_STAND=0;  
  8.     public const int STATE_WALK=1;  
  9.     public const int STATE_RUN=2;  
  10.       
  11.     //怪物当前状态  
  12.     private int NowState;  
  13.     //游戏角色  
  14.     public GameObject Hero;  
  15.     //怪物思考时间  
  16.     public const int AI_THINK_TIME=2;  
  17.     //触发怪物攻击的临界距离  
  18.     public const int AI_ATTACT_DISTANCE=10;  
  19.       
  20.     //上一次思考的时间  
  21.     private float LastThinkTime;  
  22.       
  23.     void Start ()   
  24.     {  
  25.           
  26.     }  
  27.       
  28.     void Update ()   
  29.     {  
  30.        //当敌人与怪物间的距离小于攻击范围半径的时候  
  31.        if(Vector3.Distance(transform.position,Hero.transform.position)<AI_ATTACT_DISTANCE)  
  32.        {  
  33.           //敌人開始奔跑  
  34.           this.GetComponent<Animation>().Play("run");  
  35.           //敌人进入奔跑状态  
  36.           NowState=STATE_RUN;  
  37.           //使敌人面向角色  
  38.           transform.LookAt(Hero.transform);  
  39.           //向玩家靠近  
  40.           transform.Translate(Vector3.forward*Time.deltaTime * 5);  
  41.        }else  
  42.        {  
  43.           //当当前时间与上一次思考时间的差值大于怪物的思考时间时怪物開始思考  
  44.           if(Time.time-LastThinkTime>AI_THINK_TIME)  
  45.           {  
  46.              //開始思考  
  47.              LastThinkTime=Time.time;  
  48.              //获取0-3之间的随机数字  
  49.              int Rnd=Random.Range(0,2);        
  50.              //依据随机数值为怪物赋予不同的状态行为  
  51.              switch(Rnd)  
  52.              {  
  53.                 case 0:  
  54.                 //站立状态  
  55.                 this.GetComponent<Animation>().Play("idle");  
  56.                 NowState=STATE_STAND;  
  57.                 break;  
  58.                   
  59.                 case 1:  
  60.                 //行走状态  
  61.                 //使怪物旋转以完毕行走动作  
  62.                 Quaternion mRotation=Quaternion.Euler(0,Random.Range(1,5)*90,0);  
  63.                 transform.rotation=Quaternion.Slerp(transform.rotation,mRotation,Time.deltaTime*1000);  
  64.                 //播放动画  
  65.                 this.GetComponent<Animation>().Play("walk");  
  66.                 //改变位置  
  67.                 transform.Translate(Vector3.forward*Time.deltaTime * 3);  
  68.                 NowState=STATE_WALK;  
  69.                 break;  
  70.                  
  71.                 case 2:  
  72.                 //奔跑状态  
  73.                 this.GetComponent<Animation>().Play("run");  
  74.                 transform.Translate(Vector3.forward*Time.deltaTime * 5);  
  75.                 NowState=STATE_RUN;  
  76.                 break;  
  77.              }   
  78.           }  
  79.        }  
  80.     }  
  81. }  

          在上面的代码中,能够触发怪物状态发生变化的有两个条件,第一,是玩家进入了怪物的警范围。此时怪物将面向玩家奔跑靠近;第二,当前时间与怪物上一次思考的时间之差大于怪物的思考时间,此时,怪物将随机作出反应。

          好。以下我们回到游戏界面其中来。

        如图,博主事先从官方资源商店里下载了一个人物模型。在这个模型中,设计者已经为我们设计好了人物动画,我们将这个模型拖放到场景中,调整到合适的位置。并将人物默认动画设置为idle。以下我们将刚才写好的脚本拖放到此模型上,并设置Hero为我们的玩家对象,在这里我们使用了官方提供的第三人称角色控制器组件,终于实现的效果例如以下 :

       能够看到,在不同的时刻。怪物能够自己运行不同的状态动作,当玩家靠近怪物的时候。会被敌人追击,这就是今天的内容啦,谢谢大家!

转载:原文出处

[Unity3D]Unity3D游戏开发之怪物AI的更多相关文章

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

    关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于U ...

  2. 《Unity3D/2D游戏开发从0到1(第二版本)》 书稿完结总结

    前几天,个人著作<Unity3D/2D游戏开发从0到1(第二版)>经过七八个月的技术准备以及近3个月的日夜编写,在十一长假后终于完稿.今天抽出一点时间来,给广大热心小伙伴们汇报一下书籍概况 ...

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

    <Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息:      书籍的名称: <Uni ...

  4. Unity3D 入门 游戏开发 Unity3D portal game development

    Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...

  5. Unity3D手机游戏开发

    <Unity3D手机游戏开发> 基本信息 作者: 金玺曾 出版社:清华大学出版社 ISBN:9787302325550 上架时间:2013-8-7 出版日期:2013 年8月 开本:16开 ...

  6. Unity3D独立游戏开发日记(二):摆放建筑物

    在沙盒游戏里,能自由建造是很重要的特点,比如说风靡全球的<我的世界>,用一个个方块就能搭建出规模宏大的世界.甚至有偏激的人说,没有自由建造,就不是一个真正的沙盒游戏.的确,沙盒游戏的魅力有 ...

  7. Unity3D独立游戏开发日记(一):动态生成树木

    目前写的独立游戏是一个沙盒类型的游戏.游戏DEMO视频如下: 提到沙盒类型的游戏,就有人给出了这样的定义: 游戏世界离现实世界越近,自由度.随机度越高才叫沙盒游戏.所谓自由度,就是你在游戏里想干啥就干 ...

  8. 简单3d RPG游戏 之 003 怪物AI

    游戏中,怪物会自动的往玩家所在地点走去,那需要创建一个C#脚本EnemyAI,包含两个功能: 1. 怪物旋转自己对准玩家 2. 怪物向前移动,追逐玩家 public class EnemyAI : M ...

  9. Unity3D小游戏开发之两个我踩过的坑

    最近在开发一个植物大战僵尸小游戏,今天写了一早上的代码,踩了两个坑,这两个坑的位置分别位于触发器和数据转换,写这篇博文以此来让其他程序员不要再去踩这两个坑. 1.我在做简易僵尸模型的时候,这个僵尸模型 ...

随机推荐

  1. python ConfigParser 读取配置文件

  2. 初识python notes

    python数据类型 数字 字符串 列表 元祖 字典 1.为什么要编程 编程的目的是解放人力,这就需要人通过编写程序的方式计算机代替人去自动干活 2.什么是编程语言 编程语言就是人与计算机之间沟通的介 ...

  3. 11-09SQLserver 基础-数据库之汇总练习45题

    设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表 ...

  4. 部署和调优 1.8 samba 部署和优化-2

    Samba 可以实现 Linux 和 Windows 机器相互共享文件,这对我们来说是非常实用的.下面做几个实践,来了解samba,注意:在实践之前,请先检测 Selinux 是否关闭,否则可能会实践 ...

  5. Error: Cannot run program "/home/xxx/android_developer_tools/android-ndk-r8/ndk-build.cmd": Unknown reason

    运行OpenCV官方例子  tutorial-2-mixedprocessing 总提示  /home/xxx/android_developer_tools/ 明明在PATH中采用好几种方法都加入了 ...

  6. 探索Web Office Apps服务

    老样子,先放几个官链: WOA部署规划:http://technet.microsoft.com/zh-cn/library/jj219435(v=office.15).aspx 拓扑规划:http: ...

  7. C语言基础问题总结

    Double 类型用 %f 接受会产生错误,应该用%lf C语言中SIN,COS的参数为弧度,角度应先转换为弧度才能计算,否则出错 三角形的判断条件,任意两边长度和大于第三边 闰年判断条件整百年为40 ...

  8. 使用Eclipse的常见问题整理

    我在Eclipse里新建一个android工程的时候附带着产生了一个名字为appcompat_v7的工程,这个工程是干什么用的啊?为何我新建的工程都出错了,错误信息提示为: error: Error ...

  9. js面试题知识点全解(一闭包)

    闭包使用场景:1.函数作为返回值,如下场景 function F1(){ var a = 100 //自由变量 //返回一个函数(函数作为返回值) return function(){ console ...

  10. 【总结整理】JS的继承

    参考阮一峰的文章:http://javascript.ruanyifeng.com/oop/inheritance.html#toc4 function Shape() { this.x = 0; t ...