我正在 Unity 中使用 Splines 进行一些实验。我目前已经创建了一条路径,并且我执行了“Spline Animate”脚本,并且该对象正确地遵循该路径。但是,我希望该对象能够更改样条曲线上的旋转方向,以便该对象沿顺时针方向(向前)移动,并使其有可能逆时针(向后)移动 。 ).
我尝试使用“反向样条流”选项,但是,这不是我想要的。使用此选项,对象将以相反方向旋转,但有两个问题。第一个是它将朝着新的旋转方向旋转(因此不是永远不会向后而是仍然向前),第二个是物体在改变旋转方向之前也被重新定位在旋转的起点处。样条线。
最后,我尝试编写一个 C# 脚本,允许对象跟随 Spline 运动,而不使用“Spline Animate”脚本。该脚本通过更改速度,允许您前进或后退(要后退,只需将速度设置为负数)。然而,这个脚本也有一个问题。
沿着样条线的方向,一切正常。当朝相反方向移动时,对象将朝相反方向移动,直到到达样条曲线的第一个点,在那里它将停止并且不再继续前进。
为了完整起见,我附加了运动脚本和屏幕来显示对象到达和停止的样条曲线的起点。 我感谢大家给予我的帮助,我希望我已经说得足够清楚了。 :)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Splines;
using Unity.Mathematics;
public class Motor : MonoBehaviour
{
public SplineContainer spline;
public float speed = 1f;
float distancePercentage = 0f;
float splineLength;
private void Start()
{
splineLength = spline.CalculateLength();
}
void Update()
{
distancePercentage += speed * Time.deltaTime / splineLength;
Vector3 currentPosition = spline.EvaluatePosition(distancePercentage);
transform.position = currentPosition;
if (distancePercentage > 1f)
{
distancePercentage = 0f;
}
Vector3 nextPosition = spline.EvaluatePosition(distancePercentage - 0.05f);
Vector3 direction = currentPosition - nextPosition;
transform.rotation = Quaternion.LookRotation(direction, transform.up);
}
}
我在本地制作了一个小示例项目,据我了解,这应该可以解决您的问题:
void Update()
{
distancePercentage += speed * Time.deltaTime / splineLength;
//the 'fix'
float splinePos = Mathf.Repeat(distancePercentage, 1f);
Vector3 currentPosition = spline.EvaluatePosition(splinePos);
transform.position = currentPosition;
Vector3 nextPosition = spline.EvaluatePosition(splinePos - 0.05f);
Vector3 direction = currentPosition - nextPosition;
transform.rotation = Quaternion.LookRotation(direction, transform.up);
}
在您的代码中,当速度为负值时, distancePercentage 最终将低于零,并且样条线似乎将该值限制为零。这个额外的 if 语句可能可以解决这个问题:
if (distancePercentage < 0f)
{
distancePercentage = 1f;
}
但是 Mathf.Repeat 将实现这一目标,并且在我看来比有 2 个 if 更干净一些
最后不确定我是否理解轮换要求 - 从视觉上看,我的本地副本似乎工作得很好