Unity 怪物AI

using UnityEngine; using System.Collections;

public class moster_AI : MonoBehaviour {

public const int AI_Null = 10;     public const int AI_Idle = 0;     public const int AI_Patrol =1;     public const int AI_Pursuit =2;     public const int AI_Attack = 3;     public const int AI_Attack_Idle = 4;    public const int AIA_BackPoint = 5;

public const int Dead = 6;

public const float followUpDistance = 3.0f;    public const float attackDistance = 2.0f;    public const float vAttackDeltaTime = 1.0f;    public const float maxFollow = 20.0f;

public const float speed = 2.0f;   public const float runSpeed = 3.0f;     public const float vEscapeSpeed = 6.0f;   public Rect vRect = new Rect(0,0,10,10);   public Vector2 Dis;    public Vector2 srcPoint;  //出生坐标    public GameObject player;     public int vStartState;    public int vLostState;

// Use this for initialization    void Start () {         vStartState = AI_Idle;       vLostState = AI_Null;        srcPoint = new Vector2(transform.position.x,transform.position.z);        player = GameObject.Find("Fighter");       }                 // Update is called once per frame

bool Living;  void Update () {         switch (vStartState)        {      case AI_Idle:                if (vStartState != vLostState)        {                       animation.CrossFade("Idel");        vLostState = vStartState;           Debug.Log("1");                }    fGetPatrolPosition();              vStartState = AI_Patrol;            break;            case AI_Patrol:             if (vStartState != vLostState)       {                      animation.CrossFade("Run");         vLostState = vStartState;                 Debug.Log("2");                }       fPatrovRect();                if(Vector2.Distance(Dis,new Vector2(transform.position.x,transform.position.z))<0.4f)     {                       //Debug.Log("没进来?");                     vStartState = AI_Idle;                 }          if (Vector3.Distance(transform.position, player.transform.position) < followUpDistance)    {                   vStartState = AI_Pursuit;       }                              break;             case AI_Pursuit:        if (vStartState != vLostState)      {                      animation.CrossFade("Attack02");         vLostState = vStartState;           Debug.Log("3");               }    fPursuitHero();               if (Vector3.Distance(new Vector3(srcPoint.x, transform.position.y, srcPoint.y), transform.position) > maxFollow && Vector3.Distance(transform.position, player.transform.position) > followUpDistance)               {               vStartState = AIA_BackPoint;        }                 if (Vector3.Distance(transform.position, player.transform.position) < attackDistance)           {                    vStartState = AI_Attack;      }              break;            case AI_Attack:          if (vStartState != vLostState)       {                    vLostState = vStartState;       Debug.Log("4");                }                  fAttackHero();               if (Time.time - backUptime >= 0.2f)     {                       backUptime = Time.time;       vStartState = AI_Attack_Idle;       }               break;          case AI_Attack_Idle:       if (vStartState != vLostState)     {                     animation.CrossFade("Idel");              vLostState = vStartState;            }                vStartState = AI_Pursuit;       break;            case AIA_BackPoint:        if (vStartState != vLostState)     {                    animation.CrossFade("Run");         vLostState = vStartState;         }                fBackPoint();          if (Vector2.Distance(srcPoint,new Vector2( transform.position.x, transform.position.z) )< 1)      {                    vStartState = AI_Idle;       }                                 break;        case Dead:   //死亡的状态    //if(Living==true)   // {     //Living=false;     //gameObject.SetActive(false);    animation.CrossFade("AirBeaten");        Destroy(gameObject,1.5f); //3秒后游戏对象销毁    //}    break;

}               }    private void fBackPoint()  {        transform.LookAt(new Vector3(srcPoint.x, transform.position.y, srcPoint.y));       transform.Translate(Vector3.forward*vEscapeSpeed*Time.deltaTime);   }    public float backUptime;   //备份时间  private void fAttackHero()  {          //Debug.Log("我攻击到你了!!!");     if (Time.time - backUptime > 1) {       player.SendMessage ("BeAttack");    backUptime=Time.time;   }      }    private void fPursuitHero()   {        transform.LookAt(player.transform.position);      transform.Translate(Vector3.forward * runSpeed * Time.deltaTime);     //transform.Translate(Vector3.forward * vEscapeSpeed * Time.deltaTime);   }     private void fPatrovRect()    {        transform.LookAt(new Vector3(Dis.x,transform.position.y,Dis.y));         transform.Translate(Vector3.forward * speed * Time.deltaTime);     }    private void fGetPatrolPosition()   {         Vector2 vCur;        do         {            float minX = srcPoint.x - vRect.width / 2;      float minY = srcPoint.y - vRect.height / 2;     float maxX = srcPoint.x + vRect.width / 2;      float maxY = srcPoint.y + vRect.height / 2;     float disX = Random.Range(minX, maxX);          float disY = Random.Range(minY, maxY);          Dis = new Vector2(disX, disY);            vCur = new Vector2(transform.position.x,transform.position.z);    }        while (Vector2.Distance(Dis,vCur) < 5);    }  public float HP=3;  //接受来自主角的杀怪消息  public void  BeAttackMoster()  {   Debug.Log("我被你杀了!!!"); //接受来自主角的杀怪消息   if(HP>0)   {    HP--;    Debug.Log(gameObject.name+" HP:"+HP);   }   else   {    Debug.Log(gameObject+" 死亡");    vStartState=Dead;   }

} }

