unity3d - 弹道/飞行路径

标签 unity3d

Red is the desired path

我正在尝试制作一个运动行为在图中显示为红色的弹丸。
我现在知道和拥有的是两个向量;开始和结束。
最终目标是在迭代时使弧线具有一些随机性,并以 lerp 方式改变射弹速度。我以前做过几代线性运动,但没有这样的。

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

编辑#1

在获得一些头部方向之后,我可以实现更接近最终目标功能的东西。

enter image description here

Blue linear line is just representation of distance and angle between A(initiation point) and B(target). The red arc is the trajectory I'm willing to make my projectile to move as.



幸运的是,我认为我想要引导弹丸遵循的路径是三次贝塞尔曲线,并在上图中显示的编辑器中得到了 A、B、modA 和 modB 的结果。我还需要做一些事情来实际安装弹丸以遵循这条路径并控制它的速度等等。以下是我今天无法解决的更多问题。

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

其次是在第一次射弹发射后和下一次发射后有一些随机但相似的红色弧线。我猜当我通过第一个时这会更容易一些,因为这只是控制 lineB 的问题。

编辑#2

上面提到的所有函数都解决了:从 A 到 B 生成一条路径,弧由 modA 和 modB 以及 modA 和 modB 在每次迭代中的随机性以及 modA 和 modB 根据 B 的位置实时调整。

现在剩下的就是让弹丸真正跟随路径并控制它的速度直到到达 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;
}

最佳答案

您应该使用 AnimationCurve。

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

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;
        }
    }
}

我希望这可以帮助你。

关于unity3d - 弹道/飞行路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46171048/

相关文章:

android - 带有适用于AR的Google Play服务更新的初始屏幕后,Unity Android应用程序崩溃(2020年4月11日之后)

c# - 覆盖Unity中的标准关闭按钮

c# - 如何使用agora.io Unity SDK获取 channel 用户列表

unity3d - 如何加载同名的 Assets ,但放置在assetbundle的不同文件夹中?

c# - Unity3d 在将脚本附加到游戏对象时做一些事情

c# - 不要破坏负载

unity3d - 如何在 Unity 中为桌面 VR 应用逐帧显示 360 度视频?

c# - "Is there any way to access a pixel by in an image by particular position like(x,y) in opencvforunity"

c# - Unity Engine - 通过碰撞实例化预制件

c# - 如何实现 Struct 用作​​字典键