godot 击败敌人后增加经验的脚本

张开发
2026/6/9 9:38:04 15 分钟阅读
godot 击败敌人后增加经验的脚本
自己的理解signal exp_updated(current, needed) # 定义信号参数为当前经验、升级所需经验是自己定义的类似函数 但是有发送消息功能exp_updated.emit(exp, exp_needed) # 发出信号通知UI更新然后用这个的emit发消息player.exp_updated.connect(_on_exp_updated) # 连接信号连接这个消息函数 然后connect到自己的函数去获取传递的变量func _on_exp_updated(current, needed): 自己的函数 去获取到变量后进行自己的计算整体流程玩家Player拥有经验值和等级。击杀敌人时敌人调用玩家的 add_exp() 方法。玩家经验增加可能升级并发出 exp_updated 信号。UI 界面ExperienceBar监听了这个信号收到后更新进度条和文字。1️⃣ 玩家脚本 (Player.gd)gdscript extends CharacterBody2D signal exp_updated(current,needed)# 定义信号参数为当前经验、升级所需经验var level1var exp0var exp_needed50# 从1级升到2级需要50点经验func add_exp(amount):expamountwhileexpexp_needed:# 可能一次获得很多经验连续升级exp-exp_needed level1exp_neededint(exp_needed*1.2)# 每级需求增加20%print(升级! 当前等级:,level)exp_updated.emit(exp,exp_needed)# 发出信号通知UI更新关键点解释signal exp_updated(current, needed)声明了一个信号它会在经验值变化时发出并携带两个整数当前经验和升级所需经验。UI 会连接这个信号。exp_needed升到下一级所需的经验值。初始为 50意味着从 1 级升到 2 级需要 50 经验。add_exp(amount)外部比如敌人调用此方法增加经验。先累加 exp。用 while 循环检查是否达到或超过升级需求可能一次性获得大量经验连升多级。升级时扣除所需经验等级 1并增加下一级的需求这里用乘以 1.2即每级需求增长 20%。最后发出 exp_updated 信号把当前经验和新的升级需求传出去。为什么用 while 而不是 if假如你获得 500 经验可能连续升好几级while 能处理这种情况。2️⃣ UI 界面脚本 (ExperienceBar.gd)gdscript extends CanvasLayer# 保证UI永远在最前不随相机移动onreadyvar bar$Control/ProgressBaronreadyvar label$Control/Label func _ready():var playerget_tree().get_first_node_in_group(player)ifplayer:player.exp_updated.connect(_on_exp_updated)# 连接信号func _on_exp_updated(current,needed):bar.max_valueneeded bar.valuecurrent label.textstr(current)/str(needed)关键点解释CanvasLayer 根节点让 UI 层独立于游戏世界即使相机移动经验条也固定在屏幕上。get_tree().get_first_node_in_group(“player”)找到场景中属于 “player” 组的第一个节点你的玩家角色。注意你需要在编辑器中选中玩家节点在“节点”面板的 “Groups” 里添加 player 组。player.exp_updated.connect(_on_exp_updated)把玩家发出的 exp_updated 信号连接到 UI 自己的 _on_exp_updated 函数。这样当玩家经验变化时UI 就会自动收到通知。_on_exp_updated(current, needed)收到信号后设置进度条的 max_value 为升级所需经验。设置进度条的 value 为当前经验。更新文本显示例如 “35/50”。3️⃣ 敌人脚本调用经验增加gdscript在 Enemy.gd 中当敌人死亡时func die():var playerget_tree().get_first_node_in_group(player)ifplayer:player.add_exp(10)# 击杀奖励10经验queue_free()关键点解释同样通过组找到玩家节点。直接调用玩家脚本中的 add_exp 方法传入击杀奖励数值比如 10。玩家内部会自动处理经验累加、升级、信号发射。 为什么这是“标准做法”特性 说明简单 只有两个信号、三个函数没有复杂的单例或全局变量。解耦 玩家不需要知道 UI 的存在只需发出信号UI 也不需要知道玩家如何计算经验只负责显示。健壮 while 循环处理连升多级CanvasLayer 保证 UI 始终可见。易扩展 想要增加升级特效在 add_exp 里加一行 emit_signal(“level_up”, level) 即可。 运行流程举例游戏开始玩家等级 1经验 0需要 50 升级。UI 显示 0/50。击杀一只僵尸 → 敌人调用 player.add_exp(10)玩家经验变为 10未到 50 → 发出信号 exp_updated(10, 50)UI 收到 → 进度条变成 10/50。再杀 4 只 → 经验累计 50 → while 循环触发等级变为 2经验归 050-50新的升级需求 50 * 1.2 60发出信号 exp_updated(0, 60)UI 更新为 0/60同时控制台打印“升级! 当前等级: 2”。继续游戏经验从 0 开始向 60 积累。

更多文章