Assets/Resources/Prefabs/Endless/BubbleBomb.prefab
@@ -219,7 +219,6 @@ bShowDebugNode: 0 NormalEffect: {fileID: 5386092016719681635} ExplodeEffect: {fileID: 1333670259778310432} Collider: {fileID: 6659287669452185599} --- !u!54 &8434816861478773555 Rigidbody: m_ObjectHideFlags: 0 @@ -249,7 +248,7 @@ m_Radius: 2.2 m_Height: 1 m_Direction: 1 m_Center: {x: 0, y: 0.4, z: 0} m_Center: {x: 0, y: 0.4, z: -1.94} --- !u!114 &8434816861478773554 MonoBehaviour: m_ObjectHideFlags: 0 Assets/Resources/Prefabs/Endless/WoodPile.prefab
New file @@ -0,0 +1,496 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!1 &138455136374950083 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 8534711676145704198} - component: {fileID: 3143404536626948965} - component: {fileID: 8832774425949147379} m_Layer: 0 m_Name: Cube m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!4 &8534711676145704198 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 138455136374950083} m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} m_LocalPosition: {x: 0, y: 0.053, z: 0} m_LocalScale: {x: 1.5999999, y: 1.5999999, z: 1.6} m_Children: [] m_Father: {fileID: 8434816861478773449} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &3143404536626948965 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 138455136374950083} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!23 &8832774425949147379 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 138455136374950083} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - {fileID: 2100000, guid: 94110c9a997a3cf4d971aa75155f5351, type: 2} 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: 3 m_MinimumChartSize: 4 m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &8434816860007424699 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 8434816860007424696} m_Layer: 11 m_Name: Targetable m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!4 &8434816860007424696 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816860007424699} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0.5, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 8434816861478773449} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &8434816861478773448 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 8434816861478773449} - component: {fileID: 8434816861478773452} - component: {fileID: 8434816861478773455} - component: {fileID: 8434816861478773555} - component: {fileID: 7051272566736607782} - component: {fileID: 8434816861478773554} - component: {fileID: 2476106126470318335} - component: {fileID: 652547545057790155} - component: {fileID: 2034107896435957072} - component: {fileID: 7091940065452968968} - component: {fileID: 1083071696881444773} m_Layer: 11 m_Name: WoodPile m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!4 &8434816861478773449 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0.2, z: 0} m_LocalScale: {x: 4.5, y: 4.5, z: 4.5} m_Children: - {fileID: 8434816860007424696} - {fileID: 1277171420674534872} - {fileID: 9114815543095638400} - {fileID: 8534711676145704198} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!195 &8434816861478773452 NavMeshAgent: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} m_Enabled: 1 m_AgentTypeID: 0 m_Radius: 0.1 m_Speed: 2 m_Acceleration: 20 avoidancePriority: 50 m_AngularSpeed: 0 m_StoppingDistance: 0.4 m_AutoTraverseOffMeshLink: 1 m_AutoBraking: 1 m_AutoRepath: 1 m_Height: 1 m_BaseOffset: 0 m_WalkableMask: 7 m_ObstacleAvoidanceType: 0 --- !u!114 &8434816861478773455 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4a4f7293b07e4698a4e3b652679f0c75, type: 3} m_Name: m_EditorClassIdentifier: description: projectile: {fileID: 0} projectilePoints: [] epicenter: {fileID: 8434816861478773449} isMultiAttack: 0 maxAttackNum: 1 fireRate: 0 bWoodAffector: 0 randomAudioSource: {fileID: 0} towerTargetter: {fileID: 7490226013430720439} radiusEffectColor: {r: 0, g: 0, b: 0, a: 0} --- !u!54 &8434816861478773555 Rigidbody: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} serializedVersion: 2 m_Mass: 1 m_Drag: 0 m_AngularDrag: 0.05 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 --- !u!114 &7051272566736607782 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4eb6b59d40564378ba0b1580a4a9dd85, type: 3} m_Name: m_EditorClassIdentifier: lootDropped: 10 --- !u!114 &8434816861478773554 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 8cf1cc7cb7e6b49f893f609dd57fce01, type: 3} m_Name: m_EditorClassIdentifier: damageableBehaviour: {fileID: 0} damageScale: 1 --- !u!114 &2476106126470318335 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 7d012ff014d994436a27059a09e8ab64, type: 3} m_Name: m_EditorClassIdentifier: homeBaseAttackChargeTime: 1 --- !u!114 &652547545057790155 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 59d007c1fe5e41c1888e4af3392f8676, type: 3} m_Name: m_EditorClassIdentifier: initialPoolCapacity: 10 --- !u!114 &2034107896435957072 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fedeb0b3c5e104ea19d0d4599d22ab97, type: 3} m_Name: m_EditorClassIdentifier: damage: 10 damageMulti: 1 towerName: bSet: 0 chanceToSpawnCollisionPrefab: 1 collisionObj: {fileID: 0} alignment: unityObjectReference: {fileID: 11400000, guid: 9dc4735bf52f547d59ebe1007e9a0e7f, type: 2} --- !u!114 &7091940065452968968 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 74cdda61650491a4fb62ef5cac504f6e, type: 3} m_Name: m_EditorClassIdentifier: configuration: maxHealth: 60 startingHealth: 60 alignment: unityObjectReference: {fileID: 11400000, guid: 9dc4735bf52f547d59ebe1007e9a0e7f, type: 2} targetTransform: {fileID: 0} bElit: 0 bBoss: 0 poisonTex: {fileID: 0} frozenTex: {fileID: 0} commonTex: {fileID: 0} PoisonParticle: {fileID: 0} PoisonEndParticle: {fileID: 0} SlowDownParticle: {fileID: 0} FrostParticle: {fileID: 0} appliedEffectOffset: {x: 0, y: 0, z: 0} appliedEffectScale: 1 healthBar: {fileID: 9222104150701355608} spawnParticle: {fileID: 0} bShowDebugNode: 0 --- !u!65 &1083071696881444773 BoxCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8434816861478773448} m_Material: {fileID: 0} m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 m_Size: {x: 1.8, y: 1.8, z: 0.61} m_Center: {x: 0, y: 0, z: -1.15} --- !u!1 &8585545065585961043 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 1277171420674534872} - component: {fileID: 7490226013430720439} - component: {fileID: 833589883818491094} m_Layer: 0 m_Name: Targetter m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!4 &1277171420674534872 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8585545065585961043} 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_Children: [] m_Father: {fileID: 8434816861478773449} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &7490226013430720439 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8585545065585961043} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: d0e4035901ee40bba7c0866d2c6338a1, type: 3} m_Name: m_EditorClassIdentifier: turret: {fileID: 0} searchEnemyFunc: 1 turretXRotationRange: {x: 0, y: 359} onlyYTurretRotation: 1 searchRate: 0 idleRotationSpeed: 1 idleCorrectionTime: 0.2 attachedCollider: {fileID: 833589883818491094} idleWaitTime: 2 --- !u!135 &833589883818491094 SphereCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8585545065585961043} m_Material: {fileID: 0} m_IsTrigger: 1 m_Enabled: 1 serializedVersion: 2 m_Radius: 0 m_Center: {x: 0, y: 0, z: 0} --- !u!1001 &4198952192164864370 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: m_TransformParent: {fileID: 8434816861478773449} m_Modifications: - target: {fileID: 4912913822749028214, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_Name value: HealthBar objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_LocalPosition.y value: 1.5 objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_LocalPosition.z value: 0 objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_LocalRotation.x value: 0.7071068 objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_LocalRotation.y value: -0 objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_LocalRotation.z value: -0 objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_LocalRotation.w value: 0.7071068 objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_RootOrder value: 2 objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_LocalEulerAnglesHint.y value: 0 objectReference: {fileID: 0} - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - target: {fileID: 5025685238251000618, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} propertyPath: damageableBehaviour value: objectReference: {fileID: 7091940065452968968} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} --- !u!4 &9114815543095638400 stripped Transform: m_CorrespondingSourceObject: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} m_PrefabInstance: {fileID: 4198952192164864370} m_PrefabAsset: {fileID: 0} --- !u!114 &9222104150701355608 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 5025685238251000618, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3} m_PrefabInstance: {fileID: 4198952192164864370} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 5440fde571ec4db4a719f37df8e972f0, type: 3} m_Name: m_EditorClassIdentifier: Assets/Resources/Prefabs/Endless/WoodPile.prefab.meta
New file @@ -0,0 +1,7 @@ fileFormatVersion: 2 guid: debfb40db53346747839fbb2bba8eaf5 PrefabImporter: externalObjects: {} userData: assetBundleName: assetBundleVariant: Assets/Scenes/Levels/Battle/Endless.unity
@@ -17463,6 +17463,7 @@ - {fileID: 2600682549799167283, guid: 49b7c959ca8c2a04fb624bfcc4ae6d70, type: 3} - {fileID: 8299866977034198745, guid: 27794bd3f4607d24eb654bc09cab1b4d, type: 3} - {fileID: 6638534413219671158, guid: 080168af0fb1a0f48bd653b0def3737e, type: 3} - {fileID: 652547545057790155, guid: debfb40db53346747839fbb2bba8eaf5, type: 3} --- !u!4 &1991275771 Transform: m_ObjectHideFlags: 0 Assets/Scripts/ActionGameFramework/Health/DamageCollider.cs
@@ -54,7 +54,7 @@ var agent = this.gameObject.GetComponent<Agent>(); if (agent == null) return; BallisticProjectile ballistic = c.gameObject.GetComponent<BallisticProjectile>(); if (ballistic.IsHitEnemy) @@ -68,7 +68,7 @@ LazyLoad(); BallisticAttack ballisticAttack = damager.GetComponent<BallisticAttack>(); ballisticAttack.DealDamage((Targetable)damageableBehaviour); ballisticAttack.DealDamage((Targetable)damageableBehaviour, ballisticAttack.attributeId); damager.HasDamaged(c.transform.position, damageableBehaviour.configuration.alignmentProvider); } Assets/Scripts/Core/Health/DamageableBehaviour.cs
@@ -114,7 +114,7 @@ /// <summary> /// Fires the removed event /// </summary> void OnRemoved() protected void OnRemoved() { if (removed != null) { Assets/Scripts/Data/EndlessPortData.cs
@@ -177,6 +177,30 @@ } /// <summary> /// 根据关卡等级和波次获得该波次敌人的血量 /// </summary> /// <param name="level"></param> /// <param name="wave"></param> /// <param name="tunel">赛道</param> public static float GetWaveEnemiesHP(int level, int wave, int tunel) { List<List<EndlessPortConfig>> list = GetLevelWaveData(level); List<EndlessPortConfig> waveData = list[wave]; float hp = 0; for (int i = 0; i < waveData.Count; ++i) { if (waveData[i].Config.tunel == tunel) { hp = waveData[i].Config.b_hp; break; } } return hp; } /// <summary> /// 根据关卡等级、波次、赛道获得击杀敌人掉落的奖励列表 /// </summary> /// <param name="level">关卡等级</param> Assets/Scripts/Enum/SpawnAgentType.cs
@@ -13,7 +13,7 @@ // 泡泡炸弹,在PVE模式里面,boss技能可以召唤炸弹和木桩等 BubbleBomb, // 召唤木桩 // 木桩墙壁 WoodPile } } Assets/Scripts/Event/EventType.cs
@@ -65,6 +65,8 @@ EndlessLoseHeart, // 爱心为0 EndlessHeartAllLose, // 木桩墙壁被打死 EndlessWoodPileBeKilled, } } Assets/Scripts/TowerDefense/Agents/Agent.cs
@@ -401,7 +401,7 @@ /// 处理Agent的锁定Buf,播放特效,设置速度为零,并时间到达后重设数据。 /// </summary> /// <param name="binfo"></param> protected void SetAgentStopBuff(buffinfo binfo) protected virtual void SetAgentStopBuff(buffinfo binfo) { MoveStopTime = binfo.last / 1000; Assets/Scripts/TowerDefense/Agents/BubbleBombAgent.cs
@@ -1,3 +1,4 @@ using DG.Tweening; using Core.Utilities; using UnityEngine; @@ -104,7 +105,19 @@ protected override void Update() { } public override void Initialize() { this.configuration.bInvincible = true; mDefaultScale = this.transform.localScale; Sequence agentTweenSeq = DOTween.Sequence(); var ss = mDefaultScale * 0.3f; this.transform.localScale = this.transform.localScale * 0.3f; Tweener agScale = this.transform.DOScale(mDefaultScale, 0.3f); agentTweenSeq.Append(agScale); agentTweenSeq.AppendCallback(beDamageStart); } } } Assets/Scripts/TowerDefense/Agents/WoodPileAgent.cs
New file @@ -0,0 +1,114 @@ using Core.Utilities; using KTGMGemClient; using DG.Tweening; using UnityEngine; /** * 木桩墙壁 * @Author: chenxin * @Date: 2020-11-07 11:13:25 */ namespace TowerDefense.Agents { public class WoodPileAgent : Agent { /// <summary> /// 外部赋值,唯一标识一个泡泡炸弹代理 /// </summary> public int Id { get; set; } /// <summary> /// 木桩墙壁收到货塔攻击的额外伤害倍率 /// </summary> public float FireHurtRate { get; set; } /// <summary> /// Peforms the relevant path update /// 执行相关路径更新 /// </summary> protected override void PathUpdate() { } /// <summary> /// The behaviour for when the agent has been blocked /// 代理被阻止时的行为 /// </summary> protected override void OnPartialPathUpdate() { } protected override void Update() { } /// <summary> /// Stops the navMeshAgent and attempts to return to pool /// </summary> public override void Remove() { // 统一管理器内删除当前的Agent: AgentInsManager.instance.removeAgent(this); configuration.SetHealth(0); OnRemoved(); if (m_NavMeshAgent.enabled) { m_NavMeshAgent.isStopped = true; } m_NavMeshAgent.enabled = false; // 必须要重置数据,不然会有一系列的小Bug. this.m_CurrentNode = null; m_NextNode = null; this.liveID = this.liveID + 1; bInDeathAct = false; // 删除当前停止特效和状态. if (MoveStopTime > 0) MoveStopTime = 0.0f; Poolable.TryPool(gameObject); } protected override void SetAgentStopBuff(buffinfo binfo) { // 本来木桩也不会动 } /// <summary> /// Setup all the necessary parameters for this agent from configuration data /// </summary> public override void Initialize() { configuration.SetHealth(configuration.maxHealth); state = isPathBlocked ? State.OnPartialPath : State.OnCompletePath; // 设置一个DOTween队列,让场景内刷出来的Agent有一个变大淡出的效果,此时是无敌效果加持. this.configuration.bInvincible = true; mDefaultScale = this.transform.localScale; Sequence agentTweenSeq = DOTween.Sequence(); var ss = mDefaultScale * 0.3f; this.transform.localScale = this.transform.localScale * 0.3f; Tweener agScale = this.transform.DOScale(mDefaultScale, 0.3f); agentTweenSeq.Append(agScale); agentTweenSeq.AppendCallback(beDamageStart); this.nodeMoveUpdate = false; // 获取移动速度 fMoveSpeed = this.m_NavMeshAgent.speed / 2.0f; } public override void PlayDeath() { EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessWoodPileBeKilled, Id); Remove(); } } } Assets/Scripts/TowerDefense/Agents/WoodPileAgent.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 74cdda61650491a4fb62ef5cac504f6e MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs
@@ -36,7 +36,8 @@ /// 处理代理收到的伤害,这里需要判断代理的类型分别去处理 /// </summary> /// <param name="enemy"></param> public void DealDamage(Targetable enemy) /// <param name="attributeId">子弹的属性id</param> public void DealDamage(Targetable enemy, int attributeId = -1) { switch ((enemy as Agent).AgentType) { @@ -47,11 +48,31 @@ HandleBubbleBomb(enemy); break; case SpawnAgentType.WoodPile: HandleWoodPile(enemy, attributeId); break; } } /// <summary> /// 处理木桩墙壁收到的伤害 /// </summary> /// <param name="enemy"></param> private void HandleWoodPile(Targetable enemy, int id) { float finalDamage = damager.finalDamage; if (id == 10101) finalDamage *= (enemy as WoodPileAgent).FireHurtRate; int tid = enemy.liveID; Vector3 backPos = enemy.position; // 这里也可以把碰撞点传进来 enemy.TakeDamage(finalDamage, enemy.position, damager.alignmentProvider); EndlessGameUI.instance.generateBloodText(backPos, finalDamage); } /// <summary> /// 处理泡泡炸弹收到的伤害 /// </summary> /// <param name="enemy"></param> Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillBubbleBomb.cs
@@ -12,6 +12,9 @@ */ namespace KTGMGemClient { /// <summary> /// 泡泡炸弹配置数据 /// </summary> public class BubbleBombConfig { public BubbleBombAgent Agent { get; set; } @@ -81,10 +84,7 @@ public class BossSkillBubbleBomb : EndlessBossSkill { public BossSkillBubbleBomb(boss_skill param) : base(param) { random = new System.Random(); } public BossSkillBubbleBomb(boss_skill param) : base(param) { } /// <summary> /// 被攻击的次数 @@ -97,8 +97,6 @@ /// 所有存在于场景中的泡泡炸弹 /// </summary> protected List<BubbleBombConfig> bubbleBombList; protected System.Random random; /// <summary> /// 泡泡炸弹对象池 @@ -118,7 +116,6 @@ { base.ReleaseSkill(); Debug.Log("--------------------- 泡泡炸弹释放 ---------------------"); // cx test SpawnBubbleBomb(); } @@ -159,6 +156,7 @@ bubbleBomb.AgentType = SpawnAgentType.BubbleBomb; bubbleBomb.opponentAgent = false; bubbleBomb.Reset(); bubbleBomb.Initialize(); // 出生位置 Vector3 spawnPosition = EndlessLevelManager.instance.GetTunelWorldPosition(tunelIdList[i], (EndlessBossSkillTunelType)SkillData.target[1]); @@ -176,39 +174,6 @@ config.MoveSpeed = SkillData.effect[1]; bubbleBombList.Add(config); } } /// <summary> /// 获取赛道列表 /// </summary> protected List<int> GetTunelList() { List<int> tunelIdList = new List<int>(); int count = 0; // 剩余没有用到的赛道 List<int> remainList = new List<int>() { 1, 2, 3, 4, 5 }; for (int i = 0; i < SkillData.tunnel.Count; ++i) { // 统计6这种类型的数量 if (SkillData.tunnel[i] == 6) { ++count; continue; } tunelIdList.Add(SkillData.tunnel[i]); remainList.Remove(SkillData.tunnel[i]); } for (int i = 0; i < count; ++i) { int num = random.Next(remainList.Count); tunelIdList.Add(remainList[num]); remainList.Remove(remainList[num]); } return tunelIdList; } public override void Reset() @@ -338,6 +303,7 @@ if (config.Agent.bInDeathState) return; ++config.AttackCount; Debug.Log($"--------------------- BubbleBombAgent Id: {id}, AttackCount:{config.AttackCount} ---------------------"); if (config.AttackCount >= config.NeedAttackCount) AgentDead(config); Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillWoodPile.cs
@@ -1,7 +1,11 @@ using System.Collections.Generic; using UnityEngine; using Core.Utilities; using TowerDefense.Agents; using TowerDefense.Level; /** * 召唤木桩 * 召唤木桩墙壁 * @Author: chenxin * @Date: 2020-11-02 17:15:39 */ @@ -11,23 +15,102 @@ { public BossSkillWoodPile(boss_skill param) : base(param) { } protected string prefabPath = "Prefabs/Endless/WoodPile"; /// <summary> /// 保存所有还在场景中的agent用于清理 /// </summary> protected List<WoodPileAgent> agentList; /// <summary> /// 释放技能 /// </summary> public override void ReleaseSkill() { base.ReleaseSkill(); SpawnOnTunel(); } protected void SpawnOnTunel() { List<int> tunelIdList = GetTunelList(); GameObject prefab = Resources.Load<GameObject>(prefabPath); for (int i = 0; i < tunelIdList.Count; ++i) { GameObject obj = Poolable.TryGetPoolable(prefab); WoodPileAgent agent = obj.GetComponent<WoodPileAgent>(); agent.Id = GameUtils.GetId(); agent.waveLineID = tunelIdList[i] - 1; agent.AgentType = SpawnAgentType.WoodPile; agent.opponentAgent = false; agent.FireHurtRate = SkillData.effect[1]; Vector3 spawnPosition = EndlessLevelManager.instance.GetTunelWorldPosition(tunelIdList[i], (EndlessBossSkillTunelType)SkillData.target[1]); obj.transform.position = spawnPosition; agent.Initialize(); float enemiesTotalHP = EndlessPortData.GetWaveEnemiesHP(EndlessLevelManager.instance.CurrentLevel, EndlessLevelManager.instance.WaveManager.CurrentWaveIndex, tunelIdList[i]); // 当前波次怪物 * 倍数 float hp = enemiesTotalHP * SkillData.effect[0]; agent.SetAgentData(hp, 0, 0); AgentInsManager.instance.addAgent(agent); agentList.Add(agent); } } public override void Init() { base.Init(); Debug.Log("--------------------- 召唤木桩技能初始化 ---------------------"); agentList = new List<WoodPileAgent>(); } public override void Update(float deltaTime) protected override void AddEvent() { IsCDCompleted = false; EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.EndlessWoodPileBeKilled, OnWoodPileAgentRemoved); } protected override void RemoveEvent() { EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.EndlessWoodPileBeKilled, OnWoodPileAgentRemoved); } private void OnWoodPileAgentRemoved(int id) { for (int i = 0; i < agentList.Count; ++i) { if (agentList[i].Id == id) { agentList.Remove(agentList[i]); break; } } } public override void Reset() { base.Reset(); ClearWoodPileAgents(); } public override void Clear() { base.Clear(); ClearWoodPileAgents(); } /// <summary> /// 清理在场景中的所有木桩墙壁 /// </summary> private void ClearWoodPileAgents() { while (agentList.Count > 0) { agentList[0].Remove(); agentList.Remove(agentList[0]); } } } } Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkill.cs
@@ -1,3 +1,4 @@ using System.Collections.Generic; using Core.Utilities; /** @@ -14,6 +15,7 @@ SkillData = param; SkillType = (EndlessBossSkillType)param.skill_class; SkillAI = GetSkillAI(param); random = new System.Random(); } /// <summary> @@ -46,6 +48,8 @@ /// 技能cd的计时器 /// </summary> protected Timer cdTimer; protected System.Random random; /// <summary> /// 帧刷新 @@ -100,7 +104,7 @@ cdTimer.SetTime(SkillData.cool_down / 1000f); cdTimer.Reset(); } public virtual void Reset() { if (cdTimer != null) @@ -124,12 +128,45 @@ protected virtual void AddEvent() { } protected virtual void RemoveEvent() { } /// <summary> /// 获取赛道列表 /// </summary> protected List<int> GetTunelList() { List<int> tunelIdList = new List<int>(); int count = 0; // 剩余没有用到的赛道 List<int> remainList = new List<int>() { 1, 2, 3, 4, 5 }; for (int i = 0; i < SkillData.tunnel.Count; ++i) { // 统计6这种类型的数量 if (SkillData.tunnel[i] == 6) { ++count; continue; } tunelIdList.Add(SkillData.tunnel[i]); remainList.Remove(SkillData.tunnel[i]); } for (int i = 0; i < count; ++i) { int num = random.Next(remainList.Count); tunelIdList.Add(remainList[num]); remainList.Remove(remainList[num]); } return tunelIdList; } } } Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs
@@ -71,6 +71,17 @@ { if (isPaused || EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return; for (int i = 0; i < skillList.Count; ++i) { skillList[i].Update(Time.deltaTime); } for (int i = 0; i < waitList.Count; ++i) { if (waitList[i].IsCDCompleted) AddSkill(waitList[i]); } switch (skillState) { case EndlessBossSkillState.Init: @@ -114,14 +125,6 @@ private void HandleWait(float deltaTime) { for (int i = 0; i < skillList.Count; ++i) { skillList[i].Update(Time.deltaTime); if (skillList[i].IsCDCompleted) AddSkill(skillList[i]); } for (int i = 0; i < cdList.Count; ++i) { if (cdList[i].IsConditionOK) @@ -136,6 +139,9 @@ } } /// <summary> /// 飘字闪烁完成 /// </summary> private void OnGlintTitleCompleted() { EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted, OnGlintTitleCompleted); @@ -166,6 +172,7 @@ { skillList.Add(skill); skill.Init(); waitList.Add(skill); } } @@ -198,7 +205,7 @@ public void Reset() { if (isPaused) return; for (int i = 0; i < skillList.Count; ++i) { skillList[i].Reset(); Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/EndlessBossSkillAI.cs
@@ -73,7 +73,7 @@ } /// <summary> /// 重置AI /// 重置AI,恢复到初始状态 /// </summary> public abstract void Reset(); Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/NormalBossSkillAI.cs
@@ -25,7 +25,16 @@ { IsActived = true; timer = null; Debug.Log("--------------------- 技能准备完成 ---------------------"); switch ((EndlessBossSkillType)SkillData.skill_class) { case EndlessBossSkillType.BubbleBomb: Debug.Log("--------------------- 泡泡炸弹 技能准备完成 ---------------------"); break; case EndlessBossSkillType.WoodPile: Debug.Log("--------------------- 木桩墙壁 技能准备完成 ---------------------"); break; } } }