diff --git a/DungeonShooting_Godot/scene/Main.tscn b/DungeonShooting_Godot/scene/Main.tscn index 725ea23..0aaea00 100644 --- a/DungeonShooting_Godot/scene/Main.tscn +++ b/DungeonShooting_Godot/scene/Main.tscn @@ -24,7 +24,6 @@ [node name="Main" type="Node2D"] script = ExtResource("3") -Debug = true CursorPack = ExtResource("4") RoomPath = NodePath("ViewCanvas/SubViewportContainer/SubViewport/Room") ViewportPath = NodePath("ViewCanvas/SubViewportContainer/SubViewport") @@ -60,5 +59,3 @@ [node name="UiCanvas" type="CanvasLayer" parent="."] [node name="RoomUI" parent="UiCanvas" instance=ExtResource("2")] -grow_horizontal = 2 -grow_vertical = 2 diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs index 435a28f..80f17e1 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs @@ -3,10 +3,9 @@ using System.Collections; using System.Collections.Generic; using Godot; -using Plugin; /// -/// 房间内活动物体基类 +/// 房间内活动物体基类, 所有物体都必须继承该类 /// public abstract partial class ActivityObject : CharacterBody2D { @@ -38,7 +37,6 @@ /// /// 动画播放器 /// - /// public AnimationPlayer AnimationPlayer { get; } /// @@ -631,6 +629,11 @@ { canNext = false; } + else + { + item.WaitType = CoroutineData.WaitTypeEnum.None; + item.WaitForSeconds = null; + } } else if (item.WaitType == CoroutineData.WaitTypeEnum.WaitForFixedProcess) //等待帧数 { @@ -638,6 +641,11 @@ { canNext = false; } + else + { + item.WaitType = CoroutineData.WaitTypeEnum.None; + item.WaitForFixedProcess = null; + } } if (canNext) @@ -645,7 +653,7 @@ if (item.Enumerator.MoveNext()) //嵌套协程 { var next = item.Enumerator.Current; - if (next is IEnumerator enumerator) + if (next is IEnumerable enumerable) { if (item.EnumeratorStack == null) { @@ -653,7 +661,7 @@ } item.EnumeratorStack.Push(item.Enumerator); - item.Enumerator = enumerator; + item.Enumerator = enumerable.GetEnumerator(); } else if (next is WaitForSeconds seconds) //等待秒数 { diff --git a/DungeonShooting_Godot/src/game/item/weapon/WeaponAttribute.cs b/DungeonShooting_Godot/src/game/item/weapon/WeaponAttribute.cs index 8c36996..0f4e3c6 100644 --- a/DungeonShooting_Godot/src/game/item/weapon/WeaponAttribute.cs +++ b/DungeonShooting_Godot/src/game/item/weapon/WeaponAttribute.cs @@ -214,10 +214,16 @@ attr.UpliftAngle = UpliftAngle; attr.DefaultAngle = DefaultAngle; attr.UpliftAngleRestore = UpliftAngleRestore; + attr.AiTargetLockingTime = AiTargetLockingTime; return attr; } //------------------------------ Ai相关 ----------------------------- + + /// + /// 用于Ai, 目标锁定时间, 也就是瞄准目标多久才会开火 + /// + public float AiTargetLockingTime = 0; public WeaponAttribute AiUseAttribute; diff --git a/DungeonShooting_Godot/src/game/item/weapon/gun/Gun.cs b/DungeonShooting_Godot/src/game/item/weapon/gun/Gun.cs index f005169..283c8dd 100644 --- a/DungeonShooting_Godot/src/game/item/weapon/gun/Gun.cs +++ b/DungeonShooting_Godot/src/game/item/weapon/gun/Gun.cs @@ -43,13 +43,11 @@ FirePosition = new Vector2(16, 2); AiUseAttribute = Clone(); - AiUseAttribute.DelayedTime = 1f; - AiUseAttribute.TriggerInterval = 4f; - AiUseAttribute.ContinuousShoot = true; - //连发数量 + AiUseAttribute.AiTargetLockingTime = 0.5f; + AiUseAttribute.TriggerInterval = 3f; + AiUseAttribute.ContinuousShoot = false; AiUseAttribute.MinContinuousCount = 3; AiUseAttribute.MaxContinuousCount = 3; - } } @@ -93,6 +91,7 @@ FirePosition = new Vector2(10, 2); AiUseAttribute = Clone(); + AiUseAttribute.AiTargetLockingTime = 1f; AiUseAttribute.TriggerInterval = 2f; } } diff --git a/DungeonShooting_Godot/src/game/item/weapon/gun/Shotgun.cs b/DungeonShooting_Godot/src/game/item/weapon/gun/Shotgun.cs index ede4a24..38ab153 100644 --- a/DungeonShooting_Godot/src/game/item/weapon/gun/Shotgun.cs +++ b/DungeonShooting_Godot/src/game/item/weapon/gun/Shotgun.cs @@ -44,6 +44,7 @@ FirePosition = new Vector2(18, 4); AiUseAttribute = Clone(); + AiUseAttribute.AiTargetLockingTime = 0.2f; AiUseAttribute.TriggerInterval = 3.5f; } } diff --git a/DungeonShooting_Godot/src/game/item/weapon/knife/Knife.cs b/DungeonShooting_Godot/src/game/item/weapon/knife/Knife.cs index e479a5a..817ce68 100644 --- a/DungeonShooting_Godot/src/game/item/weapon/knife/Knife.cs +++ b/DungeonShooting_Godot/src/game/item/weapon/knife/Knife.cs @@ -28,6 +28,9 @@ MinBacklash = -8; BacklashRegressionSpeed = 24; UpliftAngle = -95; + + //AiUseAttribute = Clone(); + //AiUseAttribute.TriggerInterval = 3f; } } diff --git a/DungeonShooting_Godot/src/game/role/Player.cs b/DungeonShooting_Godot/src/game/role/Player.cs index 643288c..2a6c2fa 100644 --- a/DungeonShooting_Godot/src/game/role/Player.cs +++ b/DungeonShooting_Godot/src/game/role/Player.cs @@ -1,3 +1,4 @@ +using System.Collections; using Godot; diff --git a/DungeonShooting_Godot/src/game/role/enemy/Enemy.cs b/DungeonShooting_Godot/src/game/role/enemy/Enemy.cs index 437663d..a377c86 100644 --- a/DungeonShooting_Godot/src/game/role/enemy/Enemy.cs +++ b/DungeonShooting_Godot/src/game/role/enemy/Enemy.cs @@ -26,7 +26,7 @@ public static bool IsFindTarget { get; private set; } /// - /// 找到的目标的位置, 如果目标在视野内, 则一直更新 + /// 公共属性, 找到的目标的位置, 如果目标在视野内, 则一直更新 /// public static Vector2 FindTargetPosition { get; private set; } @@ -67,7 +67,10 @@ /// public Marker2D NavigationPoint { get; } + //开火间隙时间 private float _enemyAttackTimer = 0; + //目标在视野内的时间 + private float _targetInViewTime = 0; public Enemy() : base(ResourcePath.prefab_role_Enemy_tscn) { @@ -141,6 +144,17 @@ base.Process(delta); _enemyAttackTimer -= delta; + //目标在视野内的时间 + var currState = StateController.CurrState; + if (currState == AiStateEnum.AiSurround || currState == AiStateEnum.AiFollowUp) + { + _targetInViewTime += delta; + } + else + { + _targetInViewTime = 0; + } + EnemyPickUpWeapon(); } @@ -218,7 +232,7 @@ { Reload(); } - else //正常射击 + else if (_targetInViewTime >= weapon.Attribute.AiTargetLockingTime) //正常射击 { if (weapon.GetDelayedAttackTime() > 0) { diff --git a/DungeonShooting_Godot/src/game/role/enemy/state/AIStateEnum.cs b/DungeonShooting_Godot/src/game/role/enemy/state/AIStateEnum.cs index bdf95b2..6bb8db4 100644 --- a/DungeonShooting_Godot/src/game/role/enemy/state/AIStateEnum.cs +++ b/DungeonShooting_Godot/src/game/role/enemy/state/AIStateEnum.cs @@ -14,7 +14,7 @@ /// AiLeaveFor, /// - /// 发现目标, 并且知道位置 + /// 发现目标, 目标不在视野内, 但是知道位置 /// AiTailAfter, /// diff --git a/DungeonShooting_Godot/src/game/room/RoomManager.cs b/DungeonShooting_Godot/src/game/room/RoomManager.cs index b3a794a..91c760b 100644 --- a/DungeonShooting_Godot/src/game/room/RoomManager.cs +++ b/DungeonShooting_Godot/src/game/room/RoomManager.cs @@ -101,22 +101,22 @@ SoundManager.PlayMusic(ResourcePath.resource_sound_bgm_Intro_ogg, -17f); Player.PickUpWeapon(WeaponManager.GetGun("1001")); - Player.PickUpWeapon(WeaponManager.GetGun("1002")); + // Player.PickUpWeapon(WeaponManager.GetGun("1002")); Player.PickUpWeapon(WeaponManager.GetGun("1003")); Player.PickUpWeapon(WeaponManager.GetGun("1004")); - var enemy1 = new Enemy(); - enemy1.PutDown(new Vector2(100, 100), RoomLayerEnum.YSortLayer); - enemy1.PickUpWeapon(WeaponManager.GetGun("1001")); + // var enemy1 = new Enemy(); + // enemy1.PutDown(new Vector2(100, 100), RoomLayerEnum.YSortLayer); + // enemy1.PickUpWeapon(WeaponManager.GetGun("1001")); - // for (int i = 0; i < 3; i++) + // for (int i = 0; i < 10; i++) // { // var enemyTemp = new Enemy(); // enemyTemp.PutDown(new Vector2(30 + (i + 1) * 20, 30), RoomLayerEnum.YSortLayer); // // enemyTemp.PickUpWeapon(WeaponManager.GetGun("1003")); // // enemyTemp.PickUpWeapon(WeaponManager.GetGun("1001")); // } - + // // var enemy2 = new Enemy(); // enemy2.Name = "Enemy2"; // enemy2.PutDown(new Vector2(120, 100)); @@ -130,15 +130,19 @@ // enemy3.PickUpWeapon(WeaponManager.GetGun("1003")); // enemy3.PickUpWeapon(WeaponManager.GetGun("1002")); - // WeaponManager.GetGun("1004").PutDown(new Vector2(80, 100), RoomLayerEnum.NormalLayer); - // WeaponManager.GetGun("1001").PutDown(new Vector2(220, 120), RoomLayerEnum.NormalLayer); - // WeaponManager.GetGun("1001").PutDown(new Vector2(80, 80), RoomLayerEnum.NormalLayer); - // WeaponManager.GetGun("1002").PutDown(new Vector2(80, 120), RoomLayerEnum.NormalLayer); - // WeaponManager.GetGun("1003").PutDown(new Vector2(120, 80), RoomLayerEnum.NormalLayer); - // + WeaponManager.GetGun("1004").PutDown(new Vector2(80, 100), RoomLayerEnum.NormalLayer); + WeaponManager.GetGun("1001").PutDown(new Vector2(220, 120), RoomLayerEnum.NormalLayer); + WeaponManager.GetGun("1001").PutDown(new Vector2(230, 120), RoomLayerEnum.NormalLayer); + WeaponManager.GetGun("1001").PutDown(new Vector2(80, 80), RoomLayerEnum.NormalLayer); + WeaponManager.GetGun("1002").PutDown(new Vector2(80, 120), RoomLayerEnum.NormalLayer); + WeaponManager.GetGun("1003").PutDown(new Vector2(120, 80), RoomLayerEnum.NormalLayer); + WeaponManager.GetGun("1003").PutDown(new Vector2(130, 80), RoomLayerEnum.NormalLayer); + WeaponManager.GetGun("1003").PutDown(new Vector2(140, 80), RoomLayerEnum.NormalLayer); + // WeaponManager.GetGun("1003").PutDown(new Vector2(180, 80), RoomLayerEnum.NormalLayer); // WeaponManager.GetGun("1003").PutDown(new Vector2(180, 180), RoomLayerEnum.NormalLayer); // WeaponManager.GetGun("1002").PutDown(new Vector2(180, 120), RoomLayerEnum.NormalLayer); + // WeaponManager.GetGun("1002").PutDown(new Vector2(180, 130), RoomLayerEnum.NormalLayer); }