Unity3D模拟导弹轨迹的简单方法
2017-03-15 15:32
357 查看
真实的导弹的轨迹是一个开口向下的抛物线,并且导弹是以速度越来越快的匀加速运动到目标点。要做仿真的话,确实需要这样的去实现。然而有些类型的游戏,要求没那么高。只要做到运动到起点和目标点之间的最高点,然后往目标点冲过去即可。这种效果虽然不真实,但在距离摄像机比较远的情况下是可以接受。最关键是简单,性价比高。以下是实现代码。代码随便写的,比较粗糙,仅供交流学习用。直接用到项目中被主程发现被喷了可别怪我:)
using UnityEngine; using System.Collections; /// <summary> /// 导弹运动脚本. /// </summary> public class Missile_Test_1 : MonoBehaviour { //目标对象 public GameObject m_target = null; //最高点的y的偏移量 public float m_offsetY = 3f; //速度 public float m_speed = 5f; //最高点 private Vector3 m_maxHightPoint = Vector3.zero; //移动向量 private Vector3 m_movement = Vector3.zero; //目标距离 private float m_distance = 0f; private float m_nearDistance = 1f; //是否抵达到最高点 private bool m_isArrivedMaxHightPoint = false; //是否抵达到目标点 private bool m_isArrivedTarget = false; void Start() { //计算最高点 m_maxHightPoint = m_target.transform.position - transform.position; Debug.Log(m_maxHightPoint); m_maxHightPoint = m_maxHightPoint * 0.5f; Debug.Log(m_maxHightPoint); m_maxHightPoint += transform.position; Debug.Log(m_maxHightPoint); m_maxHightPoint.y = m_maxHightPoint.y + m_offsetY; Debug.Log(m_maxHightPoint); transform.LookAt(m_maxHightPoint); //GameObject go = GameObject.CreatePrimitive(PrimitiveType.Sphere); //go.transform.position = m_hightPoint; } void FixedUpdate() { if (m_isArrivedMaxHightPoint && m_isArrivedTarget) { return; } //如果没有抵达最高点,那么持续往最高点移动 if (!m_isArrivedMaxHightPoint) { m_distance = (m_maxHightPoint - transform.position).magnitude; if (m_distance <= m_nearDistance) { m_isArrivedMaxHightPoint = true; return; } m_movement = (m_maxHightPoint - transform.position).normalized; m_movement *= m_speed; m_movement *= Time.fixedDeltaTime; transform.LookAt(transform.position += m_movement); transform.position += m_movement; } //如果抵达最高点,并且没有达到目标点,那么持续往目标点移动 if ((!m_isArrivedTarget) && (m_isArrivedMaxHightPoint)) { m_distance = (m_target.transform.position - transform.position).magnitude; if (m_distance <= m_nearDistance) { m_isArrivedTarget = true; return; } m_movement = (m_target.transform.position - transform.position).normalized; m_movement *= m_speed; m_movement *= Time.fixedDeltaTime; transform.LookAt(transform.position += m_movement); transform.position += m_movement; } } }
相关文章推荐
- 调试方法-Unity3D对各个target平台的模拟
- 简单模拟ArrayList的一些方法
- 简单ioc模拟-使用工厂方法
- 使用json-server简单完成CRUD模拟后台数据的方法
- 在 Linux 上简单模拟系统负载的方法 | Linux 中国
- JavaScript一点也不简单—实现“跨Frame的层模拟菜单”的方法(译文)
- hibernate之简单模拟hibernate的save方法
- Unity3d插件]EasyTouch简单使用方法
- c#模拟js escape方法的简单实例
- java中Vector集合方法详解及简单的银行系统功能模拟
- Unity3D 单例实现方法(方便简单)
- java-第十三章-类的无参方法(一)-模拟一个简单的购房商贷月供计算器
- Qt HTTP网络相关GET,POST(HTTP 模拟POST 表单(multipartform)最简单和正式的方法)
- Android模拟内存紧张,应用被杀死如何模拟应用程序被杀掉? 更新:Daniel Lew指出,最简单的方法是在DDMS中点击”Stop Porcess”杀掉你的程序,在你调试程序的时候可以这样做。
- oracle RMAN模拟数据文件丢失简单恢复方法
- 编写Java程序,模拟简单的计算器。 定义名为Number的类,其中有两个整型数据成员n1和n2,应声明为私有。 编写构造方法,用于初始化n1和n2,再为该类定义 加(addition)、 减(su
- JS简单模拟触发按钮点击功能的方法
- java简单实现双色球彩票模拟实例(数组、排序、方法、随机数、键盘输入)
- 模拟按Home键退出应用的简单方法(分享)
- 【练习题】构造方法 编写Java程序,模拟简单的计算器。