您的位置:首页 > 移动开发 > Unity3D

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;

}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