From 6a9d10183373b7c9b94b461cb5b3efd37682f0b0 Mon Sep 17 00:00:00 2001 From: oldpeper <96619050+oldpeper@users.noreply.github.com> Date: Mon, 9 Dec 2024 11:19:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=87=E4=BB=BD=E6=9C=80=E6=96=B0=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Blacksmith/Assets/Pack/Prefab/Buttle.prefab | 168 +++++++++++++++++ .../Assets/Pack/Prefab/Buttle.prefab.meta | 7 + .../Assets/Pack/Prefab/Mouster/mouster.prefab | 71 ++++++- .../Assets/Pack/Prefab/player/player.prefab | 64 +++++++ Blacksmith/Assets/Scenes/SampleScene.unity | 28 +-- Blacksmith/Assets/Script/BDebug.cs | 5 + .../Assets/Script/Battle/BattleManager.cs | 173 +++++++++++++---- Blacksmith/Assets/Script/Battle/Bullet.cs | 56 ++++++ .../Assets/Script/Battle/Bullet.cs.meta | 11 ++ .../Assets/Script/Battle/Mouster/Mouster.cs | 14 +- .../Assets/Script/Battle/MousterTeam.cs | 28 +++ .../Assets/Script/Battle/Player/PlayerItem.cs | 49 +++++ Blacksmith/Assets/Script/PrefabPool.cs | 48 +++-- ...kageManifest_DefaultPackage_Simulate.bytes | Bin 784 -> 976 bytes ...ckageManifest_DefaultPackage_Simulate.hash | 2 +- ...ckageManifest_DefaultPackage_Simulate.json | 25 ++- Blacksmith/MiniTemplate/Datas/关卡掉落表.xlsx | Bin 0 -> 17832 bytes Blacksmith/MiniTemplate/Datas/关卡波次表.xlsx | Bin 32624 -> 37340 bytes Blacksmith/MiniTemplate/Datas/关卡表.xlsx | Bin 12518 -> 12658 bytes Blacksmith/MiniTemplate/Datas/商城表.xlsx | Bin 0 -> 12761 bytes Blacksmith/MiniTemplate/Datas/商城随机表.xlsx | Bin 0 -> 13994 bytes Blacksmith/MiniTemplate/Datas/场景表.xlsx | Bin 0 -> 10444 bytes Blacksmith/MiniTemplate/Datas/开店NPC表.xlsx | Bin 10815 -> 10886 bytes Blacksmith/MiniTemplate/Datas/怪物表.xlsx | Bin 74934 -> 70506 bytes Blacksmith/MiniTemplate/Datas/技能体表.xlsx | Bin 13474 -> 13478 bytes .../MiniTemplate/Datas/技能肉鸽经验表.xlsx | Bin 0 -> 12438 bytes Blacksmith/MiniTemplate/Datas/技能肉鸽表.xlsx | Bin 14535 -> 14535 bytes Blacksmith/MiniTemplate/Datas/技能表.xlsx | Bin 18259 -> 18307 bytes Blacksmith/MiniTemplate/Datas/抽奖奖品表.xlsx | Bin 0 -> 11406 bytes Blacksmith/MiniTemplate/Datas/抽奖表.xlsx | Bin 0 -> 12499 bytes Blacksmith/MiniTemplate/Datas/武器属性表.xlsx | Bin 25609 -> 25594 bytes Blacksmith/MiniTemplate/Datas/武器技能表.xlsx | Bin 10776 -> 10777 bytes Blacksmith/MiniTemplate/Datas/武器表.xlsx | Bin 13034 -> 13104 bytes Blacksmith/MiniTemplate/Datas/礼包表.xlsx | Bin 0 -> 12519 bytes Blacksmith/MiniTemplate/Datas/角色表.xlsx | Bin 0 -> 10379 bytes Blacksmith/MiniTemplate/Datas/道具表.xlsx | Bin 16798 -> 16352 bytes .../UserSettings/Layouts/default-2022.dwlt | 178 +++++++++--------- 37 files changed, 760 insertions(+), 167 deletions(-) create mode 100644 Blacksmith/Assets/Pack/Prefab/Buttle.prefab create mode 100644 Blacksmith/Assets/Pack/Prefab/Buttle.prefab.meta create mode 100644 Blacksmith/Assets/Script/Battle/Bullet.cs create mode 100644 Blacksmith/Assets/Script/Battle/Bullet.cs.meta create mode 100644 Blacksmith/MiniTemplate/Datas/关卡掉落表.xlsx create mode 100644 Blacksmith/MiniTemplate/Datas/商城表.xlsx create mode 100644 Blacksmith/MiniTemplate/Datas/商城随机表.xlsx create mode 100644 Blacksmith/MiniTemplate/Datas/场景表.xlsx create mode 100644 Blacksmith/MiniTemplate/Datas/技能肉鸽经验表.xlsx create mode 100644 Blacksmith/MiniTemplate/Datas/抽奖奖品表.xlsx create mode 100644 Blacksmith/MiniTemplate/Datas/抽奖表.xlsx create mode 100644 Blacksmith/MiniTemplate/Datas/礼包表.xlsx create mode 100644 Blacksmith/MiniTemplate/Datas/角色表.xlsx diff --git a/Blacksmith/Assets/Pack/Prefab/Buttle.prefab b/Blacksmith/Assets/Pack/Prefab/Buttle.prefab new file mode 100644 index 00000000..9b6b190b --- /dev/null +++ b/Blacksmith/Assets/Pack/Prefab/Buttle.prefab @@ -0,0 +1,168 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &4242684317348474596 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8340748226692247503} + - component: {fileID: 2193559726886732247} + - component: {fileID: 7756983643709839505} + m_Layer: 0 + m_Name: Buttle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &8340748226692247503 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4242684317348474596} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 9085113183165815074} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2193559726886732247 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4242684317348474596} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 722b0c792bd606a4590909aff1110a42, type: 3} + m_Name: + m_EditorClassIdentifier: + _sprite: {fileID: 1568058238041260136} +--- !u!58 &7756983643709839505 +CircleCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4242684317348474596} + m_Enabled: 1 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 1 + m_UsedByEffector: 0 + m_UsedByComposite: 0 + m_Offset: {x: 0, y: 0} + serializedVersion: 2 + m_Radius: 0.5 +--- !u!1 &7731706439739415355 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9085113183165815074} + - component: {fileID: 1568058238041260136} + m_Layer: 0 + m_Name: 9-Sliced + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9085113183165815074 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7731706439739415355} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8340748226692247503} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &1568058238041260136 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7731706439739415355} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 4 + m_Sprite: {fileID: -5177388603050735206, guid: 8884154dfe85442a3a3578be807dbcdf, type: 3} + m_Color: {r: 0.06732824, g: 0.12882634, b: 0.8396226, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 2 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 diff --git a/Blacksmith/Assets/Pack/Prefab/Buttle.prefab.meta b/Blacksmith/Assets/Pack/Prefab/Buttle.prefab.meta new file mode 100644 index 00000000..5d0697d3 --- /dev/null +++ b/Blacksmith/Assets/Pack/Prefab/Buttle.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 96fdc88cb421d784a9bd971fc6dcc2ec +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Blacksmith/Assets/Pack/Prefab/Mouster/mouster.prefab b/Blacksmith/Assets/Pack/Prefab/Mouster/mouster.prefab index 40c24a64..55aa220f 100644 --- a/Blacksmith/Assets/Pack/Prefab/Mouster/mouster.prefab +++ b/Blacksmith/Assets/Pack/Prefab/Mouster/mouster.prefab @@ -138,13 +138,15 @@ GameObject: - component: {fileID: 5537344553321071934} - component: {fileID: 731921618462809821} - component: {fileID: 1151588281664711620} + - component: {fileID: 8167203040827974690} + - component: {fileID: 5044662577549088348} m_Layer: 0 m_Name: mouster m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &5537344553321071934 Transform: m_ObjectHideFlags: 0 @@ -231,3 +233,70 @@ MonoBehaviour: strength: 0 dexterity: 0 criticalStrike: 0 + entity: + hp: 0 + injured: 0 + cd: 0 + nextAttack: 0 +--- !u!58 &8167203040827974690 +CircleCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4177370848473932766} + m_Enabled: 1 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_UsedByComposite: 0 + m_Offset: {x: 0, y: 0} + serializedVersion: 2 + m_Radius: 0.5 +--- !u!50 &5044662577549088348 +Rigidbody2D: + serializedVersion: 4 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4177370848473932766} + m_BodyType: 0 + m_Simulated: 1 + m_UseFullKinematicContacts: 0 + m_UseAutoMass: 0 + m_Mass: 1 + m_LinearDrag: 0 + m_AngularDrag: 0.05 + m_GravityScale: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_Interpolate: 0 + m_SleepingMode: 1 + m_CollisionDetection: 0 + m_Constraints: 7 diff --git a/Blacksmith/Assets/Pack/Prefab/player/player.prefab b/Blacksmith/Assets/Pack/Prefab/player/player.prefab index a45043b0..a2c48445 100644 --- a/Blacksmith/Assets/Pack/Prefab/player/player.prefab +++ b/Blacksmith/Assets/Pack/Prefab/player/player.prefab @@ -11,6 +11,8 @@ GameObject: - component: {fileID: 7977988578914188099} - component: {fileID: 2859255379752948725} - component: {fileID: 2502596842607686182} + - component: {fileID: 7804527126073873689} + - component: {fileID: 4310192076672108997} m_Layer: 0 m_Name: player m_TagString: Untagged @@ -97,3 +99,65 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 08c739e0deb0ffc468a5e540d85493d6, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!58 &7804527126073873689 +CircleCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5832841353692456753} + m_Enabled: 1 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_UsedByComposite: 0 + m_Offset: {x: 0, y: 0} + serializedVersion: 2 + m_Radius: 0.5 +--- !u!50 &4310192076672108997 +Rigidbody2D: + serializedVersion: 4 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5832841353692456753} + m_BodyType: 0 + m_Simulated: 1 + m_UseFullKinematicContacts: 0 + m_UseAutoMass: 0 + m_Mass: 1 + m_LinearDrag: 0 + m_AngularDrag: 0.05 + m_GravityScale: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_Interpolate: 0 + m_SleepingMode: 1 + m_CollisionDetection: 0 + m_Constraints: 7 diff --git a/Blacksmith/Assets/Scenes/SampleScene.unity b/Blacksmith/Assets/Scenes/SampleScene.unity index 4f0228d2..dac97b17 100644 --- a/Blacksmith/Assets/Scenes/SampleScene.unity +++ b/Blacksmith/Assets/Scenes/SampleScene.unity @@ -713,7 +713,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalScale: {x: 10, y: 10, z: 10} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1446036770} @@ -1125,7 +1125,7 @@ Transform: m_GameObject: {fileID: 149161982} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 5.84, z: 0} + m_LocalPosition: {x: 0, y: 52.1, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1159,7 +1159,7 @@ Transform: m_GameObject: {fileID: 165722399} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 2.17, y: 0, z: 0} + m_LocalPosition: {x: 21, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -2103,7 +2103,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0.00006866455} + m_AnchoredPosition: {x: 0, y: 0.00004777339} m_SizeDelta: {x: 0, y: 300} m_Pivot: {x: 0, y: 1} --- !u!1 &252864277 @@ -4622,7 +4622,7 @@ Camera: far clip plane: 1000 field of view: 60 orthographic: 1 - orthographic size: 5 + orthographic size: 54.101566 m_Depth: -1 m_CullingMask: serializedVersion: 2 @@ -7931,7 +7931,7 @@ Transform: m_GameObject: {fileID: 899280137} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: -4.49, z: 0} + m_LocalPosition: {x: 0, y: -51.3, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -10301,7 +10301,7 @@ MonoBehaviour: m_HandleRect: {fileID: 16380662} m_Direction: 2 m_Value: 0 - m_Size: 1 + m_Size: 0.9999967 m_NumberOfSteps: 0 m_OnValueChanged: m_PersistentCalls: @@ -13927,13 +13927,17 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6049ba73a04f7b4798beb79ef800b99, type: 3} m_Name: m_EditorClassIdentifier: - mousterPoint: {fileID: 0} - mousters: [] + mousterPoint: {fileID: 494981768} + mousters: + - {fileID: 1928285456} + - {fileID: 372373523} + - {fileID: 165722400} playerParent: - {fileID: 1148942016} - {fileID: 1708146007} - {fileID: 2021164979} _mousters: [] + lookVec: {x: 0, y: 1, z: 0} --- !u!4 &1446036770 Transform: m_ObjectHideFlags: 0 @@ -17704,7 +17708,7 @@ Transform: m_GameObject: {fileID: 1708146006} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -1.53, y: 0, z: 0} + m_LocalPosition: {x: -24.5, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -20843,7 +20847,7 @@ Transform: m_GameObject: {fileID: 1928285455} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -1.97, y: 0, z: 0} + m_LocalPosition: {x: -20.2, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -22565,7 +22569,7 @@ Transform: m_GameObject: {fileID: 2021164978} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1.18, y: 0, z: 0} + m_LocalPosition: {x: 21.9, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] diff --git a/Blacksmith/Assets/Script/BDebug.cs b/Blacksmith/Assets/Script/BDebug.cs index a5eece72..dc7bd2ed 100644 --- a/Blacksmith/Assets/Script/BDebug.cs +++ b/Blacksmith/Assets/Script/BDebug.cs @@ -11,6 +11,11 @@ public static class BDebug #endif } + public static void LogWarning(object obj) + { + Debug.LogWarning(obj); + } + public static void LogError( object obj) { Debug.LogError(obj); diff --git a/Blacksmith/Assets/Script/Battle/BattleManager.cs b/Blacksmith/Assets/Script/Battle/BattleManager.cs index f8e86c5e..3fd607eb 100644 --- a/Blacksmith/Assets/Script/Battle/BattleManager.cs +++ b/Blacksmith/Assets/Script/Battle/BattleManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using cfg; using cfg.BlacksmithData; using Unity.Mathematics; @@ -14,6 +15,7 @@ public class BattleManager : MonoBehaviour [SerializeField] private Transform[] mousters; [SerializeField] private Transform[] playerParent; + public List Mousters => _mousters; [SerializeField] private List _mousters=new List(); [SerializeField] @@ -22,11 +24,14 @@ public class BattleManager : MonoBehaviour [SerializeField] private PlayerRunState[] playerItems; [SerializeField] private List _mousterTeams = new List(); + [SerializeField] private List _bullets = new List(); public float NowTime => nowTime; private float nowTime=0; public int HP => hp; private int hp; + public int Injured => injured; + private int injured; private bool player = false; private int mousterIndex=0; public BattleEquipment[] BattleEquipments => _battleEquipments; @@ -68,6 +73,8 @@ public class BattleManager : MonoBehaviour _battleEquipments[i] = new BattleEquipment(); } + _battleEquipments[0].SetLock(true); + openVideoWeaponry = false; openVideoSoldier = false; } @@ -84,6 +91,10 @@ public class BattleManager : MonoBehaviour public void OpenVideoSoldierEvent() { openVideoSoldier = true; + foreach (var battle in _battleEquipments) + { + battle.SetLock(true); + } } /// /// 设置道具到指定单位 @@ -225,27 +236,37 @@ public class BattleManager : MonoBehaviour } hp = allHP; + injured = 0; BDebug.Log(hp); nowTime = 0; playerItems = new PlayerRunState[playerParent.Length]; for (int i = 0; i < playerParent.Length; i++) { var index = i; - PrefabPool.ins.LoadObj("Battle_player", (GameObject obj) => + if (BattleEquipments[i].EquipmentLock) { - obj.transform.parent = playerParent[index]; - obj.transform.localPosition=Vector3.zero; - playerItems[index] = new PlayerRunState(); - playerItems[index].player = obj.GetComponent(); - playerItems[index].equipent = BattleEquipments[index]; - playerItems[index].equipent.RestSkill(); - }); + PrefabPool.ins.LoadObj("Battle_player", (GameObject obj) => + { + obj.transform.parent = playerParent[index]; + obj.transform.localPosition=Vector3.zero; + playerItems[index] = new PlayerRunState(); + playerItems[index].player = obj.GetComponent(); + playerItems[index].equipent = BattleEquipments[index]; + playerItems[index].RestState(); + + }); + } } ResetLevelMouster(); player = true; } + public void SetInjured(int num) + { + injured += num; + } + void ResetLevelMouster() { mousterIndex = 0; @@ -280,11 +301,11 @@ public class BattleManager : MonoBehaviour nowTime += Time.deltaTime; foreach (var mouster in _mousters) { - AxisLookAt(mouster.transform, playerParent[0].position); mouster.Move(playerParent[0]); } TeamUpdate(); + BulletUpdata(); if (playerItems!=null) { foreach (var player in playerItems) @@ -314,31 +335,84 @@ public class BattleManager : MonoBehaviour mousterIndex++; } } + else + { + var bo = true; + foreach (var unused in _mousterTeams.Where(mouster => mouster.Type!=MousterTeamType.end)) + { + bo = false; + } + + if (bo) + { + BDebug.LogWarning("end"); + } + } + } + + public void BulletUpdata() + { + for (int i = _bullets.Count-1; i >= 0; i--) + { + _bullets[i].BulletUpdate(); + } + } + public void AddBullets(Bullet bullet ) + { + _bullets.Add(bullet); + } + + public void RemoveBullets(Bullet bullet) + { + _bullets.Remove(bullet); + PrefabPool.ins.RecycleObj(bullet.gameObject); } public void AddMouster() { + var index = mousterIndex; foreach (var entity in _mousterTeams[mousterIndex].moustList) { + PrefabPool.ins.LoadObj(entity._data.Prefab, (GameObject obj) => { obj.transform.parent = mousterPoint; - obj.transform.position=mousters[Random.Range(0,mousters.Length)].position; + var pos = new Vector3(Random.Range(mousters[0].position.x, mousters[1].position.x), + Random.Range(mousters[0].position.y, mousters[1].position.y), 0); + obj.transform.position=pos; + AxisLookAt(obj.transform, obj.transform.position - new Vector3(0, 2, 0)); var m = obj.GetComponent(); m.InitMousterData(entity); _mousters.Add(m); + _mousterTeams[index].AddObj(m); }); } } public void RemoveMouster(Mouster obj) { + var index = mousterIndex; + if (mousterIndex>=MousterCount) + { + index = mousterIndex - 1; + } + + bool bo = false; + foreach (var mouster in _mousterTeams) + { + mouster.Remove(obj,ref bo); + if (bo) + { + break; + } + } _mousters.Remove(obj); PrefabPool.ins.RecycleObj(obj.gameObject); } - void AxisLookAt(Transform tr_self, Vector3 lookPos) + public void AxisLookAt(Transform tr_self, Vector3 lookPos) { Vector3 dir = lookPos - tr_self.position; + dir.z = 0; float angle = Vector3.SignedAngle(Vector3.up, dir, Vector3.forward); Quaternion rotation = Quaternion.Euler(0, 0, angle); //将欧拉角转换为四元数 tr_self.rotation = rotation; @@ -355,6 +429,8 @@ public class BattleEquipment public int audioUniversalID=0; public int audioWeaponID=0; public int audioWeapon2ID=0; + public bool EquipmentLock => equipmentLock; + private bool equipmentLock = false; public SkillState Weapon => weapon; private SkillState weapon; public SkillState Weapon2 => weapon2; @@ -368,31 +444,36 @@ public class BattleEquipment public SkillState AudioWeapon2 => audioWeapon2; private SkillState audioWeapon2; + public void SetLock(bool bo) + { + equipmentLock = bo; + } + public void RestSkill() { if (weaponID!=0) { - weapon = new SkillState(weaponID); + weapon = new SkillState(weaponID,"weaponID"); } if (weapon2ID!=0) { - weapon2 = new SkillState(weapon2ID); + weapon2 = new SkillState(weapon2ID,"weapon2ID"); } if (armorID!=0) { - armor = new SkillState(armorID); + armor = new SkillState(armorID,"armorID"); } if (audioUniversalID!=0) { - audioUniversal = new SkillState(audioUniversalID); + audioUniversal = new SkillState(audioUniversalID,"audioUniversalID"); } if (audioWeaponID!=0) { - audioWeapon = new SkillState(audioWeaponID); + audioWeapon = new SkillState(audioWeaponID,"audioWeaponID"); } if (audioWeapon2ID!=0) { - audioWeapon2 = new SkillState(audioWeapon2ID); + audioWeapon2 = new SkillState(audioWeapon2ID,"audioWeapon2ID"); } } @@ -416,44 +497,57 @@ public class SkillState public SkillData data; public float cd; public float cdTime; - public List Actions = new List(); + public int Attack => attack; + private int attack = 0; + public float Ratio => ratio; + private float ratio = 1; + public List> Actions = new List>(); public List WaitActions = new List(); public bool SkillLock => skillLock; private bool skillLock = false; + public string Name => name; + private string name; - public SkillState(int _id) + public SkillState(int _id,string na) { if (_id==0) { id = 0; return; } + + name = na; id = _id; itemData = JsonTab.Instance.tables.Item.Get(id); var attributeData = JsonTab.Instance.tables.WeaponSkill.Get(id); + var weapon = + JsonTab.Instance.attributeData(itemData.Includearms, DataManager.GetDrawLevel(itemData.Includearms)); + attack = weapon.Attack; data = JsonTab.Instance.tables.Skill.Get(attributeData.Initialskill); + ratio = data.SkillDamage; cd = data.SkillCD / 10000; cdTime = BattleManager.ins.NowTime; - Actions = new List(); + Actions = new List>(); skillLock = false; } public void SkillCD() { - skillLock = false; + // skillLock = false; cdTime = BattleManager.ins.NowTime; + BDebug.LogWarning(name); foreach (var a in Actions) { - a?.Invoke(); + a?.Invoke(this); } } - public void AddAction(Action action) + public void AddAction(Action action) { Actions.Add(action); } - public void RemoveAction(Action action) + public void RemoveAction(Action action) { Actions.Remove(action); } @@ -469,23 +563,20 @@ public class SkillState public void SkillStateEvent() { - if (skillLock) - { - foreach (var a in WaitActions) - { - a?.Invoke(); - } - return; - } + // if (skillLock) + // { + // foreach (var a in WaitActions) + // { + // a?.Invoke(); + // } + // return; + // } if (BattleManager.ins.NowTime-cdTime>cd) { - skillLock = true; - foreach (var a in Actions) - { - a?.Invoke(); - } - + // skillLock = true; + SkillCD(); + } } } @@ -495,6 +586,12 @@ public class PlayerRunState public PlayerItem player; public BattleEquipment equipent; + public void RestState() + { + + equipent.RestSkill(); + player.SetData(equipent); + } public void RunTimeMove() { equipent.RunTime(); diff --git a/Blacksmith/Assets/Script/Battle/Bullet.cs b/Blacksmith/Assets/Script/Battle/Bullet.cs new file mode 100644 index 00000000..e5a78d01 --- /dev/null +++ b/Blacksmith/Assets/Script/Battle/Bullet.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using cfg.BlacksmithData; +using UnityEngine; + +public class Bullet : MonoBehaviour +{ + [SerializeField] private SpriteRenderer _sprite; + public int Attack => attack; + private int attack = 0; + private int num = 1; + public float Speed => speed; + private float speed=0; + public float NextTime; + private float time=0; + public bool Start => start; + private bool start=false; + + public void SetAttack(ItemData itemData, int a,float sp= 1,int nu=1) + { + _sprite.sprite = AssetBundleManager.ins.Sprite(itemData.Icon, AtlasType.ItemIcon); + attack = a; + speed = sp; + num = nu; + time = BattleManager.ins.NowTime + 10; + start = true; + } + + private void OnTriggerEnter2D(Collider2D other) + { + var mouster=other.GetComponent(); + if (!start|| mouster == null) return; + mouster.SetInjured(Attack); + num -= 1; + if (num<=0) + { + start = false; + BattleManager.ins.RemoveBullets(this); + } + } + + public void BulletUpdate() + { + if (!start) + { + return; + } + if (timeentity._data.Range) + if (transform.position.y - point.position.y>entity._data.Range) { - float dis = Vector3.Distance(transform.position, point.position); - transform.position=Vector3.Lerp(transform.position, point.position, entity._data.Move*Time.deltaTime/dis); + transform.Translate(transform.up * entity._data.Move* Time.deltaTime,Space.World); } else { if (entity.nextAttack moustList = new List(); + public List objlist = new List(); public MousterTeamType Type; public MousterTeamEventType EventType; public float dynamic = 0; @@ -76,6 +77,32 @@ public class MousterTeam { return moustList.Count(entity => !entity.Death); } + + public void AddObj(Mouster obj) + { + objlist.Add(obj); + } + + public void Remove(Mouster obj, ref bool bo) + { + if (Type == MousterTeamType.end) + { + return; + } + foreach (var m in objlist) + { + if (m==obj) + { + objlist.Remove(obj); + bo = true; + if (objlist.Count==0) + { + Type = MousterTeamType.end; + } + return; + } + } + } } [Serializable] @@ -107,6 +134,7 @@ public class MousterEntity public void SetInjured(int num) { + BDebug.Log(num); injured += num; if (injured <= hp) return; death = true; diff --git a/Blacksmith/Assets/Script/Battle/Player/PlayerItem.cs b/Blacksmith/Assets/Script/Battle/Player/PlayerItem.cs index 0795e83e..a9192b36 100644 --- a/Blacksmith/Assets/Script/Battle/Player/PlayerItem.cs +++ b/Blacksmith/Assets/Script/Battle/Player/PlayerItem.cs @@ -1,15 +1,64 @@ +using System; using System.Collections; using System.Collections.Generic; +using cfg.BlacksmithData; using UnityEngine; +using Random = UnityEngine.Random; +using Vector3 = System.Numerics.Vector3; + /// /// 玩家战斗预制体资源 /// public class PlayerItem : MonoBehaviour { private BattleEquipment _battleEquipment; + [SerializeField] + private List _gameObjects = new List(); public void SetData(BattleEquipment battleData) { _battleEquipment = battleData; + if (_battleEquipment.Weapon!=null) + { + _battleEquipment.Weapon.AddAction(SkillEvent); + } + if (_battleEquipment.Weapon2!=null) + { + _battleEquipment.Weapon2.AddAction(SkillEvent); + } + if (_battleEquipment.Armor!=null) + { + _battleEquipment.Armor.AddAction(SkillEvent); + } + if (_battleEquipment.AudioUniversal!=null) + { + _battleEquipment.AudioUniversal.AddAction(SkillEvent); + } + if (_battleEquipment.AudioWeapon!=null) + { + _battleEquipment.AudioWeapon.AddAction(SkillEvent); + } + if (_battleEquipment.AudioWeapon2!=null) + { + _battleEquipment.AudioWeapon2.AddAction(SkillEvent); + } + + PrefabPool.ins.AddPond("Battle_Buttle", 12); } + + private void SkillEvent(SkillState data) + { + BDebug.LogWarning(data.Name); + PrefabPool.ins.LoadObj("Battle_Buttle", (GameObject obj) => + { + obj.transform.parent = transform; + obj.transform.localPosition = UnityEngine.Vector3.zero; + BattleManager.ins.AxisLookAt(obj.transform, + BattleManager.ins.Mousters[Random.Range(0, BattleManager.ins.MousterCount)].transform.position); + BDebug.Log(data.Attack + " "+data.Ratio); + obj.GetComponent().SetAttack(data.itemData,(int)(data.Attack*data.Ratio),10,1); + BattleManager.ins.AddBullets(obj.GetComponent()); + }); + } + } diff --git a/Blacksmith/Assets/Script/PrefabPool.cs b/Blacksmith/Assets/Script/PrefabPool.cs index d264c941..5555c3fb 100644 --- a/Blacksmith/Assets/Script/PrefabPool.cs +++ b/Blacksmith/Assets/Script/PrefabPool.cs @@ -6,45 +6,61 @@ using UnityEngine; public class PrefabPool : MonoBehaviour { public static PrefabPool ins; - private Dictionary> objDic; + private Dictionary> objDic; private void Awake() { ins = this; - objDic = new Dictionary>(); + objDic = new Dictionary>(); } public void LoadObj(string key,Action action) { - if (!objDic.ContainsKey(key)||objDic[key].Count==0) - { + //如果池中没有该游戏物体或者游戏物体的队列中已经没有剩余的游戏对象时。 + //在这种情况下需要实例化一个新的物体,然后在判断是否需要在池中新加一个健值对还是直接放入队列中去 + //然后把新生成的放入池中。 + if (!objDic.ContainsKey(key)||objDic[key].Count==0) { AssetBundleManager.ins.LoadAsset(key, (GameObject obj) => { obj.name = key; obj.SetActive(true); action.Invoke(obj); }); + return; } - else + + var obj = objDic[key].Dequeue(); + obj.SetActive(true); + action.Invoke(obj); + } + + public void AddPond(string key,int num) + { + AssetBundleManager.ins.LoadAsset(key, (GameObject obj) => { - var obj = objDic[key].Pop(); + obj.name = key; obj.SetActive(true); - action.Invoke(obj); - } + for (int i = 0; i < num-1; i++) + { + var a = Instantiate(obj, transform); + a.name = key; + RecycleObj(a); + } + }); } public void RecycleObj(GameObject obj) { - if (!objDic.ContainsKey(obj.name)) - { - var stack = new Stack(); - objDic.Add(obj.name,stack); + //由于生成的预制体的name后面都会加上(Clone),所以我们需要将其去除 + string name=obj.name; + + //如果不存在该类的游戏物体就在对象池中加入,存在则直接加入 + if (!objDic.ContainsKey(name)) { + objDic.Add(name, new Queue()); } obj.transform.parent = transform; - obj.transform.localPosition=Vector3.zero; - obj.SetActive(false); - - objDic[obj.name].Push(obj); + objDic[name].Enqueue(obj); + obj.SetActive(false);//记得将放入的游戏物体的属性设置为false } } diff --git a/Blacksmith/Bundles/WebGL/DefaultPackage/Simulate/PackageManifest_DefaultPackage_Simulate.bytes b/Blacksmith/Bundles/WebGL/DefaultPackage/Simulate/PackageManifest_DefaultPackage_Simulate.bytes index 38bd87371af5b3008d273edaae72315f1239e87d..e7cc39aa3941ad7468fbb0b5a75e0f5f0ae77d6c 100644 GIT binary patch delta 207 zcmXYoIS#@w6hyzxULYZQL`0P;i4!N-CE)^8wCH?avEb7`eb-Y5ojaNtOP{qF~I(%CIvT#NVp%qV=nG23m z898T87e?#UY5?K~L=oyMvgxz{pzR+-lhAWIlaV^@O=aH}0>~N1921@+m)6NO$x$^;cRApQF$J&kNCLHYNZ7 delta 56 zcmcb>K7nn56C=w+=aZ9D8RHolCm&^uXJukwU|^oC$&@_#GgA^%uH@u!<{aL4TtHD6 F006%w4DSE{ diff --git a/Blacksmith/Bundles/WebGL/DefaultPackage/Simulate/PackageManifest_DefaultPackage_Simulate.hash b/Blacksmith/Bundles/WebGL/DefaultPackage/Simulate/PackageManifest_DefaultPackage_Simulate.hash index 32175d29..ce98777b 100644 --- a/Blacksmith/Bundles/WebGL/DefaultPackage/Simulate/PackageManifest_DefaultPackage_Simulate.hash +++ b/Blacksmith/Bundles/WebGL/DefaultPackage/Simulate/PackageManifest_DefaultPackage_Simulate.hash @@ -1 +1 @@ -89268a239493235dff6299dffb3c7883 \ No newline at end of file +12546e258617ef4e0a8130d7caf429b3 \ No newline at end of file diff --git a/Blacksmith/Bundles/WebGL/DefaultPackage/Simulate/PackageManifest_DefaultPackage_Simulate.json b/Blacksmith/Bundles/WebGL/DefaultPackage/Simulate/PackageManifest_DefaultPackage_Simulate.json index 1215ea51..13b735a1 100644 --- a/Blacksmith/Bundles/WebGL/DefaultPackage/Simulate/PackageManifest_DefaultPackage_Simulate.json +++ b/Blacksmith/Bundles/WebGL/DefaultPackage/Simulate/PackageManifest_DefaultPackage_Simulate.json @@ -22,19 +22,26 @@ "AssetTags": [], "BundleID": 0 }, + { + "Address": "Battle_Buttle", + "AssetPath": "Assets/Pack/Prefab/Buttle.prefab", + "AssetGUID": "96fdc88cb421d784a9bd971fc6dcc2ec", + "AssetTags": [], + "BundleID": 1 + }, { "Address": "Battle_mouster", "AssetPath": "Assets/Pack/Prefab/Mouster/mouster.prefab", "AssetGUID": "6bc73daca7a89a34582f00eaf7bf39ce", "AssetTags": [], - "BundleID": 1 + "BundleID": 2 }, { "Address": "Battle_player", "AssetPath": "Assets/Pack/Prefab/player/player.prefab", "AssetGUID": "68c4f4b7b9e9eeb419816a6c216e8712", "AssetTags": [], - "BundleID": 2 + "BundleID": 3 } ], "BundleList": [ @@ -48,12 +55,22 @@ "Tags": [], "DependIDs": [] }, + { + "BundleName": "defaultpackage_assets_pack_prefab.bundle", + "UnityCRC": 0, + "FileHash": "514a5a045a49efe0ea3811a6f8235493", + "FileCRC": "00000000", + "FileSize": 4637, + "Encrypted": false, + "Tags": [], + "DependIDs": [] + }, { "BundleName": "defaultpackage_assets_pack_prefab_mouster.bundle", "UnityCRC": 0, "FileHash": "9c8871fcce83a92234cc8fc73595a93c", "FileCRC": "00000000", - "FileSize": 6509, + "FileSize": 8116, "Encrypted": false, "Tags": [], "DependIDs": [] @@ -63,7 +80,7 @@ "UnityCRC": 0, "FileHash": "7d484a4172c8e8d490265c4961bc812c", "FileCRC": "00000000", - "FileSize": 2798, + "FileSize": 4342, "Encrypted": false, "Tags": [], "DependIDs": [] diff --git a/Blacksmith/MiniTemplate/Datas/关卡掉落表.xlsx b/Blacksmith/MiniTemplate/Datas/关卡掉落表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..63a9464581bfa7ecf4282ca771839291c2d1febe GIT binary patch literal 17832 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 z