【发布时间】:2017-09-12 08:02:26
【问题描述】:
我正在尝试制作一个运动行为在图中显示为红色的射弹。 我现在知道和拥有的是两个向量;开始和结束。 最终目标是在迭代时使弧线具有一些随机性,并以 lerp 方式改变射弹速度。我以前做过几代线性运动,但没有这样的。
如果我的问题感觉像是要求您为我做我的工作(我通常害怕作为新手编码员提出问题),我能否就我应该研究哪些方法/命令提供一些提示和提示?语言为 C#,Unity 版本为 5.6
编辑#1
在获得一些头部方向之后,我可以实现更接近最终目标功能的东西。
蓝色直线只是表示 A(起始点)和 B(目标)之间的距离和角度。红色弧线是我愿意让我的弹丸移动的轨迹。
幸运的是,我认为我想要引导弹丸遵循的路径是三次贝塞尔曲线,并在上图中显示的编辑器中得到了 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;
}
【问题讨论】:
-
看起来您不希望它基于物理。只是随机的?无论如何,添加您尝试过的内容会很好。提示:生成随机路径并将它们放入列表中然后迭代它们
-
没错。我把它当作一个向量数学类型的问题。红色弧线是我希望以类似方式进行的运动行为的示例类型。
-
@Programmer 所以,我应该先单独生成一个路径,然后让对象跟着它走吧?我现在就开始调查!谢谢。
-
是的,这就是我在第一条评论中告诉你的。您必须根据我在第一条评论中尝试过的内容以及是否存在问题来修改您的问题。
-
@Programmer 你能看看我的编辑吗?我已经完成了一些事情,还有更多问题。
标签: unity3d