上一篇文章介绍了使用unity3D进行战斗机飞行模拟的设计http://www.cnblogs.com/jqg-aliang/p/4598515.html,其实只要稍微修改一下,就变成了直升机的飞行模拟。只需要复写一下几个移动的方法就行了。

需要写的功能如下:直升机的前进,后退,左右移动,左右旋转,升高和降落

还是以数学模拟为例,我们需要几个值来控制游戏对象(直升机)的移动效果。具体参数的我就不说了,直接上代码吧。

using UnityEngine;
using System.Collections;public class GameHelicopter : Flight
{//这个是直升机的算法实现//需要写的功能如下:直升机的前进,后退,左右移动,左右旋转,升降,

bool IsFBB = false, IsLRB = false;//private float downSpeed;private float currentUDSpeed;private float currentMLRSpeed;private float currentRLRSpeed;public override void MoveFB(float speed){if ((IsSing) || IsOnGround) return;CurrentSpeed += speed * aircaft.Acc * Time.deltaTime;CurrentSpeed = Mathf.Clamp(CurrentSpeed, aircaft.MinSpeed, aircaft.MaxSpeed);if ((IsSing) || IsOnGround) return;IsFBB = false;Balance(Quaternion.Euler(aircaft.AxisFB * speed, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime/5);}public override void MoveLR(float speed){//左右移动if ((IsSing) || IsOnGround) return;//IsLRB = false;
currentMLRSpeed += speed * Time.deltaTime * aircaft.Acc;currentMLRSpeed = Mathf.Clamp(currentMLRSpeed, -aircaft.MoveLRSpeed, aircaft.MoveLRSpeed);/*Vector3 vector = body.right;vector.y = 0;//Move(speed * vector * aircaft.MoveLRSpeed * Time.deltaTime);*/Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, -aircaft.AxisFB * speed), aircaft.RoteLRSpeed * Time.deltaTime * 3);//print("MoveLR" + speed);
    }public override void Operational(){//操作//
        Altigraph();CurrentSpeed = Mathf.Lerp(CurrentSpeed, 0, Time.deltaTime/3);//if (!IsUD) {currentUDSpeed = Mathf.Lerp(currentUDSpeed, 0, Time.deltaTime);//}if (IsOnGround && currentUDSpeed<0){currentUDSpeed = 0;}currentMLRSpeed = Mathf.Lerp(currentMLRSpeed, 0, Time.deltaTime);currentRLRSpeed = Mathf.Lerp(currentRLRSpeed, 0, Time.deltaTime/2);Move(Vector3.Cross(Vector3.up,  body.right) * -CurrentSpeed * Time.deltaTime);Move(Vector3.up * currentUDSpeed * Time.deltaTime);Move(-currentMLRSpeed * Vector3.Cross(body.forward,Vector3.up)  * Time.deltaTime);Rote(currentRLRSpeed * Vector3.up * Time.deltaTime);Balance();}public override void RoteLR(float speed){//左右旋转if ((IsSing) || IsOnGround) return;currentRLRSpeed += speed * aircaft.Acc * Time.deltaTime;currentRLRSpeed = Mathf.Clamp(currentRLRSpeed, -aircaft.RoteLRSpeed, aircaft.RoteLRSpeed);IsLRB = false;//Rote(speed * Vector3.up * aircaft.RoteLRSpeed * Time.deltaTime );
Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, -aircaft.AxisLR * speed), aircaft.RoteLRSpeed * Time.deltaTime/5);}public override void RoteUD(float speed){//上下旋转//速度和角度/*if ((IsSing) || IsOnGround ) return;IsFBB = false;Balance(Quaternion.Euler(aircaft.AxisFB * speed, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime * CurrentSpeed / aircaft.MoveFBSpeed);*///这个功能是实现直升机的升降
currentUDSpeed += speed * Time.deltaTime * aircaft.Acc;currentUDSpeed = Mathf.Clamp(currentUDSpeed, -5, 5);//print("RoteUD" + speed);
}public override void Balance(){if (IsSing) return;if (IsLRB){Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, 0), aircaft.RoteLRSpeed * Time.deltaTime / 2.2f);}if (IsFBB){Balance(Quaternion.Euler(0, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime / 2.3f);}IsLRB = true;IsFBB = true;}private float lastSTime;public override void StuntLR(float axis){if ((IsSing) || IsOnGround && CurrentSpeed < aircaft.MoveFBSpeed / 3.6f) return;if (!IsSing){IsSing = true;StartCoroutine(SLR(axis));}}IEnumerator SLR(float speed){//这个特技是指侧飞,获取按下飞机的坐标和速度F1,计算出侧飞半径,//直到飞行角度和F1垂直的位置speed = (speed > 0 ? 1 : -1);Vector3 aim = body.right * (speed);aim.y = 0;while (Vector3.Dot(aim.normalized, body.forward.normalized) < 0.99f){Rote(speed * Vector3.up * aircaft.RoteLRSpeed * Time.deltaTime);Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, -85 * (speed)), aircaft.RoteLRSpeed * Time.deltaTime * 3.8f);Balance(Quaternion.Euler(0, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime * 1.8f);yield return new WaitForFixedUpdate();}while ((body.eulerAngles.z > 15) && (body.eulerAngles.z < 180) || (body.eulerAngles.z < 345) && (body.eulerAngles.z > 270)){Balance(Quaternion.Euler(0, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime);Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, 0), aircaft.RoteLRSpeed * Time.deltaTime * 3);yield return new WaitForFixedUpdate();}IsSing = false;}public override void StuntUD(float axis){if ((IsSing) || IsOnGround && CurrentSpeed < aircaft.MoveFBSpeed / 3.6f) return;if (!IsSing){IsSing = true;StartCoroutine(SUD(axis));}}IEnumerator SUD(float speed){//这个特技是指侧飞,获取按下飞机的坐标和速度F1,计算出侧飞半径,//直到飞行角度和F1垂直的位置
        speed = (speed > 0 ? 1 : -1);Vector3 aim = -body.forward;aim.y = 0;while (Vector3.Dot(aim.normalized, body.forward.normalized) < 0.8f){Vector3 v = body.right;v.y = 0;Rote(body.right * Time.deltaTime * -90 * speed);Move(-Vector3.up * speed * Time.deltaTime * 10 * (CurrentSpeed / (aircaft.OffSpeed)));//body.Rotate(Vector3.right * Time.deltaTime * -90,Space.Self);//Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, 0), aircaft.RoteLRSpeed * Time.deltaTime*5);yield return new WaitForFixedUpdate();}while ((body.eulerAngles.z > 15) && (body.eulerAngles.z < 180) || (body.eulerAngles.z < 345) && (body.eulerAngles.z > 270)){Balance(Quaternion.Euler(0, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime);Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, 0), aircaft.RoteLRSpeed * Time.deltaTime * 3);yield return new WaitForFixedUpdate();}IsSing = false;}
}

关于测试代码也很简单,输入检测一下,然后调用直升机的控制代码就行了,这里就不提供了。

转载于:https://www.cnblogs.com/jqg-aliang/p/4713612.html

基于unity的直升机模拟设计相关推荐

  1. 基于unity的飞行模拟设计

    使用unity开发游戏真是非常方便.研究飞行模拟也有一段时日,尝试过物理和数学模拟.从效果上来看,物理模拟较为真实一点.但是操作不好.数学模拟的话,虽然牺牲了飞行效果,操控是非常方便的. 所谓的数学模 ...

  2. unity 陶瓷质感_一种基于Unity3D的虚拟陶瓷设计方法与流程

    本发明涉及虚拟现实领域,特别涉及一种基于Unity3D的虚拟陶瓷设计方法. 背景技术: 陶艺工艺制作环境要求严格:不仅在拉坯成型需要利用旋转机器,在烧制过程则需要窑炉锻造,如何将陶瓷制作工艺与虚拟现实 ...

  3. 基于unity的愤怒的小鸟设计

    基于unity的愤怒的小鸟设计 演示视频 目录 2 一.游戏设计 3 1.1 前期设计思路 3 1.1.1 设计透镜 3 1.1.2 游戏主题 3 1.1.2 创意 3 1.2 设计目的 4 1.3 ...

  4. 《游戏开发基础》课程论文丨基于Unity与Bolt的抗美援朝主题3D游戏设计

    文章目录 摘要 关键词 一.导言 二.角色操控 2.1 隐藏鼠标 2.2 通过移动鼠标更新玩家视角 2.3 使角色跳跃 2.4 使角色移动 2.5 使角色冲刺 2.6 使角色卧倒 2.7 设置准星及切 ...

  5. 基于wincc的虚拟电梯设计_基于WINCC的模拟电梯设计

    : 151********@163.com 基于 WINCC 的电梯模拟运行控制系统设计 冯鹏辉 谭兮 郭少校 刘国营 ( 湖南工业大学,湖南 株洲 412008) 摘要: 电梯的运行是电梯与大楼及各 ...

  6. 游戏设计、原型与开发:基于Unity与C#从构思到实现pdf

    下载地址:网盘下载 这是一本将游戏设计理论.原型开发方法以及编程技术巧妙结合在一起的书籍,目的是填补游戏设计与编程开发之间的缺口,将两者联系起来.随着 Unity游戏开发技术趋于成熟,游戏设计师把自己 ...

  7. 在Unity中实现基于粒子的水模拟(二:开始着色)

    在Unity中实现基于粒子的水模拟(二:开始着色) 文章目录 在Unity中实现基于粒子的水模拟(二:开始着色) 前言 一.生成顶点 二.偏移模拟 1.接收细分着色器输出的顶点 2.根据数据调用对应的 ...

  8. 在Unity中实现基于粒子的水模拟(三:混合屏幕)

    在Unity中实现基于粒子的水模拟(三:混合屏幕) 文章目录 在Unity中实现基于粒子的水模拟(三:混合屏幕) 前言 一.着色算法介绍 1.折射 2.反射 二.准备纹理 1.获取纹理 2.模糊纹理 ...

  9. unity游戏开发毕设_《毕业设计(论文)-基于Unity游戏引擎的游戏设计》.doc

    学 号070125分类号本科生毕业论文(设计) 题目: 基于Unity游戏引擎的游戏设计 院(系) 电子与信息工程系专业 计算机科学与技术班级2007级学 生 姓 名指导教师(职称)提 交 时 间 二 ...

最新文章

  1. 设计模式--工厂方法(Factory Method)模式
  2. Java面向对象特征介绍
  3. 一步一步学习iOS 5编程(第三版)-PDF中文版-正式发布!
  4. TJU Problem 2857 Digit Sorting
  5. 15 错误边界与使用技巧
  6. 技术人员如何"正确"的浪费时间?
  7. putty和WinSCP后门检查及清理方式
  8. 二十个方法鼓励自己最有效
  9. html5 jquery音乐播放器,play()和pause()不起作用
  10. EPM连接显示服务器不可用,EPM问题汇总之-SmartView无法连接Essbase
  11. cat3 utp是不是网线_CAT网线品种分类
  12. Qt使用flowlayout,使控件两端间距始终固定,垂直和水平间距相等
  13. 微信 公众号 网页授权登录(静默授权)
  14. 任正非:不要在微信里消耗你的人生和青春
  15. Windows系统保存电脑当前桌面壁纸图片
  16. PyQt5 QLabel改变字体和设置背景图片
  17. DNA甲基化数据分析专题
  18. FXTZ 1.10 小爱使用
  19. 2022年山东省安全员A证考试题库及山东省安全员A证新版试题
  20. Spring MVC 应用中异常处理流程分析 : sendError() vs setStatus()

热门文章

  1. Kotlin编译与Intrinsics检查
  2. 如何修改host文件权限
  3. MySQL初级篇——存储过程、存储函数的相关概念及应用举例
  4. aspose转pdf不显示中文_Word转PDF后有空白页是怎么回事?
  5. 基于WaterDetect的水域面积提取,以长江中上游水面为例
  6. python是垃圾?
  7. vscode VisualStudio区别
  8. 人工智能AI程序设计语言
  9. icloud有linux客户端吗,icloud drive:Windows 版 iCloud 客户端在哪下载
  10. GEE基础-大影像下载