时间: 2024-11-09 09:32:04

Unity 怪物AI的相关文章

怪物AI(复习)

怪物AI执行 //-----------------------------------------------主动攻击------------------------------------------------------ 初始状态 attack_style Enum攻击方式 Enum主动攻击 MonsterStat EnumMonsterStat EnumMonster游荡 Monter被动Stat EnumMonster被动Stat EnumMonster被动NULL 玩家移动或者进入

怪物AI之发现玩家(视觉范围发现系列)

在网上找到一些资料参考,然后写写自己的想法. 这里感谢MOMO等大神. 我们用玩家检测怪物的方法来测,这样比较试用与弱联网游戏,每次在同步玩家的时候来判断玩家与怪物的位置. 这里给出两个处理方式: 1.碰撞器R范围检测. 2.地图分块范围检测. 这两种处理方式适用于不同的游戏. 再讲解这两种方式之前,我们先了解一下一个核心问题,怪物在玩家R半径内时怎么判断怪物是否在玩家视觉范围内. 如下图 在图中, 玩家的位置与怪物的位置会成一个向量.设为V1 怪物的朝向也是一个向量.设为V2 如果怪物能看到6

Unity 初级AI躲避障碍物

1.引言 阅读<Unity Game AI programming >第6章后,感觉躲避障碍物算法不是很给力.为了研究和学习Unity,自己改良躲避障碍物的算法.当然,代码没有优化,不过没关系,抛砖引玉,记录思想,学习交流. 2.与原书算法相比变化: 1.启用物理引擎,使用速度和力解决问题.而不是使用的角度和位置 2.加入沿着障碍物行走,即使障碍物宽度很大或物体向障碍物前进的速度过快,也不会发生穿墙而过现象. 3.为配合沿着障碍物行走,并且显得更自然,引入三个速度与障碍物的交互分区. 3.分享

Unity Rain Ai 插件基本使用(一)

1.下载安装Rain 插件 原先可以在unity的Asset Stroe 下载到,但是现在Rain 的开发公司因为人工智能的发展,公司得到投资,所以下架了rain插件. 所以我给出网盘链接 链接:https://share.weiyun.com/5BKFvOn 密码:wsikw8 链接失效请联系我. 2.向指定目标移动 导入后可以看到在顶部已经有了RAIN 创建一个地板和一个Ai对象如图: 选择要操作的Ai对象,创建AI子物体 我们可以看到AI自物件上有这么一个组件 参数如下: AI:当前这个r

[Unity插件]AI行为树使用总结

参考链接: https://blog.csdn.net/linxinfa/article/details/72937709 https://blog.csdn.net/wanghaodiablo/article/details/52587364 https://blog.csdn.net/q414620221/article/details/78596732 0.节点 一般情况下,只需要扩展Conditional和Action这两种节点即可,Decorator和Composite节点只需要使用内

Cocos2d-x 怪物智能AI怪物也有智商----之游戏开发《赵云要格斗》(6)

       这里是Evankaka的博客,欢迎大家前面讨论与交流------       转载请注明出处http://write.blog.csdn.net/postedit/42611031 这几天一直在研究怪物的AI,博客都没怎么更新.本文将主要来讲讲游戏开发中的怪物智能,一个好的游戏一般怪物都要分等级,这样我们游戏玩起来才有意思,怪物如果智商太高,游戏难度大.怪物如果智商太低,游戏玩起来又没有意思.一般好的游戏低级怪物和中级怪物占大部分,高级怪物一般是BOSS级怪物.下面我来讲讲自己对怪

Unity 3D实现帧同步技术

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 现在竞技类网络游戏比较火,市面上也出现了很多这种类型的游戏竞赛,提到网络游戏就回避不了一个问题:同步技术,多个人在一个游戏场景围攻一个怪物或者说多人组队战斗等等.现在在移动端的游戏由

unity商店demo学习:俯视视角RPG游戏

一下所有素材和源码都来自unity商店的实例 Top-Down RPG Starter Kit ,这个demo是unity商店上最好的入门级rpg游戏实例,麻雀虽小,五脏俱全,想要弄清楚一个标准的rpg游戏的方方面面,这个是很好的选择. ps:demo写得很高深,看得不是很懂,准备慢慢研究. 来一张工程全貌图. 这是一个俯视视角(可以调整视角)的卡通风格3D角色扮演游戏,配着动听又欢快的背景音乐,还有那萌萌哒的怪物,仿佛又回到了初中时玩冒险岛online的时候~~,额,不废话,主要模块如下: 游

从服务器角度分析RPG游戏——NPC的AI

最近主程有些忙,甩给我一些服务器的代码,零零散散总结了一些要素. java程序架构也是层层分析,先罗列出需要做的工作,然后从主干到细节依次实现.就这点而言,程序和绘画有很多类似的地方. 关于怪物AI类型,一般可以分为下列几类: // NPCai性格 public static final int MONSTER_CHARACTER_PASSIVITY = 1; // 被动怪,不打我我不打你,打我我打你 public static final int MONSTER_CHARACTER_ACTIV