文章转载:http://www.manew.com/thread-43578-1-1.html

前面的学习中已经涉及到了随机运动,这一篇主要还是前面的随机运动的改进,不废话直接上效果图吧,对比前面的随机运动,这里的飞机会随机的转动方向,而且转弯平滑

有一种做法是每一帧都计算出一个随机的驱动力,但是这
样会产生抖动,不能达到持久的转弯(事实上,一个好的随机函数,Perlin噪声,可以产生光滑转弯,但是CPU的开销会很大。当然当你没有其他办法时,
这仍然是个办法,Perlin噪声有很多应用程序)。在这里的解决方案是,在飞机的前端凸出位置界定一个圆圈,隐藏一个跟踪物并被限制在该圆圈上,然后随
机的使得这个隐藏的跟踪物运动起来,飞机只要保持追踪这个追踪物就可以实现平滑的随机转弯运动了。类似于,一个鱼前面有一个鱼竿挂着一个诱饵,但是鱼永远
也追不上那个诱饵,因为它就绑在它身上。如图所示是它的隐藏效果图

主要代码下:
using unityEngine;
using System.Collections;
using UnityEngine.UI;
/// <summary>
/// 前面的随机运动是比较粗糙的,这种运动会产生抖动,不能达到持久的转弯(事实上,一个好的随机函数,Perlin噪声,可以产生光滑转弯,但是那样CPU的开销会很大。),在飞机前面添加一个凸出的圆圈,目标被限制在
/// 圆圈上,然后在移动飞机至目标上,当然飞机永远也不会追上目标就好像给鱼的前面掉一个钓鱼竿和诱饵一样。
/// </summary>
public class AIAdvancedRandMove : MonoBehaviour
{
public float m_weight;//这个值是用来转弯用的,值越大转弯越快
public PlayObject WanderTarget;//这是一个点,被限制在半径为m_dWanderRadius的圆圈里面,以大圆圈为中心
[HideInInspector]
private Vector2 vWanderTarget;
public PlayObject plane;
public Image Circle;
public float m_dWanderRadius;//wander圈的半径
public float m_dWanderDistance;//wander圈凸出在飞机前面的距离
public float m_dWanderJitter;//每秒加到目标的随机位移的最大值
// Use this for initialization
void Start()
{
//初始化小圆圈的位置并且限制小圆圈在大圆圈里面,大圆圈的半径为m_dWanderRadius
float thera = Random.Range(, 361.0f)*Mathf.PI/;//随机0~360度并转换成弧度
// Debug.Log(Mathf.Sin(30*Mathf.PI/180));
vWanderTarget = new Vector2(m_dWanderRadius * Mathf.Cos(thera), m_dWanderRadius * Mathf.Sin(thera));
WanderTarget.LocalPosition = vWanderTarget;
} // Update is called once per frame
void Update()
{
Vector2 moveVec = AI_AdvancedRandMove();
float length = Mathf.Sqrt(moveVec.x * moveVec.x + moveVec.y * moveVec.y);
if (length != )
{
// Debug.Log("x:" + moveVec.x + "y:" + moveVec.y);
plane.Velocity +=m_weight * moveVec / length;
Circle.transform.position = plane.Position;
plane.Move(, true);
} } Vector2 AI_AdvancedRandMove()
{
//随机位移值
float JitterThisTimeSlice = m_dWanderJitter * Time.deltaTime*;
//首先,加一个小的随机向量到目标位置
vWanderTarget += new Vector2(Random.Range(-, ) * JitterThisTimeSlice, Random.Range(-, ) * JitterThisTimeSlice);
//把这个向量归一化,也即把这个向量重新投影回单元圆周上
float lenght = Mathf.Sqrt(vWanderTarget.x * vWanderTarget.x + vWanderTarget.y * vWanderTarget.y);
vWanderTarget = vWanderTarget / lenght;
//使向量的长度增加wander圆周的半径长度
vWanderTarget *= m_dWanderRadius;
Vector2 target = new Vector2(vWanderTarget.x+m_dWanderDistance,vWanderTarget.y);
WanderTarget.LocalPosition = target;
target = WanderTarget.Position;
// Vector2 Target = PointToWorldSpace(ref target, plane.vHeading, plane.vSide, plane.Position);
return target - plane.Position;
}
/// <summary>
/// 从局部坐标的位置转向世界坐标
/// </summary>
/// <param name="vec"></param>
/// <param name="Heading"></param>
/// <param name="Side"></param>
/// <returns></returns>
Vector2 PointToWorldSpace(ref Vector2 point, Vector2 Heading, Vector2 Side, Vector2 Postion)
{
Vector2 TransVec = point;
C2DMatrix matTransform = new C2DMatrix();
//旋转矩阵
matTransform.Rotate(ref Heading, ref Side);
//平移矩阵
matTransform.Translate(Postion.x, Postion.y);
matTransform.TransformVector2Ds(ref TransVec);
return TransVec; } }

