gpt4 book ai didi

unity3d - 弹道/飞行路径

转载 作者:行者123 更新时间:2023-12-01 09:59:09 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com