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

时间: 2024-10-17 05:08:43

AI 人工智能 探索 (三)的相关文章

AI 人工智能 探索 (四)

在写之前,先对昨天寻路插件再做一些补充,因为该插件不是很完善,所以当我发现有不能满足需求的时候,就会试图更改源代码,或增加接口来符合我的需求. 昨天补充了一条是 自身转向代码,今天补充另外一条,是及时改变路向.我们发现原始插件改变路向,必须要等角色到达目标点才能再做改变,我们在ai中希望是,当目标点改变,角色在半道就要改变新方向. 好了,解决该问题的方法很简单,只需要如下方法 public void OnStopFind() { m_bNavRequestCompleted = true; }

AI 人工智能 探索 (五)

我们把做好的 角色 拖到 内存池,如图所示,这样我们可以动态生成角色并给予他 寻路目标. //逗留碰撞 void OnTriggerStay(Collider other) { if (other.transform.name == otherName) { //检测距离 float distance = Vector3.Distance(this.transform.position, other.transform.position);//距离公式 //根据距离 发射子弹, if (this

AI 人工智能 探索 (六)

这次我为 角色 attribute 添加了 多个属性 其中 att 是 好人 坏人 等属性, 显然 数字不同 就要打起来. grade 是智商属性 ,今天先做了 3的智商.也就是小兵智商.碰到就打 逃也要追着打 distance 是 可攻击距离 ,如果两个物体超过了 这个距离 就继续移动 小于这个距离就打 其他三个不解释,都能理解 private Transform otherTransforms;//碰撞对方 private bool track = true;//是否 可以 追踪 priva

AI 人工智能 探索 (七)

我简单画了一幅图,来讲下 ai 中的设计模式.图形中的这些人物,我想大家都能看的明白. 当 盗贼出现,人们发现了他们,就 呼叫 主类,然后主类再  通知 下面对应的管理局,然后管理局再 分配人手过去 处理.当然红叉表示受伤,他呼叫的是 医院,没有受伤的,呼叫的是  警察局. 有人问,为什么不 直接 让 人 呼叫 医院或 警察局.反而通知 主类,再通知下面.因为,如果医院 有多个,以后还可有其他同类行增加,那么作为人呼叫具体地点的医院,显然不是很合理.有了以上这个呼叫模式,我们的ai就可以敲定如何

AI 人工智能 探索 (九)

链接:http://pan.baidu.com/s/1c0AM3g0 密码:uccw 今天补充 创建物体 移动物体 ,当点击创建后 ,会出来一个 上图的 ui,他跟随 物体,当你把物体拖动到 指定的地方,可以按 勾,也可以按× 取消他.物体间 碰撞 会返回原地.代码自己看吧,都是之前 讲到的 一些技术,下一篇 继续 补充代码.

AI 人工智能 探索 (十)

呼叫事件图形结构如下 蓝色代表 警察局 红色代表警察 黄色代表 死亡人 蓝色球代表呼救人 黑色代表 敌人 警察目标是 攻击 黑色人,但 路中 会碰到 黄色人,如果警察有 救人功能 则会先救人去医院再看 是否 还有敌人攻击.如果没救人技能 则 按照默认打 黑色人 我设计的 思路是,先由 PeopleManager中的 人物求救,当然 这图只有警察,应该会有 其他求救者.然后 SendMessageUpwards 给 最上层 PoolManager 类,告诉他 需要 救人还是需要救火 或打人 或等等

AI 人工智能 探索 (一)

碰撞检测 //逗留碰撞 void OnTriggerStay (Collider other) { if (other.transform.name == name) { //检测距离 //根据距离 发射子弹, } } private bool peng = false;//和目标物体发生碰撞没有 private string name;//目标 //进入碰撞 void OnTriggerEnter (Collider other) { table.Add (other.transform.na

从大数据技术变迁猜一猜AI人工智能的发展

目前大数据已经成为了各家互联网公司的核心资产和竞争力了,其实不仅是互联网公司,包括传统企业也拥有大量的数据,也想把这些数据发挥出作用.在这种环境下,大数据技术的重要性和火爆程度相信没有人去怀疑. 而AI人工智能又是基于大数据技术基础上发展起来的,大数据技术已经很清晰了,但是AI目前还未成熟啊,所以本文就天马行空一下,从大数据的技术变迁历史中来找出一些端倪,猜一猜AI人工智能未来的发展. 最近断断续续的在看<极客时间>中「 从0开始学大数据 」专栏的文章,受益匪浅,学到了很多.尤其是非常喜欢作者

《zw版&#183;Halcon-delphi系列原创教程》 Halcon分类函数002&#183;AI人工智能

<zw版·Halcon-delphi系列原创教程> Halcon分类函数002·AI人工智能 AI人工智能:包括knn.gmm.svm等 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“procedure” :: 用大写字母“X”,替换:“IHUntypedObjectX” :: 省略了字符:“const”.“OleVariant” [示例] 说明 函数: procedure AddNoiseWhiteContourXld( const Contours