• AI 人工智能 探索 (三)


    三类子弹的设计

    using UnityEngine;
    using System.Collections;
    
    public class AI : AssembleModel
    {
        private Hashtable table;
        private Transform target;
        void Start()
        {
            table = new Hashtable();
            target = Spawner("Target");//单个创建  
        }
        void Update()
        {
            //方向
            Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.transform.position.y);
            Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);
            iTween.LookUpdate(gameObject, iTween.Hash("looktarget", worldPos, "time", 2, "axis", "y"));
    
            //瞄准图
            RaycastHit hit = new RaycastHit();
            Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(cameraRay.origin, cameraRay.direction, out hit, 100))
            {
                target.position = hit.point;
            }
    
    
            //fire:开火
            if (Input.GetMouseButtonDown(0))
            {
                // Transform transforms = Spawner("Capsule");//炮弹
                //  transforms.GetComponent<Bom>().OnPosition(this.transform, target);
    
                //  Transform transforms = Spawner("bullet");//子弹  
                //   transforms.GetComponent<Emission>().OnPosition(this.transform); 
    
                Transform transforms = Spawner("daodan");//导弹
                transforms.GetComponent<Missile>().OnPosition(this.transform, target);
            }
        }
        //离开碰撞
        void OnTriggerExit(Collider other)
        {
            //如果消失
            if (other.transform.name == otherName)
            {
                touch = false;
                otherName = "";
            }
            table.Remove(other.transform.name);
            StartCoroutine(Independent(0.1f));
        }
        //多物体碰撞 ,当移除后,必须检测已有碰撞中是否还有符合条件的
        IEnumerator Independent(float i)
        {
            if (touch == false) //没碰
            {
                foreach (DictionaryEntry de in table)
                {
                    //检测碰撞,发现导入方法
                    //加入  
                    Transform transform = de.Value as Transform;
                    if (OnDetection(transform))
                    {
                        otherName = transform.name;
                        touch = true;
                    }
                }
            }
            yield return new WaitForSeconds(i);//n秒执行一次 遍历,提高效率 
        }
    
        private bool touch = false;//和目标物体发生碰撞没有
        private string otherName;//目标物体
        //进入碰撞
        void OnTriggerEnter(Collider other)
        {
            table.Add(other.transform.name, other.transform);
    
            if (this.transform.GetComponent<Attribute>().att == 2)
            {
                //测试用
                print(other.transform.name);
                print(table.Count);
            }
            if (touch == false) //没碰
            {
                foreach (DictionaryEntry de in table)
                {
                    //检测碰撞,发现导入方法
                    //加入  
                    Transform transform = de.Value as Transform;
                    if (OnDetection(transform))
                    {
                        otherName = other.transform.name;
                        touch = true;
                    }
                }
            }
        }
        //检测碰撞
        bool OnDetection(Transform tr)
        {
            if (tr.name != transform.name)//碰点不是自己
            {
                //这里写方法判断逻辑
                if (tr.GetComponent<Attribute>().att != this.transform.GetComponent<Attribute>().att)//不同属性对打,相同属性 不打
                {
                    return true;
                }
                else
                {//重新选择敌人
                    return false;
                }
            }
            return false;
        }
    
        //逗留碰撞
        void OnTriggerStay(Collider other)
        {
            if (other.transform.name == otherName)
            {
                //检测距离
                float distance = Vector3.Distance(this.transform.position, other.transform.position);//距离公式  
    
                //根据距离 发射子弹,
                if (this.transform.name == "momo(Clone)001")//测试用
                {
                    this.transform.LookAt(other.transform);
                    //  print(this.transform.name + "发射" + otherName);//发射等通知 或 发射不等 
                }
            }
        }
    
    
    }
    using UnityEngine;
    using System.Collections;
    //子弹轨迹
    public class Emission : MonoBehaviour {
    
        // Use this for initialization
        void Start () {
        
        }
        private Transform transforms;
        public void OnPosition(Transform vec)
        { 
            transforms = vec;
            this.transform.position = new Vector3(transforms.position.x, 1.5f, transforms.position.z);
            this.transform.rotation = transforms.rotation;
            this.transform.rigidbody.velocity = transforms.TransformDirection(Vector3.forward * 10);
        } 
        void Update () {
           
        }
    }
    using UnityEngine;
    using System.Collections;
    //导弹
    public class Missile : AssembleModel
    { 
        public void OnPosition(Transform transforms, Transform target)
        {
            missileSpeed = 31f;//子弹速度
            missileRotateSpeed = 2f;//子弹方向
            missile = transforms;
            man = target;
            if (man != null && missile != null)
            {
                float manWidth = man.GetComponent<MeshFilter>().mesh.bounds.size.x * man.localScale.x;
                float missileLength = missile.GetComponent<MeshFilter>().mesh.bounds.size.z * missile.localScale.z;
                collisionDistance = manWidth / 2 + missileLength / 2;
                transform.position = transforms.position;
            }
        }
        private Transform man;
        private Transform missile;
        private float missileSpeed;
        private float missileRotateSpeed;
        bool whehterShooted = false;
        float distance;
        float collisionDistance;
    
        // Update is called once per frame
        void Update()
        {
            if (missile != null)
            {
                distance = Vector3.Distance(this.transform.position, man.position);
    
                ////导弹朝向人  法一
                // transform.LookAt(man.transform);          
    
                //导弹朝向人  法二            
                Quaternion missileRotation = Quaternion.LookRotation(man.transform.position - transform.position, Vector3.up);
                transform.rotation = Quaternion.Slerp(transform.rotation, missileRotation, Time.deltaTime * missileRotateSpeed);
                transform.rotation = missileRotation;
    
    
                //导弹朝向人   法三            
                //Vector3 targetDirection = man.transform.position - missile.transform.position;
                //float angle = Vector3.Angle(targetDirection,missile.transform.forward);//取得两个向量间的夹角
                //print("angle:"+angle.ToString());
                //if (angle > 5)
                //{
                //    missile.transform.Rotate(Vector3.up, angle);
                //}
    
    
                transform.Translate(Vector3.forward * Time.deltaTime * missileSpeed);
                //检测是否发生碰撞。这里通过两者的distance来判断
                if (distance <= collisionDistance)
                {
                    Despawn(transform);
                }
            }
        }
    }
    using UnityEngine;
    using System.Collections;
    //炮弹轨迹
    public class Bom : AssembleModel
    {
        public float speed = 10;
        private float distanceToTarget;
        private bool move = true;
    
        void Start()
        {
    
        }
        private Vector3 thisVector;//本地坐标
        private Vector3 otherVector;//目标坐标
    
        private Transform transforms1;
        private Transform target1;
        public void OnPosition(Transform transforms, Transform target)
        {
            transforms1 = transforms;
            target1 = target;
            thisVector = transforms.position;
            otherVector = target.position;
            distanceToTarget = Vector3.Distance(thisVector, otherVector);
    
            Vector3 ve = new Vector3();
            ve = thisVector;
            ve.y += 1; 
            this.transform.position = ve;
            StartCoroutine(Shoot());
           
        }
    
        IEnumerator Shoot()
        {
            move = true;//因为是协成,会导致 异步改变
            while (move)
            {
                Vector3 targetPos = otherVector;
                this.transform.LookAt(targetPos);
                float angle = Mathf.Min(1, Vector3.Distance(transforms1.position, target1.position) / distanceToTarget) * 45;
                this.transform.rotation = this.transform.rotation * Quaternion.Euler(Mathf.Clamp(-angle, -42, 42), 0, 0);
                float currentDist = Vector3.Distance(this.transform.position, otherVector);
               //   print("currentDist" + currentDist + "=="+targetPos);
                if (currentDist < 0.5f)
                {
                    move = false; CleanUp();
                }
                else
                {
                    this.transform.Translate(Vector3.forward * Mathf.Min(speed * Time.deltaTime, currentDist));
                }
                 yield return null;
            }
        }
    
        void CleanUp()
        {  
             Despawn(this.transform);//单个删除 
        }
    }

  • 相关阅读:
    SqlServer为字段创建索引
    学习java时在要求输出的数字带俩个小数点时,利用String.format时出现的问题
    JAVA字符串格式化-String.format()的使用
    Java中使用JSONTokener判断接口返回字符串是JSONObject还是JSONArray
    StringUtils工具类中的isBlank()方法和isEmpty()方法的区别
    Idea 隐藏不必要的文件或文件夹 eg:(.idea,.gitignore,*.iml)
    使用Gradle构建android应用
    Android开源库--SlidingMenu左右侧滑菜单
    cmd.exe-应用程序错误 应用程序无法正常启动(0xc0000142)
    Cocos2d-x 开发手记
  • 原文地址:https://www.cnblogs.com/big-zhou/p/4143902.html
Copyright © 2020-2023  润新知