点击Toggle启动Timeline\Cinemachine

在一个叫Timeline的空物体下创建了一个Timeline,一个叫virtualCameraParent的空物体下有三个虚拟相机,分别叫play CM vcam2、dini CM vcam3、dor CM vcam4,画布下有一个play的空物体(Toggle Group)下有三个Toggle,分别叫PlayToggle、DiniToggle、DorToggle。
Timeline上面有一条Cinemachine Track,把主相机赋给了它,轨道上分别放置了三个虚拟相机,还有三条Animation Track,在对应的虚拟相机位置上分别做了动画。
想要实现的功能:分别点击不同的Toggle,启动Timeline上不同的虚拟相机和动画

using UnityEngine;
using UnityEngine.Playables;
using Cinemachine;
using UnityEngine.Timeline;

public class test : MonoBehaviour
{
    public PlayableDirector timeline; // Timeline 的 PlayableDirector 组件
    public GameObject virtualCameraParent; // 虚拟相机的父对象

    public void PlayToggle()
    {
        PlayVirtualCamera("play"); // 触发 play 相机和动画
        timeline.Play(); // 播放 Timeline
    }

    public void DiniToggle()
    {
        PlayVirtualCamera("dini"); // 触发 dini 相机和动画
        timeline.Play();
    }

    public void DorToggle()
    {
        PlayVirtualCamera("dor"); // 触发 dor 相机和动画
        timeline.Play();
    }

    private void PlayVirtualCamera(string name)
    {
        // 获取虚拟相机
        CinemachineVirtualCamera virtualCamera = virtualCameraParent.transform.Find(name).GetComponent<CinemachineVirtualCamera>();


        // 设置当前的虚拟相机为激活状态
        virtualCamera.gameObject.SetActive(true);

        // 关闭其他相机
        foreach (Transform child in virtualCameraParent.transform)
        {
            if (child.name != name)
            {
                child.gameObject.SetActive(false);
            }
        }
    }
}


引用chatgpt内容作答:
在下面修改后的代码中,我直接在脚本中引用了 Timeline 上的各个虚拟相机(playVcam、diniVcam、dorVcam)。每个 Toggle 点击事件都会调用 SwitchVirtualCamera() 方法,根据所选的相机,将其他相机禁用,并激活选定的相机。然后通过 timeline.Play() 来播放 Timeline。

using UnityEngine;
using UnityEngine.Playables;
using Cinemachine;
using UnityEngine.Timeline;

public class Test : MonoBehaviour
{
    public PlayableDirector timeline; // Timeline 的 PlayableDirector 组件
    public CinemachineVirtualCamera playVcam; // 对应 play 相机
    public CinemachineVirtualCamera diniVcam; // 对应 dini 相机
    public CinemachineVirtualCamera dorVcam; // 对应 dor 相机

    public void PlayToggle()
    {
        SwitchVirtualCamera(playVcam);
        timeline.Play(); // 播放 Timeline
    }

    public void DiniToggle()
    {
        SwitchVirtualCamera(diniVcam);
        timeline.Play();
    }

    public void DorToggle()
    {
        SwitchVirtualCamera(dorVcam);
        timeline.Play();
    }

    private void SwitchVirtualCamera(CinemachineVirtualCamera vcam)
    {
        // 禁用所有虚拟相机
        playVcam.gameObject.SetActive(false);
        diniVcam.gameObject.SetActive(false);
        dorVcam.gameObject.SetActive(false);

        // 激活指定的虚拟相机
        vcam.gameObject.SetActive(true);
    }
}

要使这段代码正常工作,确保你已经将对应的虚拟相机分配到脚本中的相应字段中,并将该脚本附加到适当的游戏对象上。此外,确保 Timeline 中的相机轨道上正确配置了这些虚拟相机。

要不把关闭虚拟相机提前一下试试?你在PlayVirtualCamera()这个函数调用的时候,每次你都先关闭一下所有的相机,再执行你后面的步骤试试。
就是在你代码的30行和31行这里,新增一个关闭相机的操作:

// 关闭所有相机的操作
foreach (Transform child in virtualCameraParent.transform)
{
  child.gameObject.SetActive(false);
}

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

