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);
}