Unity3D模拟导弹轨迹的简单方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuming2016/article/details/62226636

       真实的导弹的轨迹是一个开口向下的抛物线,并且导弹是以速度越来越快的匀加速运动到目标点。要做仿真的话,确实需要这样的去实现。然而有些类型的游戏,要求没那么高。只要做到运动到起点和目标点之间的最高点,然后往目标点冲过去即可。这种效果虽然不真实,但在距离摄像机比较远的情况下是可以接受。最关键是简单,性价比高。以下是实现代码。代码随便写的,比较粗糙,仅供交流学习用。直接用到项目中被主程发现被喷了可别怪我:)

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;    

        }
    }

}


猜你喜欢

转载自blog.csdn.net/wuming2016/article/details/62226636