改变物体的旋转方向

问题描述 投票:0回答:1

我正在 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);
    }
}

c# unity-game-engine spline
1个回答
0
投票

我在本地制作了一个小示例项目,据我了解,这应该可以解决您的问题:

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 更干净一些

最后不确定我是否理解轮换要求 - 从视觉上看,我的本地副本似乎工作得很好

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.