diff --git a/config/character/hero01.tres b/config/character/hero01.tres index 74a45ea..4ba731b 100644 --- a/config/character/hero01.tres +++ b/config/character/hero01.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="CharacterCfg" load_steps=7 format=3 uid="uid://bjvrih37ni5nx"] +[gd_resource type="Resource" script_class="CharacterCfg" load_steps=8 format=3 uid="uid://bjvrih37ni5nx"] [ext_resource type="Script" path="res://script/config/character_cfg.gd" id="1_2054l"] [ext_resource type="Resource" uid="uid://dx54fjf5t0uu8" path="res://config/character_move/normal.tres" id="1_ebj0w"] @@ -6,6 +6,7 @@ [ext_resource type="Resource" uid="uid://815to6lq2qfs" path="res://config/character_mp/player.tres" id="2_wo8op"] [ext_resource type="Resource" uid="uid://dlaekoamystx3" path="res://config/character_shield/normal.tres" id="3_5l0vx"] [ext_resource type="Resource" uid="uid://cac6mk6g078vn" path="res://config/character_stun/normal.tres" id="6_i7bnp"] +[ext_resource type="Resource" uid="uid://b7e0vtpo7ox58" path="res://config/character/hero01_soul.tres" id="7_vfx1h"] [resource] script = ExtResource("1_2054l") @@ -20,3 +21,5 @@ stun = ExtResource("6_i7bnp") mp = ExtResource("2_wo8op") hp_max = 100.0 attack = 10.0 +sub_character = ExtResource("7_vfx1h") +sub_character_auto_create = true diff --git a/config/character/hero01_soul.tres b/config/character/hero01_soul.tres new file mode 100644 index 0000000..8aaa639 --- /dev/null +++ b/config/character/hero01_soul.tres @@ -0,0 +1,23 @@ +[gd_resource type="Resource" script_class="CharacterCfg" load_steps=7 format=3 uid="uid://b7e0vtpo7ox58"] + +[ext_resource type="Resource" uid="uid://dx54fjf5t0uu8" path="res://config/character_move/normal.tres" id="1_xjqmq"] +[ext_resource type="Resource" uid="uid://815to6lq2qfs" path="res://config/character_mp/player.tres" id="2_lvwof"] +[ext_resource type="Script" path="res://script/config/character_cfg.gd" id="3_wmpd1"] +[ext_resource type="Resource" uid="uid://dlaekoamystx3" path="res://config/character_shield/normal.tres" id="4_wsj1w"] +[ext_resource type="SpriteFrames" uid="uid://cwe8setoi6bd" path="res://resource/animation/character/hero01_move.aseprite" id="5_t652g"] +[ext_resource type="Resource" uid="uid://cac6mk6g078vn" path="res://config/character_stun/normal.tres" id="6_sxxop"] + +[resource] +script = ExtResource("3_wmpd1") +name = "hero01" +type = 3 +sprite_frames = ExtResource("5_t652g") +sprite_height = 50 +sprite_width = 16 +move = ExtResource("1_xjqmq") +shield = ExtResource("4_wsj1w") +stun = ExtResource("6_sxxop") +mp = ExtResource("2_lvwof") +hp_max = 100.0 +attack = 10.0 +sub_character_auto_create = false diff --git a/resource/skill_animation/hero01_fist_air_skill01.tres b/resource/skill_animation/hero01_fist_air_skill01.tres index 0e27fef..212e0c5 100644 --- a/resource/skill_animation/hero01_fist_air_skill01.tres +++ b/resource/skill_animation/hero01_fist_air_skill01.tres @@ -49,7 +49,7 @@ tracks/3/path = NodePath("Status:speed_up_rate") tracks/3/interp = 1 tracks/3/loop_wrap = true tracks/3/keys = { -"times": PackedFloat32Array(0.2, 0.7), +"times": PackedFloat32Array(0.1, 0.7), "transitions": PackedFloat32Array(1, 1), "update": 1, "values": [-0.5, -1.0] @@ -61,7 +61,7 @@ tracks/4/path = NodePath("Status:skill_move_speed") tracks/4/interp = 1 tracks/4/loop_wrap = true tracks/4/keys = { -"times": PackedFloat32Array(0, 0.2, 0.4), +"times": PackedFloat32Array(0, 0.1, 0.4), "transitions": PackedFloat32Array(1, 1, 1), "update": 1, "values": [0.0, 7.0, 0.0] @@ -90,10 +90,10 @@ tracks/6/path = NodePath("Status:skill_float_speed") tracks/6/interp = 1 tracks/6/loop_wrap = true tracks/6/keys = { -"times": PackedFloat32Array(0, 0.2, 0.2001, 0.4), -"transitions": PackedFloat32Array(1, 1, 1, 1), +"times": PackedFloat32Array(0, 0.1, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), "update": 1, -"values": [0.1, -4.0, -7.0, 0.0] +"values": [0.1, -7.0, 0.0] } tracks/7/type = "method" tracks/7/imported = false @@ -133,11 +133,14 @@ tracks/9/path = NodePath("Battle") tracks/9/interp = 1 tracks/9/loop_wrap = true tracks/9/keys = { -"times": PackedFloat32Array(0.4), -"transitions": PackedFloat32Array(1), +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), "values": [{ "args": [], "method": &"stop" +}, { +"args": [], +"method": &"stop" }] } tracks/10/type = "value" diff --git a/scene/ai/bullet01.tscn b/scene/ai/bullet01.tscn index 7091e83..78a7824 100644 --- a/scene/ai/bullet01.tscn +++ b/scene/ai/bullet01.tscn @@ -14,7 +14,7 @@ [node name="BeehaveTree" type="Node" node_paths=PackedStringArray("blackboard")] script = ExtResource("1_r673b") -blackboard = NodePath("@Node@19487") +blackboard = NodePath("@Node@19481") [node name="SelectorComposite" type="Node" parent="."] script = ExtResource("2_5ltau") diff --git a/scene/ai/monster01.tscn b/scene/ai/monster01.tscn index 945a457..d7bf365 100644 --- a/scene/ai/monster01.tscn +++ b/scene/ai/monster01.tscn @@ -11,7 +11,7 @@ [node name="BeehaveTree" type="Node" node_paths=PackedStringArray("blackboard")] script = ExtResource("1_bbyao") -blackboard = NodePath("@Node@88159") +blackboard = NodePath("@Node@19482") [node name="SequenceComposite" type="Node" parent="."] script = ExtResource("2_04nig") diff --git a/scene/character/character.tscn b/scene/character/character.tscn index 54a36b7..fa5b038 100644 --- a/scene/character/character.tscn +++ b/scene/character/character.tscn @@ -105,7 +105,6 @@ lod_bias = 0.001 gi_mode = 0 pixel_size = 0.02 double_sided = false -alpha_cut = 2 texture_filter = 0 sprite_frames = ExtResource("6_whjpk") animation = &"basic_air_flash" diff --git a/scene/character/soul.tscn b/scene/character/soul.tscn new file mode 100644 index 0000000..ed52d76 --- /dev/null +++ b/scene/character/soul.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=3 uid="uid://bnb3oaiijehrn"] + +[ext_resource type="PackedScene" uid="uid://8rcvw1vnjcf7" path="res://scene/character/character.tscn" id="1_gvr0p"] +[ext_resource type="Script" path="res://script/character/ai/soul_ai.gd" id="2_exf18"] + +[sub_resource type="Curve" id="Curve_j362u"] +min_value = -1.0 +max_value = 4.0 +_data = [Vector2(0, -1), 0.0, 0.0, 0, 0, Vector2(1, 4), 0.0, 0.0, 0, 0] +point_count = 2 + +[node name="Character" instance=ExtResource("1_gvr0p")] + +[node name="SoulAI" type="Node3D" parent="." index="11"] +script = ExtResource("2_exf18") +follow_speed_curve = SubResource("Curve_j362u") diff --git a/scene/effect/readiness/readiness_soul.tscn b/scene/effect/readiness/readiness_soul.tscn new file mode 100644 index 0000000..565faa5 --- /dev/null +++ b/scene/effect/readiness/readiness_soul.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://dj2bag42rmhvq"] + +[ext_resource type="Texture2D" uid="uid://xtipei54v35i" path="res://render/texture/decal/readiness_monster.png" id="1_hfi0a"] + +[node name="ReadinessHero" type="Decal"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.358925, 0) +size = Vector3(1, 1, 1) +texture_albedo = ExtResource("1_hfi0a") +normal_fade = 0.1 +cull_mask = 1 diff --git a/scene/launcher.tscn b/scene/launcher.tscn index 32cdfbf..21c0bac 100644 --- a/scene/launcher.tscn +++ b/scene/launcher.tscn @@ -19,8 +19,8 @@ [ext_resource type="Script" path="res://script/manager/ai_manager.gd" id="11_fm4d1"] [ext_resource type="Script" path="res://script/manager/input_manager.gd" id="12_vfqm4"] [ext_resource type="Script" path="res://script/character/status.gd" id="18_nr8sb"] -[ext_resource type="SpriteFrames" uid="uid://ce83cuqwgwwi4" path="res://resource/animation/character/hero01_long_attack.aseprite" id="20_0ashe"] [ext_resource type="SpriteFrames" uid="uid://2cb8lknel0ih" path="res://resource/animation/character/basic_move.aseprite" id="20_4ni1a"] +[ext_resource type="SpriteFrames" uid="uid://cajgs8smbkjan" path="res://resource/animation/character/hero01_fist_skill01.aseprite" id="20_uwqv0"] [ext_resource type="AnimationLibrary" uid="uid://croik07a1qko5" path="res://resource/skill_animation_library/animation_library.tres" id="22_qyapv"] [ext_resource type="Script" path="res://script/character/skill.gd" id="23_783eu"] [ext_resource type="Script" path="res://script/character/move.gd" id="25_d520l"] @@ -166,7 +166,8 @@ projection = 1 current = true size = 7.2 frustum_offset = Vector2(2, 0) -far = 100.0 +near = 0.1 +far = 20.0 script = ExtResource("4_yqiun") global_effect_curve = SubResource("Curve_f8hvs") @@ -207,7 +208,6 @@ script = ExtResource("5_n3qhi") unique_name_in_owner = true script = ExtResource("18_nr8sb") speed_up_rate = -1.0 -skill_move_speed = 2.0 [node name="View" type="AnimatedSprite3D" parent="EditorTool/Character"] unique_name_in_owner = true @@ -219,8 +219,9 @@ pixel_size = 0.02 double_sided = false alpha_cut = 2 texture_filter = 0 -sprite_frames = ExtResource("20_0ashe") -animation = &"long_attack01" +sprite_frames = ExtResource("20_uwqv0") +animation = &"fist_air_skill01" +frame = 8 [node name="Throw" type="AnimatedSprite3D" parent="EditorTool/Character"] unique_name_in_owner = true diff --git a/script/_global/enum.gd b/script/_global/enum.gd index 74c1a1e..1c1e182 100644 --- a/script/_global/enum.gd +++ b/script/_global/enum.gd @@ -3,7 +3,7 @@ extends Node3D enum EActionType {Pressed, Released} enum EDamageType {Sharp, Blunt, Ground} -enum ECharacterType {Player, Monster, Bullet} +enum ECharacterType {Player, Monster, Bullet, Soul} enum ETeam {Player, Monster} enum EStance { GroundIdle, Ground1, Ground2, Ground3, Ground4, Ground5, Ground6, Ground7, diff --git a/script/character/ai/soul_ai.gd b/script/character/ai/soul_ai.gd new file mode 100644 index 0000000..9c355de --- /dev/null +++ b/script/character/ai/soul_ai.gd @@ -0,0 +1,47 @@ +extends Node3D +class_name SoulAI + +@export var follow_speed_curve: Curve +@export var follow_dist_max: int = 5 + +@onready var character: Character = (get_owner() as Character) +@onready var status: Status = (%Status as Status) + + +class SkillOrder: + var skill_name: String + var cast_dir: Vector2 + var target: int + +var skill_order_list: Array[SkillOrder] = [] +var owner_character: Character + + +func _process(delta) -> void: + owner_character = Global.character_mgr.get_character(status.owner_id) + if not owner_character: + Global.character_mgr.destroy_character(character.id()) + return + update_skill() + update_move() + + +func update_skill() -> void: + pass + + +func update_move() -> void: + if status.is_skill_running: + return + var owner_pos: Vector3 = owner_character.pos() + var radius_add: float = owner_character.radius() + character.radius() + var target_pos: Vector3 = owner_pos + Vector3(-1 if owner_character.is_right() else 1, 0, 0) * radius_add * 1.1 + var dir: Vector3 = target_pos - character.pos() + var dir_2d: Vector2 = Vector2(dir.x, dir.z) + var dist: float = dir_2d.length() + if dist > follow_dist_max: + character.set_pos(target_pos) + return + var dist_rate = clamp(dist / follow_dist_max, 0, 1) + status.speed_up_rate = follow_speed_curve.sample(dist_rate) + character.move_to(dir_2d) diff --git a/script/character/character.gd b/script/character/character.gd index f8e7115..a28b053 100644 --- a/script/character/character.gd +++ b/script/character/character.gd @@ -51,7 +51,7 @@ func set_body_scale(cfg: CharacterCfg) -> void: collision.scale = body_scale pushbox.position = Vector3(0, half_height, 0) pushbox.scale = body_scale - status.basic_offset = Vector3(0, center_height, 0) + status.basic_offset = Vector3(0, center_height, randf()*0.001) status.ui_offset = Vector3(0, height*1.25, 0) status.ui_center_offset = Vector3(0, center_height, 0) status.radius = width @@ -118,6 +118,9 @@ func ui_pos_center()->Vector3: return position + status.ui_center_offset func target()->int: return status.target +func is_right()->bool: return status.is_right + + #==interface== func get_status(status_name: String) -> Variant: return status.get_status(status_name) diff --git a/script/character/effect.gd b/script/character/effect.gd index 6398287..a784a33 100644 --- a/script/character/effect.gd +++ b/script/character/effect.gd @@ -6,6 +6,7 @@ class_name Effect @onready var readiness_hero: PackedScene = preload("res://scene/effect/readiness/readiness_hero.tscn") @onready var readiness_monster: PackedScene = preload("res://scene/effect/readiness/readiness_monster.tscn") @onready var readiness_bullet: PackedScene = preload("res://scene/effect/readiness/readiness_bullet.tscn") +@onready var readiness_soul: PackedScene = preload("res://scene/effect/readiness/readiness_soul.tscn") @onready var character: Character = (get_owner() as Character) @onready var view: View = (%View as View) @onready var status: Status = (%Status as Status) @@ -29,6 +30,8 @@ func init(type: Enum.ECharacterType): Enum.ECharacterType.Player: rediness = readiness_hero.instantiate() Enum.ECharacterType.Monster: rediness = readiness_monster.instantiate() Enum.ECharacterType.Bullet: rediness = readiness_bullet.instantiate() + Enum.ECharacterType.Soul: rediness = readiness_soul.instantiate() + _: pass if rediness: add_child(rediness) @@ -40,7 +43,9 @@ func set_body_scale(body_scale: Vector3): rediness.position = Vector3.DOWN * 4 -func _process(delta): +func _process(delta) -> void: + if not rediness: + return #指针方向 if status.move_dir: var angle: float = status.move_dir.angle_to(Vector2.RIGHT) diff --git a/script/character/view.gd b/script/character/view.gd index 61e6a8f..b6df577 100644 --- a/script/character/view.gd +++ b/script/character/view.gd @@ -162,7 +162,7 @@ func update_flip(): func update_view(): position = status.basic_offset + status.shake_offset - global_position = Util.snap_vector3(global_position) +# global_position = Util.snap_vector3(global_position) func _on_animation_finished(): diff --git a/script/config/character_cfg.gd b/script/config/character_cfg.gd index 4e821aa..20db8cb 100644 --- a/script/config/character_cfg.gd +++ b/script/config/character_cfg.gd @@ -22,6 +22,7 @@ class_name CharacterCfg @export var attack2: AttackCfg @export var attack2_box: AttackBoxCfg @export var sub_character: CharacterCfg +@export var sub_character_auto_create: bool var core_cfg_list: Array[CoreCfg] diff --git a/script/manager/character_manager.gd b/script/manager/character_manager.gd index 3b60492..9fdf505 100644 --- a/script/manager/character_manager.gd +++ b/script/manager/character_manager.gd @@ -32,6 +32,7 @@ func create_character(cfg: CharacterCfg, team: Enum.ETeam, pos: Vector3, dir: Ve Enum.ECharacterType.Player: characterNode = ResourceManager.scene_player.instantiate() Enum.ECharacterType.Monster: characterNode = ResourceManager.scene_monster.instantiate() Enum.ECharacterType.Bullet: characterNode = ResourceManager.scene_bullet.instantiate() + Enum.ECharacterType.Soul: characterNode = ResourceManager.scene_soul.instantiate() _: return null add_child(characterNode) characterNode.name = cfg.name @@ -46,6 +47,9 @@ func create_character(cfg: CharacterCfg, team: Enum.ETeam, pos: Vector3, dir: Ve player_id = character_idx character.init_after() character.move_to(dir) + if cfg.sub_character and cfg.sub_character_auto_create: + create_character(cfg.sub_character, team, pos, dir, character_idx ) + return character diff --git a/script/manager/resource_manager.gd b/script/manager/resource_manager.gd index a0786bf..42f9c5c 100644 --- a/script/manager/resource_manager.gd +++ b/script/manager/resource_manager.gd @@ -1,22 +1,23 @@ extends Node3D #==scene== -var scene_character: PackedScene = load("res://scene/character/character.tscn") -var scene_player: PackedScene = load("res://scene/character/player.tscn") -var scene_monster: PackedScene = load("res://scene/character/monster.tscn") -var scene_bullet: PackedScene = load("res://scene/character/bullet.tscn") +var scene_character: PackedScene = load("res://scene/character/character.tscn") +var scene_player: PackedScene = load("res://scene/character/player.tscn") +var scene_monster: PackedScene = load("res://scene/character/monster.tscn") +var scene_bullet: PackedScene = load("res://scene/character/bullet.tscn") +var scene_soul: PackedScene = load("res://scene/character/soul.tscn") #==material== var material_character: Material = load("res://render/material/character.tres") as Material var material_character_sub: Material = load("res://render/material/character_sub.tres") as Material #==effect== -var particle_hit_sharp: PackedScene = load("res://scene/effect/particle/particle_hit_sharp.tscn") -var particle_hit_blunt: PackedScene = load("res://scene/effect/particle/particle_hit_blunt.tscn") -var particle_hit_ground: PackedScene = load("res://scene/effect/particle/particle_hit_ground.tscn") +var particle_hit_sharp: PackedScene = load("res://scene/effect/particle/particle_hit_sharp.tscn") +var particle_hit_blunt: PackedScene = load("res://scene/effect/particle/particle_hit_blunt.tscn") +var particle_hit_ground: PackedScene = load("res://scene/effect/particle/particle_hit_ground.tscn") var particle_debug_box: PackedScene = load("res://scene/effect/particle/particle_debug_box.tscn") -var particle_debug_cylinder: PackedScene = load("res://scene/effect/particle/particle_debug_cylinder.tscn") +var particle_debug_cylinder: PackedScene = load("res://scene/effect/particle/particle_debug_cylinder.tscn") #==config== #character -var cfg_character_player: CharacterCfg = load("res://config/character/hero01.tres") as CharacterCfg +var cfg_character_player: CharacterCfg = load("res://config/character/hero01.tres") as CharacterCfg var cfg_character_monster_test1: CharacterCfg = load("res://config/character/monster01.tres") as CharacterCfg var cfg_character_monster_test2: CharacterCfg = load("res://config/character/monster02.tres") as CharacterCfg var cfg_character_monster_test3: CharacterCfg = load("res://config/character/monster03.tres") as CharacterCfg