diff --git a/DungeonShooting_Godot/excel/excelFile/ActivityBase.xlsx b/DungeonShooting_Godot/excel/excelFile/ActivityBase.xlsx index 3dd1c83..952695c 100644 --- a/DungeonShooting_Godot/excel/excelFile/ActivityBase.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/ActivityBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/ActivityMaterial.xlsx b/DungeonShooting_Godot/excel/excelFile/ActivityMaterial.xlsx index 4c523b5..acc76ba 100644 --- a/DungeonShooting_Godot/excel/excelFile/ActivityMaterial.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/ActivityMaterial.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/AiAttackAttr.xlsx b/DungeonShooting_Godot/excel/excelFile/AiAttackAttr.xlsx index 78b30fd..a6a8d0f 100644 --- a/DungeonShooting_Godot/excel/excelFile/AiAttackAttr.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/AiAttackAttr.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/BulletBase.xlsx b/DungeonShooting_Godot/excel/excelFile/BulletBase.xlsx index 809d271..93e0f3c 100644 --- a/DungeonShooting_Godot/excel/excelFile/BulletBase.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/BulletBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/Sound.xlsx b/DungeonShooting_Godot/excel/excelFile/Sound.xlsx index 543b8cd..1280881 100644 --- a/DungeonShooting_Godot/excel/excelFile/Sound.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/Sound.xlsx Binary files differ diff --git a/DungeonShooting_Godot/excel/excelFile/WeaponBase.xlsx b/DungeonShooting_Godot/excel/excelFile/WeaponBase.xlsx index 8738ff1..1555142 100644 --- a/DungeonShooting_Godot/excel/excelFile/WeaponBase.xlsx +++ b/DungeonShooting_Godot/excel/excelFile/WeaponBase.xlsx Binary files differ diff --git a/DungeonShooting_Godot/resource/config/ActivityBase.json b/DungeonShooting_Godot/resource/config/ActivityBase.json index 99ef530..946ee41 100644 --- a/DungeonShooting_Godot/resource/config/ActivityBase.json +++ b/DungeonShooting_Godot/resource/config/ActivityBase.json @@ -138,7 +138,7 @@ "Intro": "", "Details": "", "IsStatic": false, - "__Material": "", + "__Material": "0003", "Prefab": "res://prefab/bullet/normal/Bullet0001.tscn", "Icon": "", "ShowInMapEditor": false @@ -150,7 +150,7 @@ "Intro": "", "Details": "", "IsStatic": false, - "__Material": "", + "__Material": "0003", "Prefab": "res://prefab/bullet/normal/Bullet0002.tscn", "Icon": "", "ShowInMapEditor": false @@ -162,7 +162,7 @@ "Intro": "", "Details": "", "IsStatic": false, - "__Material": "", + "__Material": "0003", "Prefab": "res://prefab/bullet/normal/Bullet0003.tscn", "Icon": "", "ShowInMapEditor": false diff --git a/DungeonShooting_Godot/resource/config/ActivityMaterial.json b/DungeonShooting_Godot/resource/config/ActivityMaterial.json index a6cffda..56f528a 100644 --- a/DungeonShooting_Godot/resource/config/ActivityMaterial.json +++ b/DungeonShooting_Godot/resource/config/ActivityMaterial.json @@ -20,5 +20,16 @@ "FallBounceStrength": 0.7, "FallBounceSpeed": 0.85, "FallBounceRotation": 0.85 + }, + { + "Id": "0003", + "Remark": "\u5B50\u5F39,\u53CD\u5F39\u6D88\u8017\u4F4E", + "Friction": 140, + "RotationFriction": 140, + "Bounce": true, + "BounceStrength": 1, + "FallBounceStrength": 0.5, + "FallBounceSpeed": 0.75, + "FallBounceRotation": 0.5 } ] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/config/BulletBase.json b/DungeonShooting_Godot/resource/config/BulletBase.json index 06fc6ed..6ce1a2e 100644 --- a/DungeonShooting_Godot/resource/config/BulletBase.json +++ b/DungeonShooting_Godot/resource/config/BulletBase.json @@ -31,7 +31,9 @@ "BounceCount": [ 0 ], - "StrikeDestroy": true + "Penetration": [ + 0 + ] }, { "Id": "0002", @@ -66,7 +68,9 @@ "BounceCount": [ 0 ], - "StrikeDestroy": true + "Penetration": [ + 0 + ] }, { "Id": "0003", @@ -100,7 +104,9 @@ "BounceCount": [ 0 ], - "StrikeDestroy": true + "Penetration": [ + 0 + ] }, { "Id": "0004", @@ -134,7 +140,9 @@ "BounceCount": [ 0 ], - "StrikeDestroy": true + "Penetration": [ + 0 + ] }, { "Id": "0005", @@ -145,7 +153,7 @@ 30 ], "RepelRange": [ - 0 + 150 ], "DeviationAngleRange": [ 0 @@ -168,7 +176,9 @@ "BounceCount": [ 999 ], - "StrikeDestroy": true + "Penetration": [ + 1 + ] }, { "Id": "1001", @@ -179,7 +189,7 @@ 5 ], "RepelRange": [ - 0 + 40 ], "DeviationAngleRange": [ 0 @@ -200,7 +210,7 @@ "BounceCount": [ 0 ], - "StrikeDestroy": false + "Penetration": null }, { "Id": "2001", @@ -228,6 +238,6 @@ "UseGravity": false, "VerticalSpeed": null, "BounceCount": null, - "StrikeDestroy": false + "Penetration": null } ] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json index 7a7ca41..44c64cd 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json @@ -1 +1 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":19,"Y":2},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":24,"Y":-14},"Size":{"X":0,"Y":0},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":6,"Y":34},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-42,"Y":9},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0004","Weight":100,"Attr":{"CurrAmmon":"180","ResidueAmmo":"90"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-63,"Y":-18},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0005","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"40"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-31,"Y":-16},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0003","Weight":100,"Attr":{"CurrAmmon":"12","ResidueAmmo":"90"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-47,"Y":32},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0006","Weight":100,"Attr":{"CurrAmmon":"20","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":2,"Y":-25},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0007","Weight":100,"Attr":{"CurrAmmon":"60","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":57,"Y":56},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":67,"Y":28},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":60,"Y":-19},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":34,"Y":23},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-11,"Y":8},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-20,"Y":33},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file +[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":19,"Y":2},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":24,"Y":-14},"Size":{"X":0,"Y":0},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":6,"Y":34},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-42,"Y":9},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0004","Weight":100,"Attr":{"CurrAmmon":"180","ResidueAmmo":"90"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-63,"Y":-18},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0005","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"40"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-31,"Y":-16},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0003","Weight":100,"Attr":{"CurrAmmon":"12","ResidueAmmo":"90"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-47,"Y":32},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0006","Weight":100,"Attr":{"CurrAmmon":"20","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":2,"Y":-25},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0007","Weight":100,"Attr":{"CurrAmmon":"60","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-80,"Y":14},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0008","Weight":100,"Attr":{"CurrAmmon":"10","ResidueAmmo":"120"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-75,"Y":47},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0009","Weight":100,"Attr":{"CurrAmmon":"1","ResidueAmmo":"25"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":57,"Y":56},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":67,"Y":28},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":60,"Y":-19},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":34,"Y":23},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-11,"Y":8},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-20,"Y":33},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0010","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png index e502322..d64d95a 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preview.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png new file mode 100644 index 0000000..5d05fe2 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png.import b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png.import new file mode 100644 index 0000000..acce48a --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0002/Enemy0002.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ba6ke6xp63lnv" +path="res://.godot/imported/Enemy0002.png-cf46c3b830873b4d0ccb2d0683f29d51.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/role/enemy0002/Enemy0002.png" +dest_files=["res://.godot/imported/Enemy0002.png-cf46c3b830873b4d0ccb2d0683f29d51.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0001.tres b/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0001.tres new file mode 100644 index 0000000..42508d3 --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0001.tres @@ -0,0 +1,117 @@ +[gd_resource type="SpriteFrames" load_steps=15 format=3 uid="uid://cnctpyrn02rhd"] + +[ext_resource type="Texture2D" uid="uid://ddhkhfaos2w1g" path="res://resource/sprite/role/enemy0001/enemy0001.png" id="1_inanc"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_jttte"] +atlas = ExtResource("1_inanc") +region = Rect2(0, 0, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ff0sc"] +atlas = ExtResource("1_inanc") +region = Rect2(0, 24, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mf7cn"] +atlas = ExtResource("1_inanc") +region = Rect2(16, 24, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yvk4h"] +atlas = ExtResource("1_inanc") +region = Rect2(32, 24, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pwcj2"] +atlas = ExtResource("1_inanc") +region = Rect2(48, 24, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_frwnm"] +atlas = ExtResource("1_inanc") +region = Rect2(48, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_201od"] +atlas = ExtResource("1_inanc") +region = Rect2(32, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kteyh"] +atlas = ExtResource("1_inanc") +region = Rect2(16, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_huqt3"] +atlas = ExtResource("1_inanc") +region = Rect2(0, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6s1ko"] +atlas = ExtResource("1_inanc") +region = Rect2(0, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vq38t"] +atlas = ExtResource("1_inanc") +region = Rect2(16, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2b6x5"] +atlas = ExtResource("1_inanc") +region = Rect2(32, 48, 16, 24) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6755u"] +atlas = ExtResource("1_inanc") +region = Rect2(48, 48, 16, 24) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_jttte") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_ff0sc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mf7cn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yvk4h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pwcj2") +}], +"loop": true, +"name": &"idle", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_frwnm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_201od") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kteyh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_huqt3") +}], +"loop": true, +"name": &"reverseRun", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_6s1ko") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vq38t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2b6x5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6755u") +}], +"loop": true, +"name": &"run", +"speed": 10.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0002.tres b/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0002.tres new file mode 100644 index 0000000..c76a23b --- /dev/null +++ b/DungeonShooting_Godot/resource/spriteFrames/role/Enemy0002.tres @@ -0,0 +1,79 @@ +[gd_resource type="SpriteFrames" load_steps=11 format=3 uid="uid://ctpkpxgcwb583"] + +[ext_resource type="Texture2D" uid="uid://ba6ke6xp63lnv" path="res://resource/sprite/role/enemy0002/Enemy0002.png" id="1_bvqwm"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_5wfgo"] +atlas = ExtResource("1_bvqwm") +region = Rect2(48, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xgbmh"] +atlas = ExtResource("1_bvqwm") +region = Rect2(0, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y1ku4"] +atlas = ExtResource("1_bvqwm") +region = Rect2(48, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_st6cw"] +atlas = ExtResource("1_bvqwm") +region = Rect2(96, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1sv27"] +atlas = ExtResource("1_bvqwm") +region = Rect2(144, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_k7ewl"] +atlas = ExtResource("1_bvqwm") +region = Rect2(192, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7e28c"] +atlas = ExtResource("1_bvqwm") +region = Rect2(240, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cdaa6"] +atlas = ExtResource("1_bvqwm") +region = Rect2(288, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_uccqd"] +atlas = ExtResource("1_bvqwm") +region = Rect2(336, 0, 48, 48) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_5wfgo") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xgbmh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_y1ku4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_st6cw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1sv27") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_k7ewl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7e28c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cdaa6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uccqd") +}], +"loop": true, +"name": &"idle", +"speed": 7.0 +}] diff --git a/DungeonShooting_Godot/resource/spriteFrames/role/Role1001.tres b/DungeonShooting_Godot/resource/spriteFrames/role/Role1001.tres deleted file mode 100644 index 600ba06..0000000 --- a/DungeonShooting_Godot/resource/spriteFrames/role/Role1001.tres +++ /dev/null @@ -1,117 +0,0 @@ -[gd_resource type="SpriteFrames" load_steps=15 format=3 uid="uid://cnctpyrn02rhd"] - -[ext_resource type="Texture2D" uid="uid://ddhkhfaos2w1g" path="res://resource/sprite/role/enemy0001/enemy0001.png" id="1_xi6qw"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_jttte"] -atlas = ExtResource("1_xi6qw") -region = Rect2(0, 0, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_ff0sc"] -atlas = ExtResource("1_xi6qw") -region = Rect2(0, 24, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_mf7cn"] -atlas = ExtResource("1_xi6qw") -region = Rect2(16, 24, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_yvk4h"] -atlas = ExtResource("1_xi6qw") -region = Rect2(32, 24, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_pwcj2"] -atlas = ExtResource("1_xi6qw") -region = Rect2(48, 24, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_frwnm"] -atlas = ExtResource("1_xi6qw") -region = Rect2(48, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_201od"] -atlas = ExtResource("1_xi6qw") -region = Rect2(32, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_kteyh"] -atlas = ExtResource("1_xi6qw") -region = Rect2(16, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_huqt3"] -atlas = ExtResource("1_xi6qw") -region = Rect2(0, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_6s1ko"] -atlas = ExtResource("1_xi6qw") -region = Rect2(0, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_vq38t"] -atlas = ExtResource("1_xi6qw") -region = Rect2(16, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_2b6x5"] -atlas = ExtResource("1_xi6qw") -region = Rect2(32, 48, 16, 24) - -[sub_resource type="AtlasTexture" id="AtlasTexture_6755u"] -atlas = ExtResource("1_xi6qw") -region = Rect2(48, 48, 16, 24) - -[resource] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_jttte") -}], -"loop": true, -"name": &"default", -"speed": 5.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_ff0sc") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_mf7cn") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_yvk4h") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_pwcj2") -}], -"loop": true, -"name": &"idle", -"speed": 7.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_frwnm") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_201od") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_kteyh") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_huqt3") -}], -"loop": true, -"name": &"reverseRun", -"speed": 10.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_6s1ko") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_vq38t") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_2b6x5") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_6755u") -}], -"loop": true, -"name": &"run", -"speed": 10.0 -}] diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_BulletBase.cs b/DungeonShooting_Godot/src/config/ExcelConfig_BulletBase.cs index 4faf653..dce87f4 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig_BulletBase.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig_BulletBase.cs @@ -107,10 +107,12 @@ public int[] BounceCount; /// - /// 在还有剩余反弹次数时撞到玩家时是否销毁子弹 + /// 子弹穿透次数区间
+ /// 只有Type为1时有效
+ /// 格式为[value]或者[min,max] ///
[JsonInclude] - public bool StrikeDestroy; + public int[] Penetration; /// /// 返回浅拷贝出的新对象 @@ -131,7 +133,7 @@ inst.UseGravity = UseGravity; inst.VerticalSpeed = VerticalSpeed; inst.BounceCount = BounceCount; - inst.StrikeDestroy = StrikeDestroy; + inst.Penetration = Penetration; return inst; } } diff --git a/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs b/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs index 5575a61..1df0c7d 100644 --- a/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs +++ b/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs @@ -364,7 +364,7 @@ //是否撞到物体 KinematicCollision2D collision; - _flag -= delta; + _flag--; if (_flag <= 0 && (collision = Master.GetLastSlideCollision()) != null) //执行反弹操作 { //调用移动碰撞函数 @@ -373,8 +373,8 @@ { return; } - //0.1秒内不能再触发第二次碰撞检测 - _flag = 0.1f; + //2帧内不能再触发第二次碰撞检测 + _flag = 2; var no = collision.GetNormal().Rotated(Mathf.Pi * 0.5f); newVelocity = finallyEf.Reflect(no); var rotation = newVelocity.Angle(); diff --git a/DungeonShooting_Godot/src/game/activity/bullet/explode/Explode.cs b/DungeonShooting_Godot/src/game/activity/bullet/explode/Explode.cs index 56a6963..6ac0354 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/explode/Explode.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/explode/Explode.cs @@ -33,8 +33,7 @@ private bool _init = false; private float _hitRadius; - private int _minHarm; - private int _maxHarm; + private int _harm; private float _repelledRadius; private float _maxRepelled; @@ -55,11 +54,10 @@ /// 爆炸所在区域 /// 攻击的层级 /// 伤害半径 - /// 最小伤害 - /// 最大伤害 + /// 造成的伤害 /// 击退半径 /// 最大击退速度 - public void Init(AffiliationArea affiliationArea, uint attackLayer, float hitRadius, int minHarm, int maxHarm, float repelledRadius, float maxRepelled) + public void Init(AffiliationArea affiliationArea, uint attackLayer, float hitRadius, int harm, float repelledRadius, float maxRepelled) { if (!_init) { @@ -73,8 +71,7 @@ AttackLayer = attackLayer; _hitRadius = hitRadius; - _minHarm = minHarm; - _maxHarm = maxHarm; + _harm = harm; _repelledRadius = repelledRadius; _maxRepelled = maxRepelled; CollisionMask = attackLayer | PhysicsLayer.Prop | PhysicsLayer.Debris; @@ -141,7 +138,7 @@ { if (o is Role role) //是角色 { - role.CallDeferred(nameof(role.Hurt), Utils.Random.RandomRangeInt(_minHarm, _maxHarm), angle); + role.CallDeferred(nameof(role.Hurt), _harm, angle); } else if (o is Bullet bullet) //是子弹 { diff --git a/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs b/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs index 4e1ec39..5b503d4 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs @@ -1,6 +1,5 @@ using System.Collections; using System.Collections.Generic; -using Config; using Godot; /// @@ -124,14 +123,13 @@ var role = other.AsActivityObject(); if (role != null) { - //计算子弹造成的伤害 - var damage = Utils.Random.RandomRangeInt(BulletData.MinHarm, BulletData.MaxHarm); - if (BulletData.TriggerRole != null) + //击退 + if (BulletData.Repel != 0) { - damage = BulletData.TriggerRole.RoleState.CalcDamage(damage); + role.MoveController.AddForce(Vector2.FromAngle(Rotation) * BulletData.Repel); } //造成伤害 - role.CallDeferred(nameof(Role.Hurt), damage, Rotation); + role.CallDeferred(nameof(Role.Hurt), BulletData.Harm, Rotation); } } diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs index b997951..d90a457 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs @@ -55,7 +55,7 @@ explode.Position = pos; explode.RotationDegrees = Utils.Random.RandomRangeInt(0, 360); explode.AddToActivityRootDeferred(RoomLayerEnum.YSortLayer); - explode.Init(BulletData.TriggerRole?.AffiliationArea, AttackLayer, 25, BulletData.MinHarm, BulletData.MaxHarm, 50, 150); + explode.Init(BulletData.TriggerRole?.AffiliationArea, AttackLayer, 25, BulletData.Harm, 50, BulletData.Repel); explode.RunPlay(BulletData.TriggerRole); if (AffiliationArea != null) { diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs index 94208a4..e99694f 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs @@ -28,6 +28,11 @@ /// 当前反弹次数 /// public int CurrentBounce { get; protected set; } = 0; + + /// + /// 当前穿透次数 + /// + public int CurrentPenetration { get; protected set; } = 0; //当前子弹已经飞行的距离 private float CurrFlyDistance = 0; @@ -114,33 +119,24 @@ { PlayDisappearEffect(); - //计算子弹造成的伤害 - var damage = Utils.Random.RandomRangeInt(BulletData.MinHarm, BulletData.MaxHarm); - if (BulletData.TriggerRole != null) - { - damage = BulletData.TriggerRole.RoleState.CalcDamage(damage); - } - //击退 if (role is not Player) //目标不是玩家才会触发击退 { - var attr = BulletData.Weapon.GetUseAttribute(BulletData.TriggerRole); - //计算子弹造成的击退 - var repel = Utils.Random.RandomConfigRange(attr.Bullet.RepelRange); - if (BulletData.TriggerRole != null) + if (BulletData.Repel != 0) { - repel = BulletData.TriggerRole.RoleState.CalcBulletRepel(BulletData.Weapon, repel); - } - if (repel != 0) - { - //role.MoveController.AddForce(Vector2.FromAngle(BasisVelocity.Angle()) * repel); - role.MoveController.AddForce(Vector2.FromAngle(Velocity.Angle()) * repel); + role.MoveController.AddForce(Velocity.Normalized() * BulletData.Repel); } } //造成伤害 - role.CallDeferred(nameof(Role.Hurt), damage, Rotation); - Destroy(); + role.CallDeferred(nameof(Role.Hurt), BulletData.Harm, Rotation); + + //穿透次数 + CurrentPenetration++; + if (CurrentPenetration > BulletData.Penetration) + { + Destroy(); + } } } diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs index 2c2c309..1d18c21 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs @@ -1902,134 +1902,6 @@ { return AnimatedSprite.Position + ShellPoint.Position; } - - //-------------------------- ----- 子弹相关 ----------------------------- - - /// - /// 投抛弹壳的默认实现方式, shellId为弹壳id - /// - protected ActivityObject ThrowShell(ExcelConfig.ActivityBase shell, float speedScale = 1) - { - var startPos = ShellPoint.GlobalPosition; - float startHeight; - if (Master != null) - { - var shellPosition = (Master != null ? Master.MountPoint.Position : Position) + ShellPoint.Position; - startHeight = -shellPosition.Y; - startPos.Y += startHeight; - } - else - { - startHeight = Altitude; - } - - var direction = GlobalRotationDegrees + Utils.Random.RandomRangeInt(-30, 30) + 180; - var verticalSpeed = Utils.Random.RandomRangeInt((int)(60 * speedScale), (int)(120 * speedScale)); - var velocity = new Vector2(Utils.Random.RandomRangeInt((int)(20 * speedScale), (int)(60 * speedScale)), 0).Rotated(direction * Mathf.Pi / 180); - var rotate = Utils.Random.RandomRangeInt((int)(-720 * speedScale), (int)(720 * speedScale)); - var shellInstance = Create(shell); - shellInstance.Rotation = (Master != null ? Master.MountPoint.RealRotation : Rotation); - shellInstance.Throw(startPos, startHeight, verticalSpeed, velocity, rotate); - shellInstance.InheritVelocity(Master != null ? Master : this); - if (Master == null) - { - AffiliationArea.InsertItem(shellInstance); - } - else - { - Master.AffiliationArea.InsertItem(shellInstance); - } - - return shellInstance; - } - - /// - /// 发射子弹 - /// - protected IBullet ShootBullet(float fireRotation, ExcelConfig.BulletBase bullet) - { - if (bullet.Type == 1) //实体子弹 - { - return ShootSolidBullet(fireRotation, bullet); - } - else if (bullet.Type == 2) //激光子弹 - { - return ShootLaser(fireRotation, bullet); - } - - return null; - } - - /// - /// 发射子弹的默认实现方式 - /// - private Bullet ShootSolidBullet(float fireRotation, ExcelConfig.BulletBase bullet) - { - var data = new BulletData() - { - Weapon = this, - BulletBase = bullet, - TriggerRole = TriggerRole, - MinHarm = Utils.GetConfigRangeStart(bullet.HarmRange), - MaxHarm = Utils.GetConfigRangeEnd(bullet.HarmRange), - MaxDistance = Utils.Random.RandomConfigRange(bullet.DistanceRange), - FlySpeed = Utils.Random.RandomConfigRange(bullet.SpeedRange), - VerticalSpeed = Utils.Random.RandomConfigRange(bullet.VerticalSpeed), - BounceCount = Utils.Random.RandomConfigRange(bullet.BounceCount), - Position = FirePoint.GlobalPosition, - }; - - var deviationAngle = Utils.Random.RandomConfigRange(bullet.DeviationAngleRange); - if (TriggerRole != null) - { - data.FlySpeed = TriggerRole.RoleState.CalcBulletSpeed(this, data.FlySpeed); - data.MaxDistance = TriggerRole.RoleState.CalcBulletDistance(this, data.MaxDistance); - deviationAngle = TriggerRole.RoleState.CalcBulletDeviationAngle(this, deviationAngle); - } - - if (TriggerRole != null && TriggerRole.IsAi) //只有玩家使用该武器才能获得正常速度的子弹 - { - data.FlySpeed *= AiUseAttribute.AiAttackAttr.BulletSpeedScale; - } - - data.Rotation = fireRotation + Mathf.DegToRad(deviationAngle); - //创建子弹 - var bulletInstance = Create(bullet.Prefab); - bulletInstance.InitData(data, GetAttackLayer()); - return bulletInstance; - } - - /// - /// 发射射线的默认实现方式 - /// - private Laser ShootLaser(float fireRotation, ExcelConfig.BulletBase bullet) - { - var data = new BulletData() - { - Weapon = this, - BulletBase = bullet, - TriggerRole = TriggerRole, - MinHarm = Utils.GetConfigRangeStart(bullet.HarmRange), - MaxHarm = Utils.GetConfigRangeEnd(bullet.HarmRange), - MaxDistance = Utils.Random.RandomConfigRange(bullet.DistanceRange), - BounceCount = Utils.Random.RandomConfigRange(bullet.BounceCount), - LifeTime = Utils.Random.RandomConfigRange(bullet.LifeTimeRange), - Position = FirePoint.GlobalPosition, - }; - - var deviationAngle = Utils.Random.RandomConfigRange(bullet.DeviationAngleRange); - if (TriggerRole != null) - { - deviationAngle = TriggerRole.RoleState.CalcBulletDeviationAngle(this, deviationAngle); - } - - data.Rotation = fireRotation + Mathf.DegToRad(deviationAngle); - //创建激光 - var laser = ResourceManager.LoadAndInstantiate(bullet.Prefab); - laser.AddToActivityRoot(RoomLayerEnum.YSortLayer); - laser.InitData(data, GetAttackLayer(), 3); - return laser; - } //-------------------------------- Ai相关 ----------------------------- diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon_Bullet.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon_Bullet.cs new file mode 100644 index 0000000..20c0456 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon_Bullet.cs @@ -0,0 +1,142 @@ + +using Config; +using Godot; + +public partial class Weapon +{ + //-------------------------------- 子弹相关 ----------------------------- + + /// + /// 投抛弹壳的默认实现方式, shellId为弹壳id + /// + protected ActivityObject ThrowShell(ExcelConfig.ActivityBase shell, float speedScale = 1) + { + var startPos = ShellPoint.GlobalPosition; + float startHeight; + if (Master != null) + { + var shellPosition = (Master != null ? Master.MountPoint.Position : Position) + ShellPoint.Position; + startHeight = -shellPosition.Y; + startPos.Y += startHeight; + } + else + { + startHeight = Altitude; + } + + var direction = GlobalRotationDegrees + Utils.Random.RandomRangeInt(-30, 30) + 180; + var verticalSpeed = Utils.Random.RandomRangeInt((int)(60 * speedScale), (int)(120 * speedScale)); + var velocity = new Vector2(Utils.Random.RandomRangeInt((int)(20 * speedScale), (int)(60 * speedScale)), 0).Rotated(direction * Mathf.Pi / 180); + var rotate = Utils.Random.RandomRangeInt((int)(-720 * speedScale), (int)(720 * speedScale)); + var shellInstance = Create(shell); + shellInstance.Rotation = (Master != null ? Master.MountPoint.RealRotation : Rotation); + shellInstance.Throw(startPos, startHeight, verticalSpeed, velocity, rotate); + shellInstance.InheritVelocity(Master != null ? Master : this); + if (Master == null) + { + AffiliationArea.InsertItem(shellInstance); + } + else + { + Master.AffiliationArea.InsertItem(shellInstance); + } + + return shellInstance; + } + + /// + /// 发射子弹 + /// + protected IBullet ShootBullet(float fireRotation, ExcelConfig.BulletBase bullet) + { + if (bullet.Type == 1) //实体子弹 + { + return ShootSolidBullet(fireRotation, bullet); + } + else if (bullet.Type == 2) //激光子弹 + { + return ShootLaser(fireRotation, bullet); + } + + return null; + } + + /// + /// 发射子弹的默认实现方式 + /// + private Bullet ShootSolidBullet(float fireRotation, ExcelConfig.BulletBase bullet) + { + var data = new BulletData() + { + Weapon = this, + BulletBase = bullet, + TriggerRole = TriggerRole, + Harm = Utils.Random.RandomConfigRange(bullet.HarmRange), + Repel = Utils.Random.RandomConfigRange(bullet.RepelRange), + MaxDistance = Utils.Random.RandomConfigRange(bullet.DistanceRange), + FlySpeed = Utils.Random.RandomConfigRange(bullet.SpeedRange), + VerticalSpeed = Utils.Random.RandomConfigRange(bullet.VerticalSpeed), + BounceCount = Utils.Random.RandomConfigRange(bullet.BounceCount), + Penetration = Utils.Random.RandomConfigRange(bullet.Penetration), + Position = FirePoint.GlobalPosition, + }; + + var deviationAngle = Utils.Random.RandomConfigRange(bullet.DeviationAngleRange); + if (TriggerRole != null) + { + var roleState = TriggerRole.RoleState; + data.Harm = roleState.CalcDamage(data.Harm); + data.Repel = roleState.CalcBulletRepel(this, data.Repel); + data.FlySpeed = roleState.CalcBulletSpeed(this, data.FlySpeed); + data.MaxDistance = roleState.CalcBulletDistance(this, data.MaxDistance); + deviationAngle = roleState.CalcBulletDeviationAngle(this, deviationAngle); + + if (TriggerRole.IsAi) //只有玩家使用该武器才能获得正常速度的子弹 + { + data.FlySpeed *= AiUseAttribute.AiAttackAttr.BulletSpeedScale; + } + } + + + data.Rotation = fireRotation + Mathf.DegToRad(deviationAngle); + //创建子弹 + var bulletInstance = Create(bullet.Prefab); + bulletInstance.InitData(data, GetAttackLayer()); + return bulletInstance; + } + + /// + /// 发射射线的默认实现方式 + /// + private Laser ShootLaser(float fireRotation, ExcelConfig.BulletBase bullet) + { + var data = new BulletData() + { + Weapon = this, + BulletBase = bullet, + TriggerRole = TriggerRole, + Harm = Utils.Random.RandomConfigRange(bullet.HarmRange), + Repel = Utils.Random.RandomConfigRange(bullet.RepelRange), + MaxDistance = Utils.Random.RandomConfigRange(bullet.DistanceRange), + BounceCount = Utils.Random.RandomConfigRange(bullet.BounceCount), + LifeTime = Utils.Random.RandomConfigRange(bullet.LifeTimeRange), + Position = FirePoint.GlobalPosition, + }; + + var deviationAngle = Utils.Random.RandomConfigRange(bullet.DeviationAngleRange); + if (TriggerRole != null) + { + var roleState = TriggerRole.RoleState; + data.Harm = roleState.CalcDamage(data.Harm); + data.Repel = roleState.CalcBulletRepel(this, data.Repel); + deviationAngle = roleState.CalcBulletDeviationAngle(this, deviationAngle); + } + + data.Rotation = fireRotation + Mathf.DegToRad(deviationAngle); + //创建激光 + var laser = ResourceManager.LoadAndInstantiate(bullet.Prefab); + laser.AddToActivityRoot(RoomLayerEnum.YSortLayer); + laser.InitData(data, GetAttackLayer(), 3); + return laser; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/data/BulletData.cs b/DungeonShooting_Godot/src/game/data/BulletData.cs index e15913f..a8895d9 100644 --- a/DungeonShooting_Godot/src/game/data/BulletData.cs +++ b/DungeonShooting_Godot/src/game/data/BulletData.cs @@ -23,14 +23,14 @@ public Role TriggerRole; /// - /// 最小伤害 + /// 造成的伤害 /// - public int MinHarm; - + public int Harm; + /// - /// 最大伤害 + /// 击退值 /// - public int MaxHarm; + public float Repel; /// /// 最大飞行距离 @@ -53,6 +53,11 @@ public int BounceCount; /// + /// 子弹最大穿透次数 + /// + public float Penetration; + + /// /// 子弹最大存在时间 /// public float LifeTime;