游戏开发分享
[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 计算的位置,大家也可以用插值实现,总之实现效果即可,感谢大家观看!