网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月16日漏签0天
godot吧 关注:8,727贴子:39,725
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 7回复贴,共1页
<<返回godot吧
>0< 加载中...

GDScript小技巧——私有字段/访问限制

  • 只看楼主
  • 收藏

  • 回复
  • fang_chu
  • 数学算法
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
本实现的核心方法是get_stack,
使用get_stack方法来获取堆栈信息从而确认调用者,然后判断调用者
并使用assert来阻断访问


  • fang_chu
  • 数学算法
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先来看一下完整版代码,然后我们来理一下思路


2025-07-16 06:52:32
广告
  • fang_chu
  • 数学算法
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上面的代码中,实现了类似 C井 的{ get; private set; }访问器
member属性是一个暴露在外的属性,它是只读的,用于外部访问_member属性的值,但是不允许设置member属性的值,member属性的setter会直接截断并抛出异常


  • fang_chu
  • 数学算法
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
member属性的值,无论是外部还是内部都无法设置值,因为它没有实现像_member属性那样的访问器
接下来细说_member属性的访问器


  • fang_chu
  • 数学算法
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先说一下,这个实现看看就行,因为如果调用链很长,遍历堆栈非常吃性能


  • fang_chu
  • 数学算法
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先来看getter

第11行,获取调用到该getter的堆栈信息,它将返回一个字典数组,差不多是这个样子的:
内部调用:
[{ "source": "res://Scripts/script.gd", "function": "@_member_setter", "line": 23 }, { "source": "res://Scripts/script.gd", "function": "_ready", "line": 37 }]
外部调用:
[{ "source": "res://Scripts/script.gd", "function": "@_member_getter", "line": 11 }, { "source": "res://Scripts/script.gd", "function": "@member_getter", "line": 5 }, { "source": "res://Scripts/new_script.gd", "function": "_ready", "line": 5 }]
我们可以先看看不同,会在之后的判断部分详细说明
第12行,定义一个标志,用来判断当前的调用者,是外部亦或是内部
第13行,遍历获取到的堆栈信息
第14行和第18行都是判断部分。
我们看回之前获取到的堆栈信息,我们可以发现,内部调用时"source"字段始终指向当前脚本,而外部调用时则包含调用者脚本,因此,我们就有了第14行的判断。
使用get_script().resource_path来获取当前的脚本路径,如果"source"字段不是当前脚本则标记为外部调用。
而第17行,添加了一个条件,如果堆栈信息中的"function"字段包含指定函数则结束遍历,即允许访问。而这里的"@member_getter"则是member属性的getter,也就是说,这里是允许通过member属性来访问_member属性
第19行则是根据标志来截断抛出异常,如果allow_access为false则截断,否则正常返回。


  • fang_chu
  • 数学算法
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

setter也是一样的逻辑,这里删去了特定函数的判断,也就是表示不允许外部修改值,
然后将getter的返回改成了setter应有的赋值


  • z3396591
  • 界面设计
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
注意:只有在运行的实例连接到调试服务器(即编辑器实例)后,该函数才有效。get_stack() 不适用于以发布模式导出的项目;或者在未连接到调试服务器的情况下,以调试模式导出的项目。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 7回复贴,共1页
<<返回godot吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示