zoukankan      html  css  js  c++  java
  • [Unity3D]Unity3D游戏开发之怪物AI

    大家好。欢迎大家关注由我为大家带来的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为我们的玩家对象,在这里我们使用了官方提供的第三人称角色控制器组件,终于实现的效果例如以下 :



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



    转载:原文出处

  • 相关阅读:
    看《长安十二时辰》可以了解哪些算法知识
    面试官,我会写二分查找法!对,没有 bug 的那种!
    毕业十年后,我忍不住出了一份程序员的高考试卷
    扫雷与算法:如何随机化的布雷(一)
    降维打击!为什么我认为数据结构与算法对前端开发很重要
    盖尔-沙普利算法告诉你,你的对象在哪里?
    这道算法题太太太太太简单啦
    有点难度,几道和「滑动窗口」有关的算法面试题
    几道和「黑洞照片」那种海量数据有关的算法问题
    LeetCode 上最难的链表算法题,没有之一!
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10800022.html
Copyright © 2011-2022 走看看