我正在 Unity 中使用 Splines 进行一些实验。我目前已经创建了一条路径,并且执行了“Spline Animate”脚本,并且该对象正确地遵循该路径。但是,我希望该对象能够更改样条曲线上的旋转方向,以便该对象沿顺时针方向(向前)移动,并使其有可能逆时针(向后)移动 。 ).
我尝试使用“Reverse Spline Flow”选项,但这不是我想要的,因为使用此选项,对象将以相反的方向旋转,但有两个问题,第一个是它将朝新的旋转方向(因此不是永远不会向后,而是仍然向前),第二个问题是,在更改旋转方向之前,对象也会重新定位在样条曲线的起点。 最后,我尝试编写一个 C# 脚本,允许对象跟随样条线而不使用“样条线动画”脚本。该脚本通过更改速度,允许您前进或后退(要后退,只需将速度设置为负数)。然而,这个脚本有一个问题,沿着样条线的方向,一切正常,而在相反的方向上,对象将沿着相反的方向前进,直到它到达样条线的第一个点,在那里它将停止并且不会继续进一步。 为了完整起见,我附加了运动脚本和一个屏幕来显示对象到达和停止的样条曲线的起点。 我感谢大家给予我的帮助,我希望我已经说得足够清楚了。 :)
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 更干净一些
最后不确定我是否理解轮换要求 - 从视觉上看,我的本地副本似乎工作得很好