• 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;

             }

     

         }

    }

    。net交流
  • 相关阅读:
    Android--adb
    Android 爬坑之路
    Android倒计时实现
    Android Studio常用设置
    Java Web开发——MySQL数据库的安装与配置
    DOS命令(系统错误5,拒绝访问)的解决方法
    Java EE开发环境——MyEclipse2017破解 和 Tomcat服务器配置
    设计模式-工厂模式
    设计模式-简单工厂模式
    设计模式简介
  • 原文地址:https://www.cnblogs.com/hcyblogs/p/4613240.html
Copyright © 2020-2023  润新知