Unity 3 d 2017.3 AI(1)簡単な小兵

4008 ワード

PS:この文章があなたを助けたと思ったら、私を押してください. 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyAI : MonoBehaviour
{
    //       
    public enum EnemyType
    {
        Drill,//     
        Flame,//     
        Chainsaw,//     
    }
    //       
    public enum EnemyPattern
    {
        AT,//  
        MT,//  
    }

    public GameObject Enemy;//  Enemy  
    public GameObject Player;//      
    public EnemyType ChooseEnemyType;//       
    public EnemyPattern ChooseEnemyPattern;//         
    public Transform PatrolA;//Enemy     A
    public Transform PatrolB;//Enemy     B
    public GameObject LaserTX;//  Enemy       
    public float EnemyAttackRange = 5;//Enemy     
    public float EnemyMoveSpeed = 1;//      
    public float EnemyRotateSpeed = 10;//      
    public int ATInterval = 500;// 500     

    private Vector3 InitialPosition;//Enemy    
    private float Dis;//Enemy        
    private Vector3 target;//Enemy    
    private bool ATswitch = true;//AT                    
    private float EnemyRotateY = 0.1f;//AT        
    private int My_Time = 0;//       

    // Use this for initialization
    void Start()
    {
        //        Enemy    
        InitialPosition = Enemy.transform.position;
        //             
        target = PatrolA.position;
        transform.LookAt(target);
    }

    // Update is called once per frame
    void Update()
    {
        //    Enemy          
        Dis = Vector3.Distance(Enemy.transform.position, Player.transform.position);

        if (ChooseEnemyPattern == EnemyPattern.MT)//      
        {
            //        Enemy     
            if (EnemyAttackRange > Dis)
            {
                EnemyAttack();//           
            }
            else
            {
                MTEnemyPatrol();//             
            }
        }
        else if (ChooseEnemyPattern == EnemyPattern.AT)//      
        {
            if (EnemyAttackRange > Dis)//           
            {
                EnemyAttack();
            }
            else//       
            {
                ATEnemyMove();//             
            }
        }
    }

    //Enemy      
    void EnemyAttack()
    {
        //Enemy            
        Enemy.transform.LookAt(Player.transform);
        //    
        LaserTX.SetActive(true);
    }
    //Enemy      MT
    void MTEnemyPatrol()
    {
        //            
        LaserTX.SetActive(false);
        //Enemy      
        Enemy.transform.LookAt(target);
        //  Enemy           0.2
        if (Vector3.Distance(Enemy.transform.position, target) <= 0.2f)
        {
            if (target == PatrolA.position)//  Enemy      target  
            {
                target = PatrolB.position;
            }
            else
            {
                target = PatrolA.position;
            }
            //Enemy      
            Enemy.transform.LookAt(target);
        }
        //Enemy speed        
        transform.Translate(Vector3.forward * Time.deltaTime * EnemyMoveSpeed);
    }
    //Enemy     
    void ATEnemyMove()
    {
        My_Time++;//   
        //    
        LaserTX.SetActive(false);
        if (My_Time > ATInterval)//            
        {
            if (ATswitch)
            {
                ATswitch = false;
                My_Time = 0;
            }
            else
            {
                ATswitch = true;
                My_Time = 0;
                EnemyRotateY = Random.Range(-0.1f, 0.1f);//            
            }
        }

        if (ATswitch)
        {
            //    
            transform.Rotate(0, EnemyRotateY, 0);
        }
        else
        {
            //      
            transform.Translate(Vector3.forward * Time.deltaTime * EnemyMoveSpeed);
        }
        
    }
}

これは簡単な小兵のAIで、2つのモードを備えていて、1つは手動モードで、2点を指定して小兵をパトロールさせることができて、自動モードを採用することができて、小兵は自分で移動することができて、攻撃と移動の2つの状態があって、状態機あるいは行為木を使用していません.簡単すぎるので、そんなに複雑な論理は必要ありません.