弹丸轨迹/飞行路径

时间:2017-09-12 08:02:26

标签: unity3d

Red is the desired path

我试图制造一个在图中显示为红色的运动行为的抛射物。 我现在知道和拥有的是两个载体;开始和结束。 最终目标是在迭代时使弧的一些随机性和以lerp方式的抛射体速度变化。我以前做过线性运动,但没有这样。

如果我的问题感觉就像要求你为我做我的工作(我通常担心作为新手编码器提出问题)我可以提供一些关于我应该研究哪些方法/命令的提示和提示吗?语言是C#,Unity版本是5.6

编辑#1

在获得一些指导后,我可以获得更接近最终目标函数的东西。

enter image description here

  

蓝色直线仅表示A(起始点)和B(目标)之间的距离和角度。红色弧线是我愿意让我的射弹移动的轨迹。

幸运的是,我想到了我想要引导射弹跟随的路径是一个立方贝塞尔曲线,并在上图中显示的结果中得到了A,B,modA和modB的结果。我需要做更多的事情来实际安装弹丸以遵循这条路径并控制其速度等。以下是我今天无法解决的更多问题。

首先,一般条件是A是固定的而B不是。为了保持通常所需的飞行路径,我想我需要另一条虚拟线B(从modA到modB)来同步lineA的角度和距离,所以当B(目标)在所有方向上移动时,弧是不是太偏斜了,但是在我今天的尝试中,要么我从lineA得到了错误的角度,或者是刚刚围绕A旋转的modA,而且数字很奇怪,就像B从A的直线运动中的角度变化一样。

第二种是在第一次射弹和第二次射击后有一些随机但相似的红弧。当我超越第一个时,我猜这会更容易,因为它只是控制lineB的问题。

编辑#2

解决了上面提到的所有函数:从A到B生成一个路径,其中使用modA和modB制作弧,以及每次迭代时modA和modB的随机性以及根据B&#39调整的modA和modB的实时位置。

现在剩下的就是实际让射弹跟随路径并控制其速度直到达到B.下面是生成弧形路径的代码。我该怎么做呢?

public Transform[] controlPoints = new Transform[4];
public LineRenderer lineRenderer;

private int curveCount = 0;
private int SEGMENT_COUNT = 50;

private void DrawCurve()
{
    for (int j = 0; j < curveCount; j++)
    {
        for (int i = 1; i <= SEGMENT_COUNT; i++)
        {
            float t = i / (float)SEGMENT_COUNT;
            int nodeIndex = j * 3;
            Vector3 pixel = CalculateCubicBezierPoint(
                t,
                controlPoints[nodeIndex].position,
                controlPoints[nodeIndex + 1].position,
                controlPoints[nodeIndex + 2].position,
                controlPoints[nodeIndex + 3].position);

            lineRenderer.positionCount = (((j * SEGMENT_COUNT) + i));
            lineRenderer.SetPosition((j * SEGMENT_COUNT) + (i - 1), pixel);
        }
    }
}

private Vector3 CalculateCubicBezierPoint(float t, Vector3 start, Vector3 modA, Vector3 modB, Vector3 end)
{
    float u = 1 - t;
    float t2 = Mathf.Pow(t, 2);
    float u2 = Mathf.Pow(u, 2);
    float t3 = Mathf.Pow(t, 3);
    float u3 = Mathf.Pow(u, 3);

    Vector3 p = u3 * start;
    p += 3 * u2 * t * modA;
    p += 3 * u * t2 * modB;
    p += t3 * end;

    return p;
}

1 个答案:

答案 0 :(得分:1)

你应该使用AnimationCurve。

您可以在检查器中编辑“图形曲线”(公共变量AnimationCurve),然后使用此srcipt沿路径移动对象。

using UnityEngine;
using System.Collections;

public class AnimationPath : MonoBehaviour 
{
    public AnimationCurve XCurve;

    public float TotalTravelTime = 5.0f;

    public float TravelSpeed = 50.0f;

    public float XRange = 10.0f;

    // Use this for initialization
    void Start () 
    {
        StartCoroutine("Travel");
    }

    IEnumerator Travel()
    {
        float ElapsedTime = 0.0f;

        while(ElapsedTime < TotalTravelTime)
        {
            float XPos = XCurve.Evaluate(ElapsedTime/TotalTravelTime) * XRange;

            transform.position = new Vector3(XPos, transform.position.y, transform.position.z + TravelSpeed * -Time.deltaTime);

            yield return null;

            ElapsedTime += Time.deltaTime;
        }
    }
}

我希望这可以帮到你。