我是靠谱客的博主 欣喜冥王星,最近开发中收集的这篇文章主要介绍使用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

最后

以上就是欣喜冥王星为你收集整理的使用C#对Godot属性进行改写(其实是覆盖)的全部内容,希望文章能够帮你解决使用C#对Godot属性进行改写(其实是覆盖)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部