为了在我的游戏中发射抛射物,我在3D空间中设置了一个曲线函数,其中曲线沿着z轴传播,遵循以下公式:
x = this.LinePoints[t - 1].x + xOffset;
y = this.LinePoints[t - 1].y + yOffset;
z = t == 1 ? 0.35f : math.cos(scaleFactor * (t * 0.1f)) * (t * 0.5f);
t从1到40,LinePoints是(x, y)上从起点到终点的直线。
我需要沿着x轴和y轴的组合将曲线从起点传播到终点(保持相同的函数,但要旋转)。如果曲线在(x, y)上
我该怎么做呢?
我们把这个问题分成三个部分:
1。使弹丸跟随LinePoints
很简单。只要把this.LinePoints[t - 1] - this.LinePoints[t - 2]
加到transform.position
就可以了。
void FixedUpdate() {
float xDiff = LinePoints[t - 1].x - LinePoints[t - 2].x;
float yDiff = LinePoints[t - 1].y - LinePoints[t - 2].y;
transform.position += new Vector2(xDiff, yDiff);
t++;
}
2。添加不旋转的z轴曲线
我们需要为z轴曲线定义一个函数,并简单地将其应用于Y轴上。
void FixedUpdate() {
float zDiff = ZFunction(t) - ZFunction(t - 1);
float xDiff = LinePoints[t - 1].x - LinePoints[t - 2].x;
float yDiff = LinePoints[t - 1].y - LinePoints[t - 2].y + zDiff;
transform.position += new Vector2(xDiff, yDiff);
t++;
}
float ZFunction(int t) {
if (t == 1) {
return 0.35f;
}
else {
return Mathf.Cos(scaleFactor * (t * 0.1f)) * (t * 0.5f);
}
}
当起始点和结束点的Y值相同时,这将正常工作。
3。旋转z轴曲线
我们需要先得到点之间的夹角,然后得到以一定角度旋转的X和Y元素。角的X元素为cos(angle)
, Y元素为sin(angle)
。将z函数的值乘以对面的三角函数轴,然后将其添加到位置的顶部。
你可以用Vector2.Angle()
得到角度,只是要记住把它转换成弧度,这样它就可以被Mathf
三角函数吸收了。
void FixedUpdate() {
float angle = Vector2.Angle(startPoint, endPoint) * Mathf.Deg2Rad;
float zDiff = ZFunction(t) - ZFunction(t - 1);
float xDiff = LinePoints[t - 1].x - LinePoints[t - 2].x + zDiff * Mathf.Sin(angle);
float yDiff = LinePoints[t - 1].y - LinePoints[t - 2].y + zDiff * Mathf.Cos(angle);
transform.position += new Vector2(xDiff, yDiff);
t++;
}
float ZFunction(int t) {
if (t == 1) {
return 0.35f;
}
else {
return Mathf.Cos(scaleFactor * (t * 0.1f)) * (t * 0.5f);
}
}
注意:如果您不需要LinePoints
中的特定点,您可能应该放弃数组并动态获取适当的位置。我建议你看看Vector2.Lerp()
,或者最好自己做一下计算。
代码非常粗糙,没有经过测试,所以如果你遇到任何问题,请注释。