游戏开发分享

[Godot] C#文本设置及代码自动滚动功能

2025-07-01
2 分钟226 字

Godot 中,我们可以添加 Label 节点来显示文本,在脚本里面设置 Text 可以修改文本信息,这里,我要给大家讲一下我发现的文本换行的问题,以及用 ScrollContainer 节点实现滚动功能,并且用代码实现自动滚动

文本换行

首先,如果字符串在代码内,我们直接设置文本,内容有 \n 是可以换行的的

例如

[Export]
public Label label;     //文本
 
public override void _Ready()
{
    label.Text = "1\n2\n3";
}

如果大家做剧情,用代码读取文件,给 Label 节点设置长文本就会发现, Label 显示的文本没有换行

举个例子,我创建一个名为 text.txt 的文件,内容如下

1\n2\n3\n4\n5

然后我们用代码读取

private string path = "res://Script/text.txt";     //文件路径
 
 
public override void _Ready()
{
    var file = FileAccess.Open(path, FileAccess.ModeFlags.Read);    //读取文件
 
    label.Text = file.GetLine();     //获取行
 
    file.Close();    //关闭文件流
}

然后,运行场景,我们就会发现…

没错, \n 被显示出来了,注意,这里用 \n 转义也是没用的,解决办法就是,使用Replace命令替换文本中的\n即可

string str = file.GetLine();
label.Text = str.Replace("\\n","\n");   //当然,这里\n需要转义一下,不然就读成了换行,转义表示为文本内容

看,这次就正常显示了

滚动条

现在到了我们的重头戏,也就是滚动条,我们将 Label 节点作为滚动条 ScrollContainer 的子节点,各种锚点和大小根据自己的需要进行调整

如果是一大行的文本,没有开自动换行( AutowrapMode ),就会变成水平滚动条,所以我们开启自动换行,并且设置最小值( x )就能使用了

我们可以设置滚动条中的两个属性来设置滚动条的显示,这里给大家截下垂直滚动条

代码实现自动滚动

当我们滚动滚动条的时候,被改变的其实是Scroll中的水平和垂直属性,所以,我们可以写代码来让他自动滚动

大家可以参考我的代码

[Export]
public ScrollContainer scroll;      //滚动面板
 
private float scrollSpeed = 30f;      //滚动速度
private float scrollPos;        //滚动位置
private float stayTime = 3f;     //停留时间
private float stayTimer;    //计时器
private bool back;      //是否反向
 
 
public override void _Ready()
{
    stayTimer = stayTime;       //设置计时器
}
 
public override void _Process(double delta)
    {
        int Max = (int)scroll.GetVScrollBar().MaxValue;     //获取垂直最大值
        stayTimer -= (float)delta;      //计时
 
        if (!back && stayTimer <= 0)        //判断正向以及停留时间结束
        {
            scrollPos = Mathf.MoveToward(scrollPos, Max, scrollSpeed * (float)delta);       //计算位置
 
            if (scroll.ScrollVertical == Max - scroll.Size.Y)        //判断到底,注意,必须减去滚动条的y轴大小
            {
                stayTimer = stayTime;       //重置计时器
                back = true;        //设置反向
            }
        }
        else if (stayTimer <= 0)
        {
            scrollPos = Mathf.MoveToward(scrollPos, 0, scrollSpeed * (float)delta);       //计算位置
 
            if (scroll.ScrollVertical == 0)        //判断到顶
            {
                stayTimer = stayTime;       //重置计时器
                back = false;        //设置正向
            }
        }
 
        scroll.ScrollVertical = (int)scrollPos;     //设置位置
    }

我写的还是比较完善的,包含了 停留 以及 正反向滚动 功能

有一点需要注意,判断是否到底,我们需要用从最大值里面减去滚动面板的大小,否则永远也判断不了滚动面板是否到底

效果展示:

总结

大概就是这样了,如果有需要,大家可以自行更改,我这里是用 MoveToward 计算的位置,大家也可以用插值实现,总之实现效果即可,感谢大家观看!

许可协议: CC BY-SA 4.0 。转载请注明出处,允许商用;改编/转载须以相同许可(CC BY-SA 4.0)发布。如有问题请联系我。