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

如何在Godot 4.0引擎中实现可组合的角色与技能系统?

Godot MOBA角色与技能系统设计方案

1. 角色资源定义(CharacterResource)

基于Resource实现角色通用属性容器,满足你用Resource管理角色的需求:

extends Resource
class_name CharacterResource

@export var display_name: String
@export var max_health: int
@export var move_speed: float
@export var strength: int
@export var avatar: Texture2D # UI显示用的角色头像
@export var skills: Array[SkillResource] # 关联该角色的所有技能资源

编辑器中可直接创建该Resource实例,配置不同角色的属性与技能列表,复用性强。

2. 技能系统:配置与行为分离

针对Resource无法自定义行为、PackedScene无法直接获取技能名称的问题,采用配置资源+行为脚本的分层方案:

2.1 技能配置资源(SkillResource)

用Resource存储所有技能的可配置参数,包括技能名称、图标、冷却及投射物类专属参数:

extends Resource
class_name SkillResource

@export var skill_name: String # 直接存储技能名称,解决PackedScene的访问问题
@export var icon: Texture2D # 技能栏显示用图标
@export var cooldown: float
@export_group("Projectile Settings")
@export var projectile_speed: float = 0.0
@export var max_range: float = 0.0
@export var projectile_scene: PackedScene # 投射物实体场景
@export var skill_script: Script # 绑定该技能对应的行为脚本

2.2 技能行为基类与子类

创建技能行为基类,所有技能的自定义逻辑通过子类实现:

extends Reference
class_name SkillBase

var skill_data: SkillResource

func _init(data: SkillResource):
    skill_data = data

# 核心技能释放方法,子类重写实现不同逻辑
func cast(owner: Node, target: Variant) -> void:
    pass

# 冷却结束回调,可选实现
func on_cooldown_finished() -> void:
    pass

比如投射物技能的子类实现:

extends SkillBase
class_name ProjectileSkill

override func cast(owner: CharacterBody3D, target_position: Vector3) -> void:
    # 从配置资源读取参数
    var projectile = skill_data.projectile_scene.instantiate()
    projectile.global_position = owner.global_position
    var direction = (target_position - owner.global_position).normalized()
    projectile.velocity = direction * skill_data.projectile_speed
    owner.get_parent().add_child(projectile)

    # 自动销毁超出射程的投射物
    await get_tree().create_timer(skill_data.max_range / skill_data.projectile_speed).timeout
    if projectile.is_valid():
        projectile.queue_free()

2.3 技能实例化绑定

在角色的逻辑节点(比如控制角色移动、状态的CharacterNode)中,将技能配置与行为脚本实例绑定:

extends CharacterBody3D

@export var character_data: CharacterResource
var active_skills: Dictionary = {} # 键为技能名称,值为SkillBase实例

func _ready():
    for skill_data in character_data.skills:
        # 通过配置的skill_script实例化技能行为对象
        var skill_instance = skill_data.skill_script.new(skill_data)
        active_skills[skill_data.skill_name] = skill_instance

3. 玩家控制器与技能调用

玩家控制器可直接访问角色的active_skills字典,获取技能配置用于UI显示,同时触发技能释放:

extends Node3D

@export var character_node: CharacterBody3D

func _process(delta):
    # 示例:按下技能1键释放第一个技能
    if Input.is_action_just_pressed("skill_1"):
        var first_skill = character_node.active_skills.values()[0]
        # 获取鼠标指向的目标位置(根据2D/3D项目调整)
        var target_pos = get_global_mouse_position()
        first_skill.cast(character_node, target_pos)
        # 更新技能冷却UI
        update_skill_ui(first_skill.skill_data)

# 更新技能栏UI
func update_skill_ui(skill_data: SkillResource):
    var skill_ui = $UI/SkillBar/SkillSlot1
    skill_ui.icon = skill_data.icon
    skill_ui.label.text = skill_data.skill_name
    # 这里可以添加冷却进度条的更新逻辑

4. 优化建议

  • 用Autoload创建SkillManager单例,统一处理技能冷却追踪、全局技能事件,减少重复代码。
  • 投射物节点封装通用逻辑(移动、碰撞、伤害计算),技能仅负责初始化参数,进一步复用行为。
  • 在编辑器中给SkillResource添加自定义编辑器插件,方便快速配置技能脚本和参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:37:01