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,我才解决了这个问题

    然而,这只解决了问题的一半。是的,场景现在在加载时淡入,但不会淡出。考虑到它执行的是异步的(同样,我不确定这是否是正确的术语),在运行动画时更改场景会中断。当我解决这个问题时,我也会更新答案

    使现代化 我似乎无法解决淡出部分,因为它需要从初始化的子场景访问父节点。我可以想出一些方法

    第一个是以某种方式参数化“音量控制器”场景。这可以通过多种方式完成,但在最后,当您从另一个场景初始化它时,您需要将其投射到
    音量控制器
    ,我不知道这是否是一种有效的方法。另一个问题是在代码库中对此进行标准化。本文讨论了一种类似的方法

    <