You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot中如何将角色选择场景选中的玩家加载到世界场景?

Godot 2D角色选择场景加载问题解决方案

问题核心错误

你的代码存在3个关键逻辑问题,导致角色选择后无法在世界场景正确加载:

  1. 角色选择场景的match分支缩进错误,会触发语法报错
  2. 点击Play按钮时错误地将数字类型的PlayerSelect赋值为字符串,打乱了状态管理逻辑
  3. 世界场景未正确从Autoload单例中获取选中的角色场景资源

逐步修复代码

1. 修正角色选择场景脚本

修复缩进问题,同时调整Play按钮的逻辑,不再覆盖数字索引变量,而是通过索引推导选中的角色标识:

extends Node2D

func _process(delta):
    match CharacterSelected.PlayerSelect:
        0:
            get_node("PlayerSelect").play("C1")
        1:
            get_node("PlayerSelect").play("C2")
        2:
            get_node("PlayerSelect").play("C3")
        3:
            get_node("PlayerSelect").play("C4")
        4:
            get_node("PlayerSelect").play("C5")
        5:
            get_node("PlayerSelect").play("C6")
        6:
            get_node("PlayerSelect").play("C7")
        7:
            get_node("PlayerSelect").play("C8")

func _on_Left_pressed():
    if CharacterSelected.PlayerSelect > 0:
        CharacterSelected.PlayerSelect -= 1

func _on_Right_pressed():
    # 8个角色对应索引0-7,所以上限设为7
    if CharacterSelected.PlayerSelect < 7:
        CharacterSelected.PlayerSelect += 1

func _on_Play_pressed():
    # 通过数字索引推导角色标识(C1-C8)
    var selected_key = "C" + str(CharacterSelected.PlayerSelect + 1)
    CharacterSelected.selected_character_key = selected_key
    get_tree().change_scene("res://Level 1.tscn")

2. 更新Autoload单例脚本

新增变量存储选中的角色标识,区分数字索引和角色场景映射:

extends Node

# 角色场景映射字典
var character_scenes = {
    "C1" : preload("res://C1r.tscn"),
    "C2" : preload("res://C2.tscn"),
    "C3" : preload("res://C3.tscn"),
    "C4" : preload("res://C4.tscn"),
    "C5" : preload("res://C5.tscn"),
    "C6" : preload("res://C6.tscn"),
    "C7" : preload("res://C7.tscn"),
    "C8" : preload("res://C8.tscn")
}
var PlayerSelect = 0  # 数字索引,0-7对应C1-C8
var selected_character_key = "C1"  # 默认选中第一个角色

3. 修正世界场景脚本

直接从Autoload的预加载字典中获取角色场景并实例化:

extends Node2D

func _ready():
    # 从单例中获取选中的角色场景
    var selected_scene = CharacterSelected.character_scenes[CharacterSelected.selected_character_key]
    var player_character = selected_scene.instance()
    add_child(player_character)

额外优化建议

  • 可以用数组简化match分支的冗余代码:
    var anim_names = ["C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8"]
    func _process(delta):
        var anim_name = anim_names[CharacterSelected.PlayerSelect]
        get_node("PlayerSelect").play(anim_name)
    
  • 确认按钮的pressed信号已在编辑器中正确连接到脚本对应函数(右键按钮→连接信号)

内容的提问来源于stack exchange,提问作者Chiyome Mazuko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:45:55