## 第 3 节附加:变量作用域(新手只要懂这两种)
##
## "作用域" = 一个变量"在哪一段代码里能用"。
## 新手只需要分清两种就够了:
## 1. 脚本级变量(成员变量):整个脚本都能用
## 2. 函数局部变量:只在它所在的那个函数里能用
##
## 把脚本挂到任意 Node 上,F6 运行,对照控制台输出和注释看。
extends Node
# =========================================================
# 这里是"脚本级变量"区域
# ---------------------------------------------------------
# 写在所有函数外面(注意没有缩进),整个脚本里的任何函数都能读和改它。
# 通常用来存"这个角色一直要用到的数据",比如血量、金币、等级。
# =========================================================
var player_hp: int = 100
var gold: int = 0
func _ready() -> void:
demo_script_level()
demo_local_variable()
demo_function_cant_see_local()
demo_parameter_is_local()
demo_shadow()
# =========================================================
# 演示 1:脚本级变量在任何函数里都能访问
# =========================================================
func demo_script_level() -> void:
print("--- 1. 脚本级变量 ---")
print("初始血量:", player_hp) # 能读
player_hp -= 20 # 能改
print("受伤后血量:", player_hp)
add_gold() # 调用另一个函数也能改 gold
print("拾取金币后:gold = ", gold)
# 另一个函数:照样能看到 gold,因为 gold 是脚本级的
func add_gold() -> void:
gold += 50
# =========================================================
# 演示 2:函数里声明的变量 = 局部变量
# ---------------------------------------------------------
# 写在函数缩进里的 var,只在这个函数内部能用。
# 函数一旦执行完,这个变量就"消失"了。
# 不同的函数可以在内部起相同的变量名称,互不影响,相当于1班有个小明,2班也有个小明,是两个不同的人,分属不同的班级,但是同一个函数内不能起两个相同名字的变量
#=========================================================
func demo_local_variable() -> void:
print("\n--- 2. 局部变量 ---")
var damage: int = 30 # ← 局部变量,只在本函数里有效
var crit: bool = true # ← 同上
print("本次伤害:", damage, " 暴击:", crit)
# 函数结束后,damage 和 crit 就不存在了
# =========================================================
# 演示 3:别的函数看不到这里的局部变量
# ---------------------------------------------------------
# 这是新手最常踩的坑:以为在 A 函数里定义的变量,B 函数也能直接用。
# =========================================================
func demo_function_cant_see_local() -> void:
print("\n--- 3. 局部变量出不了函数 ---")
var secret: String = "我只在这个函数里存在"
print("本函数内可以读:", secret)
try_read_secret()
# 如果你在 try_read_secret 里写 print(secret),会直接报错。
func try_read_secret() -> void:
# 这里看不到 demo_function_cant_see_local 里的 secret
# 下面这行如果取消注释,编辑器会立刻飘红:
# print(secret) # ❌ Identifier "secret" not declared
print("另一个函数读不到上面的 secret")
# =========================================================
# 演示 4:函数的"参数"本质上也是局部变量
# ---------------------------------------------------------
# 参数和函数体里 var 出来的变量一样,只在本函数内有效。
# =========================================================
func demo_parameter_is_local() -> void:
print("\n--- 4. 参数也是局部变量 ---")
greet("小明")
greet("小红")
# 这里看不到上面 greet 函数里的 name 参数
func greet(name: String) -> void:
# name 在 greet 内部有效,函数一结束就消失
print("你好,", name)
# =========================================================
# 演示 5:同名时谁优先?("局部变量遮住脚本级变量")
# ---------------------------------------------------------
# 如果脚本级和局部变量起了相同的名字,函数里用到的会是"局部那个"。
# 新手建议:别故意起重名,纯粹找麻烦。
# =========================================================
func demo_shadow() -> void:
print("\n--- 5. 同名时局部优先(建议避免)---")
print("脚本级 player_hp 现在是:", player_hp)
var player_hp: int = 9999 # 同名的局部变量
print("函数里再声明同名的 player_hp = ", player_hp)
print("这里用到的是【局部那个】,脚本级的没被改")
# 函数结束后,下面那个 player_hp 消失,脚本级的还在
