大家好。欢迎大家关注由我为大家带来的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. 第十五章 深入分析iBatis框架之系统架构与映射原理(待续)

    iBatis框架主要的类层次结构 iBatis框架的设计策略 iBatis框架的运行原理 iBatis框架对SQL语句的解析 数据库字段映射到Java对象 示例运行的结果 设计模式解析之简单工厂模式 ...

  2. php中的foreach改变数组的值的问题

    翻到PHP文档的foreach那页这样写道: “foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误 ...

  3. 具有避障和寻线功能的Arduino小车

    标签:  Arduino  乐高  机器人 创客对于成年人来说,多半是科技娱乐,或者是一种是一种向往科技的人生态度,总是希望自己不仅可以看到或者听到科技的资讯,还希望能够亲身制作科技玩意,从而更好地体 ...

  4. 解决springMVC文件上传报错: The current request is not a multipart request

    转自:https://blog.csdn.net/HaHa_Sir/article/details/79131607 解决springMVC文件上传报错: The current request is ...

  5. Delphi Cookie

    Cookie IdHTTP1.CookieManager.AddCookies(); IdHTTP1.Post(); IdHTTP1.Get('http://1.1.1.1:9000/'); for ...

  6. DevTools in Spring Boot 1.3

    Spring Boot 1.3 will ship with a brand new module called spring-boot-devtools. The aim of this modul ...

  7. php返回文件路径

    1 basename — 返回路径中的文件名部分 如果文件名为test.php,路径为www/hj/test.php echo basename($_SERVER['PHP_SELF']); 输出为: ...

  8. 如何将.jpg图片 转换成.eps 格式图片

    在使用latex写作论文的时候,需要插入一些图片,但是往往有些图片不是eps格式的.虽然网上有如何插入jpg格式的图片方法,但是经过我实验后发现都不太管用.最后找到一个比较靠谱的方法,使用latx本身 ...

  9. C语言中的static的作用?

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)第一个作用:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话 ...

  10. 100085G GCD Guessing Game

    传送门 题目大意 给定一个数N,现在又一个数x,在1~N之间,现在每次可以猜一个数a,返回gcd(x,a),问说最少猜几次可以确定x. 分析 这个题应该可以算是贪心,但是没人知道这样为啥是对的(雾), ...