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);//单个删除 
    }
}

posted on 2014-12-04 21:20  太粗难进  阅读(364)  评论(0编辑  收藏  举报