U3D 收藏一个飞机随机运动的方法
文章转载: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 收藏一个飞机随机运动的方法的更多相关文章
- 收藏一个JavaScript字符串连接方法
最近在看一同事写的代码时,有一个字符串用了一堆"+"号,看了半天没明天到底会输出什么样的内容,就想到用字符串连接的类,把以前的方法写成了类的方式,方便调用.下面的类支持实例调用和静 ...
- linux全方位掌握一个命令--思路比方法更重要
Linux命令众多,当不清楚一个命令的使用方法时,我们该怎样了解命令的属性和帮助? 1.用type命令了解一个命令的属性 [root@zejin240 testdir]# type cd cd ...
- ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的
最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...
- .net又一个生成缩略图的方法,不变形
生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...
- PHP加载另一个文件类的方法
加载另一个文件类的方法 当前文件下有a.php 和b.php,想要在class b中引入class a <?php class a { public $name = ' ...
- 一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误。
最近电脑Word无故出现故障,无法打开,提示错误信息如下: 问题事件名称: APPCRASH应用程序名: WINWORD.EXE应用程序版本: 11.0.8328.0应用程序时间戳: 4c717ed1 ...
- 只是一个用EF写的一个简单的分页方法而已
只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...
- 在C#中我们能调用一个类的私有方法吗
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.
- .net又一个生成缩略图的方法,不变形,非常好用
生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...
随机推荐
- leetcode面试准备:Divide Two Integers
leetcode面试准备:Divide Two Integers 1 题目 Divide two integers without using multiplication, division and ...
- UNDO表空间损坏,爆满,ORA-600[4194]/[4193]错误解决
模拟手工删除UNDO表空间 在ORADATA 中把UNDOTBS01.DBF 删除 模拟启库 SQL> STARUP; * 第 1 行出现错误: ORA-01157: 无法标识/锁定数据文件 2 ...
- lsof 拥有更多的功能
lsof 拥有更多的功能# lsof -i 看系统中有哪些开放的端口,哪些进程.用户在使用它们,比 netstat -lptu 的输出详细. # lsof -i 4 查看IPv4类型的进程COMMA ...
- BZOJ2661: [BeiJing wc2012]连连看
2661: [BeiJing wc2012]连连看 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 483 Solved: 200[Submit][S ...
- 通过 Azure Media Encoder 降低编码成本
John Deutscher Azure 媒体服务首席项目经理 正如在我们的定价页面上宣布的那样,我们引入了一种只根据输出千兆字节数收取编码费用的全新定价模型.之前的/传统模型是根据输入和输出千兆字 ...
- CSS实现Div透明,而显示在上面的文字不透明,但也可看到显示在下面的图片内容
CSS实现Div透明,而显示在上面的文字不透明,但也可看到显示在下面的图片内容,DiV透明其实挺简单,主要是为background定义opacity属性,一般这个是最大值是1,数值越接近1,则越不透明 ...
- nyoj 353 3D dungeon
3D dungeon 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 You are trapped in a 3D dungeon and need to find ...
- 浙大PTA - - File Transfer
题目链接:https://pta.patest.cn/pta/test/1342/exam/4/question/21732 #include "iostream" #includ ...
- JAVA 面向对象-2-继承(Inheritance)
i.继承(Inheritance) 1.继承的概念 继承:在面向对象编程的过程中,通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类. 继承是面向对象编程最重要的特征之一. 继承的优点:1 ...
- Java多线程——Executors和线程池
线程池的概念与Executors类的应用 1.创建固定大小的线程池 package java_thread; import java.util.concurrent.ExecutorService; ...