留个档,Unity,C#,物理抛物线计算公式,经常用一直百度公式烦死了,留个档

不是数学里的对称抛物线,是根据 加速度公式 s=v0t + 1/2vt平方,
算Y轴和X轴位移, 看起来更像物理抛物线

    [SerializeField] Transform m_trans = null;
    [SerializeField] float m_nV0 = 10;
    [SerializeField] Vector3 m_v3Dir = Vector3.zero;

    [SerializeField] float m_nGForce = -9;  // 重力加速度
    [SerializeField] float m_nBackForce = -9;   // 前进阻力减速度

    private float m_nV0z = 0;
    private float m_nV0y = 0;

    private float m_nLastZ = 0;
    private bool m_isPlay = false;
    private float m_nTime = 0;

    private void ReadyData()
    {
        // 向量斜边长
        Vector3 v3Dir = m_v3Dir.normalized;
        float z = Mathf.Abs(v3Dir.z);
        float y = Mathf.Abs(v3Dir.y);
        float nCrossLen = Mathf.Sqrt(z * z + y * y);

        // 初速度分量;
        m_nV0y = y * m_nV0 / nCrossLen;
        m_nV0z = z * m_nV0 / nCrossLen;
    }

    private Vector3 MathPos(float nTime)
    {
        Vector3 result = Vector3.zero;
        result.y = m_nV0y * nTime + (m_nGForce * nTime * nTime) * 0.5f;
        float nZPos = m_nV0z * nTime + (m_nBackForce * nTime * nTime) * 0.5f;
        if (nZPos < m_nLastZ)
        {
            nZPos = m_nLastZ;
        }
        m_nLastZ = result.z = nZPos;
        return result;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            ReadyData();
            m_isPlay = true;
            m_nTime = 0;
            m_nLastZ = 0;
            m_trans.localPosition = Vector3.zero;
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            m_isPlay = false;
        }
        if (m_isPlay)
        {
            m_trans.localPosition = MathPos(m_nTime);
            m_nTime += Time.deltaTime;
        }
    }

程序学无止尽。
欢迎大家沟通,有啥不明确的,或者不对的,也可以和我私聊
我的QQ 334524067 神一般的狄狄

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Unity中使用LineRenderer绘制抛物线,可以按照以下步骤进行操作: 1. 首先,在Hierarchy视图中创建一个空的GameObject,将其命名为“Projectile”。 2. 将LineRenderer组件添加到Projectile对象上。可以在Inspector视图中设置LineRenderer的颜色、宽度等属性。 3. 创建一个C#脚本,并将其添加到Projectile对象上。在脚本中,定义一个公共变量speed,表示抛出物体的速度。 4. 在脚本中添加Update函数,并在其中计算抛物线的点坐标。可以使用公式x = v0 * t * cos(a)和y = v0 * t * sin(a) - 0.5 * g * t * t来计算点坐标,其中v0表示初速度,a表示抛出角度,g表示重力加速度,t表示时间。 5. 将计算出的点坐标添加到LineRenderer中,以绘制抛物线。 下面是一个简单的示例代码: ```csharp using UnityEngine; public class Projectile : MonoBehaviour { public float speed = 10f; public int numPoints = 50; public float angle = 45f; public float gravity = 9.81f; private LineRenderer lineRenderer; void Start() { lineRenderer = GetComponent<LineRenderer>(); lineRenderer.positionCount = numPoints; } void Update() { float radianAngle = angle * Mathf.PI / 180f; float v0x = speed * Mathf.Cos(radianAngle); float v0y = speed * Mathf.Sin(radianAngle); float tFlight = (2f * v0y) / gravity; for (int i = 0; i < numPoints; i++) { float t = Mathf.Lerp(0f, tFlight, (float)i / (float)numPoints); float x = v0x * t; float y = v0y * t - 0.5f * gravity * t * t; lineRenderer.SetPosition(i, new Vector3(x, y, 0f)); } } } ``` 将该脚本添加到Projectile对象上,然后在Inspector视图中设置speed、numPoints、angle和gravity等属性,即可在Scene视图中看到绘制的抛物线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值