三类子弹的设计

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", , "axis", "y")); //瞄准图
RaycastHit hit = new RaycastHit();
Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(cameraRay.origin, cameraRay.direction, out hit, ))
{
target.position = hit.point;
} //fire:开火
if (Input.GetMouseButtonDown())
{
// 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 == )
{
//测试用
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 * );
}
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 / + missileLength / ;
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 = ;
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 += ;
this.transform.position = ve;
StartCoroutine(Shoot()); } IEnumerator Shoot()
{
move = true;//因为是协成,会导致 异步改变
while (move)
{
Vector3 targetPos = otherVector;
this.transform.LookAt(targetPos);
float angle = Mathf.Min(, Vector3.Distance(transforms1.position, target1.position) / distanceToTarget) * ;
this.transform.rotation = this.transform.rotation * Quaternion.Euler(Mathf.Clamp(-angle, -, ), , );
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);//单个删除
}
}

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

  1. AI 人工智能 探索 (四)

    在写之前,先对昨天寻路插件再做一些补充,因为该插件不是很完善,所以当我发现有不能满足需求的时候,就会试图更改源代码,或增加接口来符合我的需求. 昨天补充了一条是 自身转向代码,今天补充另外一条,是及时 ...

  2. AI 人工智能 探索 (六)

    这次我为 角色 attribute 添加了 多个属性 其中 att 是 好人 坏人 等属性, 显然 数字不同 就要打起来. grade 是智商属性 ,今天先做了 3的智商.也就是小兵智商.碰到就打 逃 ...

  3. AI 人工智能 探索 (五)

    我们把做好的 角色 拖到 内存池,如图所示,这样我们可以动态生成角色并给予他 寻路目标. //逗留碰撞 void OnTriggerStay(Collider other) { if (other.t ...

  4. AI 人工智能 探索 (七)

    我简单画了一幅图,来讲下 ai 中的设计模式.图形中的这些人物,我想大家都能看的明白. 当 盗贼出现,人们发现了他们,就 呼叫 主类,然后主类再  通知 下面对应的管理局,然后管理局再 分配人手过去 ...

  5. AI 人工智能 探索 (二)

    完整被动技能代码 using UnityEngine; using System.Collections; public class AI : MonoBehaviour { private Hash ...

  6. AI 人工智能 探索 (十)

    呼叫事件图形结构如下 蓝色代表 警察局 红色代表警察 黄色代表 死亡人 蓝色球代表呼救人 黑色代表 敌人 警察目标是 攻击 黑色人,但 路中 会碰到 黄色人,如果警察有 救人功能 则会先救人去医院再看 ...

  7. AI 人工智能 探索 (九)

    链接:http://pan.baidu.com/s/1c0AM3g0 密码:uccw 今天补充 创建物体 移动物体 ,当点击创建后 ,会出来一个 上图的 ui,他跟随 物体,当你把物体拖动到 指定的地 ...

  8. AI 人工智能 探索 (八)

    绑定下,用来释放内存 布局框架.链接:http://pan.baidu.com/s/1eQzSXZO 密码:25ir 这次 我采用 ngui 来设定界面.除工具栏模块外,其他各类ui模块都是 内存池动 ...

  9. AI 人工智能 探索 (一)

    碰撞检测 //逗留碰撞 void OnTriggerStay (Collider other) { if (other.transform.name == name) { //检测距离 //根据距离 ...

随机推荐

  1. 离线消息如何实现?-- ESFramework 4.0 快速上手(02)

    在ESFramework 4.0 快速上手一文中,主要介绍了如何使用ESPlus.Rapid命名空间中的引擎来快速地构建基于TCP的网络通信系统,即使是使用ESPlus.Rapid来进行ESFrame ...

  2. .Net Core Identity外面使用Cookie中间件

    1.在 app.UseMvc 前面加上app.UseCookieAuthentication app.UseCookieAuthentication(new CookieAuthenticationO ...

  3. EF Unit Of Work

    BaseEntity, 所有的业务表都继承这个类,每个表的主键都是GUID, 主键名Id. public abstract class BaseEntity{ public BaseEntity() ...

  4. 单片机上使用TEA加密通信(转)

    源:单片机上使用TEA加密通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:MDK4.72 单片机:STM32 说 ...

  5. php编译错误:Cannot find OpenSSL's <evp.h>

    yum install openssl openssl-devel ln -s /usr/lib64/libssl.so /usr/lib/

  6. CSSHack 兼容性

    史上最全的CSS hack方式一览    CSS hack技巧大全    Can i use CSS hack CSS hack 由于不同厂商的流览器或某浏览器的不同版本(如IE6-IE11,Fire ...

  7. Quartz任务调度器及与Spring的整合使用

    参考  点击打开链接

  8. Android:如何实现更换主题

    关键代码:setTheme(int ID); 注意点: 1.设置主题必须要在setContentView() 之前调用,所以需要写个Intent去重新开启Activity. 2.为了切换主题保证流畅性 ...

  9. windows做时间服务器,linux和windows时间同步

    找了很多的资料,都没有windows做时间服务,linux同步windows的时间的,最后自己找了一些软件,终于搞定了,写出来给大家共享,以免大家多走弯路 首先在http://www.meinberg ...

  10. Chapter 2 Open Book——15

    The rest of the week was uneventful. I got used to the routine of my classes. 这周剩下的时间都是平淡无事的.我就是正常的上 ...