U3D 收藏一个飞机随机运动的方法的更多相关文章

  1. 收藏一个JavaScript字符串连接方法

    最近在看一同事写的代码时,有一个字符串用了一堆"+"号,看了半天没明天到底会输出什么样的内容,就想到用字符串连接的类,把以前的方法写成了类的方式,方便调用.下面的类支持实例调用和静 ...

  2. linux全方位掌握一个命令--思路比方法更重要

    Linux命令众多,当不清楚一个命令的使用方法时,我们该怎样了解命令的属性和帮助?     1.用type命令了解一个命令的属性 [root@zejin240 testdir]# type cd cd ...

  3. ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...

  4. .net又一个生成缩略图的方法,不变形

    生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...

  5. PHP加载另一个文件类的方法

    加载另一个文件类的方法 当前文件下有a.php 和b.php,想要在class b中引入class a <?php    class a    {        public $name = ' ...

  6. 一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误。

    最近电脑Word无故出现故障,无法打开,提示错误信息如下: 问题事件名称: APPCRASH应用程序名: WINWORD.EXE应用程序版本: 11.0.8328.0应用程序时间戳: 4c717ed1 ...

  7. 只是一个用EF写的一个简单的分页方法而已

    只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...

  8. 在C#中我们能调用一个类的私有方法吗

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.

  9. .net又一个生成缩略图的方法,不变形,非常好用

    生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...

随机推荐

  1. CKFinder 2.4 ASP.NET 破解

    网上的破解教程对于2.4版本来说已经过时了. 以下是CKFinder 2.4 ASP.NET的亲测可用破解方法,经测试,只需修改两处代码. 打开ckfinder.js, 步骤1. 搜索替换如下代码: ...

  2. Yii处理流程

    Yii的应用程序处理流程 用户访问URL http://www.example.com/blog/index.php?r=site/contact 1.入口脚本被网站服务器执行以处理此请求. 2.一个 ...

  3. BZOJ3132: 上帝造题的七分钟

    3132: 上帝造题的七分钟 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 483  Solved: 222[Submit][Status] Desc ...

  4. PHP手册 – 变量和常量

    变量 php中变量的定义,就是就在某一个单词前面加上"\(".这是php的特色,**我想到的一个好处就是和常量做区分.另外,linux的shell编程中,\)有取值的意思.**.赋 ...

  5. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

    原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.s ...

  6. 新建应用母版页的网页index.aspx,about.aspx,login.aspx

    转:http://www.netfoucs.com/liu_111111/article/details/8433491 -----------index.aspx:----------------- ...

  7. Legal or Not

    Legal or Not Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  8. tcp/ip体系-转载

    如果还想在测试这条路上继续走下去的话,那么下面这些东西就是我们必须去掌握的,至少你还不想止步于简单的黑盒测试--其实,一直想去接触Linux下的应用测试,这样能学到东西会很多,而且会非常的受用.之前听 ...

  9. 参考SQLHelper编写的OracleHelper

    使用 Oracle.ManagedDataAccess.Client 类库参考SQLHelper编写的OracleHelper: // ================================ ...

  10. MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验

    原文地址:http://liangweilinux.blog.51cto.com/8340258/1728131 首先在此感谢下我的老师年一线实战经验,我当然不能和我的老师平起平坐,得到老师三分之一的 ...