如何允许点补间在同一个游戏对象正在运行时启动补间

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

我正在尝试弄清楚如何在点已经发生的情况下开始并合并在一起。

[System.Serializable]
public class CameraSettings
{
    public GameObject CameraFollow;
    public CamerasProperties[] camerasProperties;
    public bool flightMode;
    public float flightSpeed;
    public float timer;
}
[System.Serializable]
public class CamerasProperties
{
    public GameObject Camera;
    public float timeToTravel;
    public Ease easeType;
    public float pauseBefore;
}
public CameraSettings cameraSettings;
GameObject cameraToMove;
private void Start()
{
    cameraToMove = GameObject.FindGameObjectWithTag("MainCam").gameObject;
    StartCoroutine(DoCameraStuff());
}
int currentNum = 0;
IEnumerator DoCameraStuff()
{
    if (currentNum <= cameraSettings.camerasProperties.Length)
    {
        CamerasProperties cameraProp = cameraSettings.camerasProperties[currentNum];
        yield return new WaitForSeconds(cameraProp.pauseBefore);

        // Create a sequence for the camera movement
        cameraToMove.transform.DOMove(cameraProp.Camera.transform.position, cameraProp.timeToTravel).SetEase(cameraProp.easeType);
        cameraToMove.transform.DORotateQuaternion(cameraProp.Camera.transform.rotation, cameraProp.timeToTravel).SetEase(cameraProp.easeType);

        currentNum++;
        StartCoroutine(DoCameraStuff());
    }
}

代码如上。

我尝试使用序列,但没有成功。 我如何使用 DOTween 使补间在开始时继续

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

我对我认为该功能应该做什么做了最好的猜测,您确实可以使用序列来解决您的问题并稍微简化代码。我在本地计算机上使用了这段代码,它按预期工作。即使它不能完全解决您的问题,但希望它是如何在代码中使用序列的一个很好的示例。

要让事情按顺序同时发生(例如示例中的“移动”和“旋转”),您必须首先

Append
某件事,然后
Join
任何其他补间,它们将同时发生。最后不要忘记实际开始序列
sequence.Play();

private void Start()
{
    cameraToMove = Camera.main.gameObject;
    DoCameraStuff();
}

void DoCameraStuff()
{
    Sequence sequence = DOTween.Sequence();
    for (int i = 0; i < cameraSettings.camerasProperties.Length; i++)
    {
        CamerasProperties cameraProp = cameraSettings.camerasProperties[i];

        sequence.AppendInterval(cameraProp.pauseBefore);

        sequence.Append(cameraToMove.transform.DOMove(cameraProp.Camera.transform.position, cameraProp.timeToTravel)
            .SetEase(cameraProp.easeType));
        
        sequence.Join(cameraToMove.transform.DORotateQuaternion(cameraProp.Camera.transform.rotation, cameraProp.timeToTravel)
            .SetEase(cameraProp.easeType));
    }

    sequence.OnComplete(() =>
    {
        //on complete logic
        CameraStuffComplete("SEQUENCE COMPLETED");
    });
    sequence.Play();
}

void CameraStuffComplete(string message)
{
    Debug.Log(message);
}
© www.soinside.com 2019 - 2024. All rights reserved.