三类子弹的设计

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. Delphi的StringReplace[转]

    原文:http://blog.csdn.net/genispan/article/details/4458319 function StringReplace (const S, OldPattern ...

  2. IE6下a标签失效(背景穿透)

    background:fixed url(about:blank);有时候做感应区域的时候在ie6下不给背景就会感应不到,比如说当鼠标移到图片的左半边部分,鼠标手势变成向左的箭 头,比如说有些时候a标 ...

  3. iOS 加载本地的html文件

    方法1: self.webView  = [[UIWebView alloc]initWithFrame:self.view.bounds]; NSString *path = [[NSBundle ...

  4. VMWare网络链接三种方式

    本文转自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/03/15/1985084.html VMware虚拟机上网络连接(networ ...

  5. insertAdjacentHTML方法详解

    添加HTML内容与文本内容以前用的是innerHTML与innerText方法, 最近发现还有insertAdjacentHTML和 insertAdjacentText方法, 这两个方法更灵活,可以 ...

  6. photoshop cs6 mac版

    首选项 -> 界面,调整工作区背景色 放大:command + "+" 放大镜:z 矩形选框工具(M):用来抠图,做造型.shift正方形选取 填充前景色:alt + del ...

  7. 自定义UICollectionView

    1.创建一个UICollectionView工程,点击鼠标右侧按钮选择New File->Cocoa Class->点击Next,Class选项填写一个合理的名称,如:MyCollecti ...

  8. JPA基本注解介绍

    一.@Entity •@Entity 标注用于实体类声明语句之前, 指出该Java 类为实体类,将映射到指定的数据库表. 如声明一个实体类 Customer,它将映射到数据库中的 customer 表 ...

  9. iOS特殊字符的转义字符

    所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为 ...

  10. view视图--display中echo出ob_get_contents的缓冲内容--(实现,拼接好文件--导入文件)

    view.php01默认设置有3个公共的属性,其他属性.后面实例化的时候.通过传递参数.foreach遍历,不断的增加属性02view对象的实例化.位置在-->控制器父类的构造方法中视图的目录名 ...