使用C#对Godot属性进行改写(其实是覆盖)

就以改写Label.text的运作方式为例……

Godot源码是C++的,GDScript里面怎么做的封装我不太清楚,但总之只剩下了text属性变量,因为GDScript并不允许对属性重定义,所以不能用setget来指定setter和getter函数(因为文档规定setget只能在var声明句中使用,但GDScript的语法又不让重声明,至少不能再次声明同名的属性)。

不过在C++的源码中,Godot实际上是有set_text和get_text的,而且这两个函数被表述为public,所以就很迷……

// setter
void Label::set_text(const String &p_string) {
if (text == p_string) {
return;
}
text = p_string;
xl_text = tr(p_string);
dirty = true;
if (percent_visible < 1) {
visible_chars = get_total_character_count() * percent_visible;
}
update();
}
// getter
String Label::get_text() const {
return text;
}
至于为什么在GDScript里没了,可能是跟某种绑定机制有关,不过这个改天再看看。

不过用C#脚本的话,情况就不一样了,因为在C#里对应的Label.Text就是C#概念下的Property,而且由于C++源码里是public(事实上也必须是,因为这东西可改),所以Label里的绑定多半写的也肯定是:

public class Label : Control
{
//…
public string Text { get{//} set{//} }
//…
}
本来我想用override把原来版本的Text属性直接推翻重写,不过因为Label.Text并非virtual所以我不能推翻,只能强制隐藏……

public class MyLabel : Label
{
public new String Text
{
get {//}
set {//}
}
//…
}
不过另外一个问题来了,getter和setter怎么重写的问题……

本来傻fufu的想直接对新的Text做手脚结果运行的时候Godot调试器直接卡崩溃了……

报错告诉我内存空间爆了,那估计是被当成无尽递归闹得,于是我就改成了给父类捆绑的方式……

public class MyLabel : Label
{
public new String Text
{
get => base.Text;
set
{
// …
base.Text = value;
// …
}
}
//…
}
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值