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;