在一个叫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虚拟相机和动画的问题。解决方案如下:
首先,你需要创建一个空物体,命名为Timeline,然后在Timeline上创建一个Timeline组件。
在另一个名为virtualCameraParent的空物体下创建三个空余的子物体,分别命名为play CM vcam2、dini CM vcam3、dor CM vcam4。
在Canvas下创建一个空物体,命名为play,将其设置为Toggle Group。
在空物体play下创建三个Toggle,分别命名为PlayToggle、DiniToggle、DorToggle。
在Timeline上创建一个Cinemachine Track,将主相机赋值给它。
在Timeline上放置三个Cinemachine虚拟相机,并在相应的位置添加动画。
创建一个C#脚本,命名为test,将其附加到一个空物体上。
在脚本中添加以下变量:
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);
}
}
}
然后将脚本绑定到一个空物体上,并将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方法来实现这一点。
你可以看一看博客,是有这方面的回答的