【以下回答由 GPT 生成】

这是一个通过点击Toggle来启动Timeline和Cinemachine虚拟相机和动画的问题。解决方案如下:

  1. 首先,你需要创建一个空物体,命名为Timeline,然后在Timeline上创建一个Timeline组件。

  2. 在另一个名为virtualCameraParent的空物体下创建三个空余的子物体,分别命名为play CM vcam2、dini CM vcam3、dor CM vcam4。

  3. 在Canvas下创建一个空物体,命名为play,将其设置为Toggle Group。

  4. 在空物体play下创建三个Toggle,分别命名为PlayToggle、DiniToggle、DorToggle。

  5. 在Timeline上创建一个Cinemachine Track,将主相机赋值给它。

  6. 在Timeline上放置三个Cinemachine虚拟相机,并在相应的位置添加动画。

  7. 创建一个C#脚本,命名为test,将其附加到一个空物体上。

  8. 在脚本中添加以下变量:

using UnityEngine;
using UnityEngine.Playables;
using Cinemachine;
using UnityEngine.Timeline;

public class test : MonoBehaviour
{
    public PlayableDirector timeline; // Timeline 的 PlayableDirector 组件
    public GameObject virtualCameraParent; // 虚拟相机的父对象
}
  1. 在脚本中添加以下方法:
public void PlayToggle()
{
    PlayVirtualCamera("play"); // 触发 play 相机和动画
    timeline.Play(); // 播放 Timeline
}

public void DiniToggle()
{
    PlayVirtualCamera("dini"); // 触发 dini 相机和动画
    timeline.Play();
}

public void DorToggle()
{
    PlayVirtualCamera("dor"); // 触发 dor 相机和动画
    timeline.Play();
}

private void PlayVirtualCamera(string name)
{
    // 获取虚拟相机
    CinemachineVirtualCamera virtualCamera = virtualCameraParent.transform.Find(name).GetComponent<CinemachineVirtualCamera>();

    // 设置当前的虚拟相机为激活状态
    virtualCamera.gameObject.SetActive(true);

    // 关闭其他相机
    foreach (Transform child in virtualCameraParent.transform)
    {
        if (child.name != name)
        {
            child.gameObject.SetActive(false);
        }
    }
}

然后将脚本绑定到一个空物体上,并将timeline和virtualCameraParent字段分别拖拽到脚本组件的对应位置。

在PlayToggle、DiniToggle和DorToggle方法中,首先调用PlayVirtualCamera方法,根据传入的参数来设置虚拟相机的激活状态。然后通过调用timeline.Play方法来播放Timeline。

在PlayVirtualCamera方法中,首先通过Find方法从虚拟相机父对象中获取相应的虚拟相机组件。然后将当前的虚拟相机设置为激活状态,关闭其他虚拟相机。

这样,当点击不同的Toggle时,就会触发对应的虚拟相机和动画,并播放Timeline。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

Timeline与Cinemachine结合教程
可以参考下
https://zhuanlan.zhihu.com/p/615782244
https://blog.51cto.com/u_5746184/6215595

可以创建一个函数,用于在点击时切换相机的状态,使用Unity的SetActive方法来实现这一点。这样,每个Toggle都关联了一个特定的Timeline轨道。当点击Toggle时,对应的Timeline轨道将被播放。
然后,你需要在你的Timeline脚本中为每个轨道创建一个函数,用于控制动画的播放。可以使用AddTrackClip方法来实现这一点。

如何在Timeline中使用Cinemachine?_大智_Unity玩家的博客-CSDN博客 摘要:游戏中的过场动画中经常有大量镜头的切换,使用Cinemachine可以大大简化镜头的制作。洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。今天小新要给你分享的问题是:如何在Timeline中使用Cinemachine?Cinemachine很容易和Timeline结合使用,比直接使用相机动画制作镜头更容易。使用Timeline可..._cinemachine https://blog.csdn.net/zhenghongzhi6/article/details/105908836/?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%82%B9%E5%87%BBToggle%E5%90%AF%E5%8A%A8Timeline%5CCinemachine&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-105908836.142^v93^chatsearchT3_2&spm=1018.2226.3001.4187

你可以看一看博客,是有这方面的回答的