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", , "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 人工智能 探索 (三)的更多相关文章
- AI 人工智能 探索 (四)
在写之前,先对昨天寻路插件再做一些补充,因为该插件不是很完善,所以当我发现有不能满足需求的时候,就会试图更改源代码,或增加接口来符合我的需求. 昨天补充了一条是 自身转向代码,今天补充另外一条,是及时 ...
- AI 人工智能 探索 (六)
这次我为 角色 attribute 添加了 多个属性 其中 att 是 好人 坏人 等属性, 显然 数字不同 就要打起来. grade 是智商属性 ,今天先做了 3的智商.也就是小兵智商.碰到就打 逃 ...
- AI 人工智能 探索 (五)
我们把做好的 角色 拖到 内存池,如图所示,这样我们可以动态生成角色并给予他 寻路目标. //逗留碰撞 void OnTriggerStay(Collider other) { if (other.t ...
- AI 人工智能 探索 (七)
我简单画了一幅图,来讲下 ai 中的设计模式.图形中的这些人物,我想大家都能看的明白. 当 盗贼出现,人们发现了他们,就 呼叫 主类,然后主类再 通知 下面对应的管理局,然后管理局再 分配人手过去 ...
- AI 人工智能 探索 (二)
完整被动技能代码 using UnityEngine; using System.Collections; public class AI : MonoBehaviour { private Hash ...
- AI 人工智能 探索 (十)
呼叫事件图形结构如下 蓝色代表 警察局 红色代表警察 黄色代表 死亡人 蓝色球代表呼救人 黑色代表 敌人 警察目标是 攻击 黑色人,但 路中 会碰到 黄色人,如果警察有 救人功能 则会先救人去医院再看 ...
- AI 人工智能 探索 (九)
链接:http://pan.baidu.com/s/1c0AM3g0 密码:uccw 今天补充 创建物体 移动物体 ,当点击创建后 ,会出来一个 上图的 ui,他跟随 物体,当你把物体拖动到 指定的地 ...
- AI 人工智能 探索 (八)
绑定下,用来释放内存 布局框架.链接:http://pan.baidu.com/s/1eQzSXZO 密码:25ir 这次 我采用 ngui 来设定界面.除工具栏模块外,其他各类ui模块都是 内存池动 ...
- AI 人工智能 探索 (一)
碰撞检测 //逗留碰撞 void OnTriggerStay (Collider other) { if (other.transform.name == name) { //检测距离 //根据距离 ...
随机推荐
- wuzhi 五指 基本知识
参数:m 模块 在于 /coreframe/app/模块文件夹 |默认 content f php文件 控制器 在于/coreframe/app/模块 /文件.php | 默认 index v ...
- NOIP2011-普及组复赛-第一题-数字反转
题目描述 Description 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2). 输入 ...
- XP 右键扩展设置 1.0 免费绿色版
软件名称: xp右键扩展设置软件 1.0 免费绿色版软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP / Win2008软件大小: 57 ...
- 38.利用接口做参数,写个计算器,能完成+-*/运算 (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) 此方法要求能够:1.用传递过来的对象调用comp
//接口Compute package jieKou; public interface Compute { int Computer(int n,int m); } //加 package jieK ...
- 通过实例来理解ajax
点击一个按钮,然后将信息显示到指定的div内. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"& ...
- Oracle Day01 数据库基础
1.数据库 它是一种软件产品,是用于存放数据.管理数据的存储仓库,是有效组织在一起的数据集合. 2.数据库和数据库对象的概念 数据库:指的是物理磁盘上的文件 数据库对象:存在于内存中用于跟数据库文件进 ...
- kindle网络爬虫续集
简单介绍: 这次我们要爬的网页是:Kindle商店中的今日特价书,其中每周/每月特价书同理,就不再重复了选择这个网页的原因有两个:一是实用,很多人都会经常去看看Kindle特价书有没有自己喜欢的:二是 ...
- android之服务service
service的概念: 官方定义:在后台长时间的操作,没有用户界面,不与用户进行交互,在默认的情况下,service运行在应用程序进程的主线程中,如果需要在Service中处理一些网络连接等耗时操作, ...
- iOS下uiview和uiscrollview设置背景图片的源码
1.uiscrollview 设置背景图片 // Setup the Scroll ViewUIScrollView*tempScrollView=(UIScrollView*)self.view;t ...
- 第四十二节,configparser特定格式的ini配置文件模块
configparser用于处理特定格式的文件,其本质上是利用open来操作文件. 特定格式的ini配置文件模块,用于处理ini配置文件,注意:这个ini配置文件,只是ini文件名称的文本文件,不是后 ...