C# AnimationPlayer动画不在Godot中播放 前言
首先,我知道在这个平台上不鼓励发布代码的图形资源。我也会发布代码,但在这个特殊的案例中,我认为发布一个关于它的视频比发布一些任意代码要有用得多,因为游戏项目的结构确实根据他们的需求而变化。但是,我仍然尊重平台的规则,因此如果国防部要求我根据社区规则设置问题格式,我可以这样做,或者他们也可以简单地删除我的问题。我尊重这一点 问题 这实际上是一个简单的问题,但因为它的简单性,它让我发疯。我只想在加载场景时淡入,然后在单击按钮时淡出。至于我是如何做到的 总之,我加载了另一个名为“音量控制器”的场景,其中包含一个带有黑色的C# AnimationPlayer动画不在Godot中播放 前言,c#,godot,C#,Godot,首先,我知道在这个平台上不鼓励发布代码的图形资源。我也会发布代码,但在这个特殊的案例中,我认为发布一个关于它的视频比发布一些任意代码要有用得多,因为游戏项目的结构确实根据他们的需求而变化。但是,我仍然尊重平台的规则,因此如果国防部要求我根据社区规则设置问题格式,我可以这样做,或者他们也可以简单地删除我的问题。我尊重这一点 问题 这实际上是一个简单的问题,但因为它的简单性,它让我发疯。我只想在加载场景时淡入,然后在单击按钮时淡出。至于我是如何做到的 总之,我加载了另一个名为“音量控制器”的场景,其
ColorRect
,以及AnimationPlayer
以更改ColorRect
的alpha值
代码如下,并对相关部分进行了额外注释:
使用Godot;
使用制度;
公共类标题屏幕:控件
{
专用按钮[]按钮;
私有控制音量控制器;//我注入的场景
public override void _Ready()//当标题屏幕准备就绪时
{
GD.打印(“准备标题屏幕…”);
初始化按钮();
InitFader();//初始化fader
FadeIn();//在动画中进行淡入
}
私有void InitFader()//初始化fader
{
GD.打印(“初始化音量控制器…”);
var faderScene=(packedsene)ResourceLoader.Load(“res://components/Fader.tscn“”;//加载外部音量控制器场景
fader=(控制)faderScene.Instance();//实例化场景
fader.SetSize(OS.WindowsSize);//为游戏窗口设置音量控制器场景的大小,以防万一
var rect=(ColorRect)fader.GetNode(“rect”);//从fader场景中获取“rect”子级
rect.SetSize(OS.WindowsSize);//为游戏窗口设置“rect”大小,以防万一
fader.Visible=false;//将可见性设置为false
AddChild(音量控制器);//将初始化的音量控制器场景添加为标题屏幕的子项
}
私有void InitButtons()
{
GD.打印(“初始化按钮…”);
按钮=新按钮[3]{
(按钮)GetNode(“菜单\容器/左菜单\容器/菜单/开始\按钮”),
(按钮)GetNode(“菜单\容器/左菜单\容器/菜单/继续\按钮”),
(按钮)GetNode(“菜单容器/左菜单容器/菜单/退出按钮”),
};
GD.Print(“向按钮添加事件…”);
按钮[0]。连接(“按下”,此“_startName”);
按钮[2]。连接(“按下”,这是“退出游戏”);
}
私人空间
{
GD.打印(“淡入…”);
fader.Visible=true;//将音量控制器的可见性设置为true
var player=(AnimationPlayer)fader.GetNode(“player”);//获取动画播放器
player.Play(“FadeIn”);//播放FadeIn动画
fader.Visible=false;//将音量控制器的可见性设置为false
}
私有无效淡出()
{
//类似于法丹
GD.打印(“淡出…”);
音量控制器。可见=真;
var player=(AnimationPlayer)fader.GetNode(“player”);
播放(“淡出”);
音量控制器。可见=假;
}
public void _StartGame()//每当我单击“开始游戏”按钮时
{
淡出();//淡出
GetTree().ChangeScene(“res://stages/Demo01.tscn");
}
public void _QuitGame()//每当我单击退出游戏按钮时
{
淡出();//淡出
GetTree().Quit();
}
}
好像我什么都看不见。为什么它不会淡入淡出
环境
- 曼哈罗19.0.2
- Mono JIT编译器6.4.0(如果相关)
- 戈多3.2
因此,问题是
Play
对象上的Play
方法类似于异步运行(不知道这是否是正确的术语)
幸运的是,Godot中有一个叫做信号的特性。在AnimationPlayer
对象上有animation\u启动
和animation\u完成
信号。基本上,我为音量控制器场景创建了一个C#脚本,将信号从player
连接到Fader
,如下所示:
至动画\u已启动
\u faderanimation启动
至动画\u已完成
\u FaderAnimationEnd
使用Godot;
使用制度;
公共类音量控制器:控制
{
私有ColorRect;
私人动画播放器;
公共覆盖无效_Ready()
{
GD.打印(“初始化音量控制器…”);
rect=(ColorRect)GetNode(“rect”);
player=(AnimationPlayer)获取节点(“player”);
设置大小(OS.WindowsSize);
矩形设置大小(操作系统窗口大小);
可见=假;
}
私有void\u FaderAnimationStart(字符串anim\u name)
{
可见=真实;
}
私有void\u FaderAnimationEnd(字符串anim\u name)
{
可见=假;
}
}
多亏了’s和’s,我才解决了这个问题
然而,这只解决了问题的一半。是的,场景现在在加载时淡入,但不会淡出。考虑到它执行的是异步的(同样,我不确定这是否是正确的术语),在运行动画时更改场景会中断。当我解决这个问题时,我也会更新答案
使现代化
我似乎无法解决淡出部分,因为它需要从初始化的子场景访问父节点。我可以想出一些方法
第一个是以某种方式参数化“音量控制器”场景。这可以通过多种方式完成,但在最后,当您从另一个场景初始化它时,您需要将其投射到音量控制器
,我不知道这是否是一种有效的方法。另一个问题是在代码库中对此进行标准化。本文讨论了一种类似的方法
<