diff --git a/DungeonShooting_Godot/excel/ActivityMaterial.xlsx b/DungeonShooting_Godot/excel/ActivityMaterial.xlsx
index b23fc4c..16e6778 100644
--- a/DungeonShooting_Godot/excel/ActivityMaterial.xlsx
+++ b/DungeonShooting_Godot/excel/ActivityMaterial.xlsx
Binary files differ
diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs b/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs
index f3fa9c6..fe76940 100644
--- a/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs
+++ b/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs
@@ -77,7 +77,7 @@
public float FallBounceRotation;
///
- /// 动态开关碰撞器,在物体高度大于16时是否关闭碰撞检测
+ /// 动态开关碰撞器,在物体高度大于32时是否关闭碰撞检测
///
[JsonInclude]
public bool DynamicCollision;
diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
index 68320b6..f42c523 100644
--- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
+++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
@@ -1116,8 +1116,8 @@
_altitude += VerticalSpeed * delta;
_verticalSpeed -= GameConfig.G * ActivityMaterial.GravityScale * delta;
- //当高度大于16时, 显示在所有物体上, 并且关闭碰撞
- if (Altitude >= 16)
+ //当高度大于32时, 显示在所有物体上, 并且关闭碰撞
+ if (Altitude >= 32)
{
AnimatedSprite.ZIndex = 20;
}
@@ -1128,7 +1128,7 @@
//动态开关碰撞器
if (ActivityMaterial.DynamicCollision)
{
- Collision.Disabled = Altitude >= 16;
+ Collision.Disabled = Altitude >= 32;
}
//达到最高点
diff --git a/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs b/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs
index c6b0379..abd503c 100644
--- a/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs
+++ b/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs
@@ -37,6 +37,7 @@
}
public BulletData BulletData { get; private set; }
+ public BulletStateEnum State { get; protected set; } = BulletStateEnum.Normal;
public bool IsDestroyed { get; private set; }
@@ -52,7 +53,7 @@
{
InitData(data, attackLayer, LaserDefaultWidth);
}
-
+
public void InitData(BulletData data, uint attackLayer, float width)
{
if (!_init)
@@ -137,6 +138,7 @@
_tween.Chain();
_tween.TweenCallback(Callable.From(() =>
{
+ State = BulletStateEnum.MaxDistance;
_tween = null;
LogicalFinish();
}));
@@ -252,6 +254,7 @@
public virtual void OnReclaim()
{
+ State = BulletStateEnum.Normal;
if (Particles2D != null)
{
foreach (var particles2D in Particles2D)
diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs
index 4174bad..7cf187e 100644
--- a/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs
+++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs
@@ -37,21 +37,6 @@
return base.CheckInteractive(master);
}
- public override void OnPlayDisappearEffect()
- {
- }
-
- public override void OnMoveCollision(KinematicCollision2D collision)
- {
- CurrentBounce++;
- if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制
- {
- //创建粒子特效
- OnPlayCollisionEffect(collision);
- ObjectPool.Reclaim(this);
- }
- }
-
public override void OnCollisionTarget(IHurt hurt)
{
base.OnCollisionTarget(hurt);
@@ -64,11 +49,23 @@
public override void LogicalFinish()
{
- SetEnableMovement(false);
- var slideCollision = GetLastSlideCollision();
- if (slideCollision != null)
+ if (State == BulletStateEnum.CollisionTarget) //碰撞到目标, 直接冻结
{
- Position -= slideCollision.GetTravel();
+ SetEnableMovement(false);
+ var slideCollision = GetLastSlideCollision();
+ if (slideCollision != null)
+ {
+ Position -= slideCollision.GetTravel();
+ }
+ }
+ else if (State == BulletStateEnum.FallToGround) //落地, 啥也不干
+ {
+
+ }
+ else
+ {
+ //Debug.Log("碰撞速度: " + Velocity.Length());
+ base.LogicalFinish();
}
}
diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs
index 085c4c6..79174e7 100644
--- a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs
+++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs
@@ -21,6 +21,7 @@
public override void OnCollisionTarget(IHurt o)
{
+ State = BulletStateEnum.CollisionTarget;
PlayBoom();
LogicalFinish();
}
@@ -30,6 +31,7 @@
CurrentBounce++;
if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制
{
+ State = BulletStateEnum.MoveCollision;
PlayBoom();
LogicalFinish();
}
diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs
index c926744..9acf91f 100644
--- a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs
+++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs
@@ -62,6 +62,11 @@
///
public bool IsEnemyBullet { get; private set; } = false;
+ ///
+ /// 子弹状态
+ ///
+ public BulletStateEnum State { get; protected set; } = BulletStateEnum.Normal;
+
//当前子弹已经飞行的距离
private float CurrFlyDistance = 0;
@@ -136,7 +141,11 @@
//过期销毁
if (data.LifeTime > 0)
{
- this.CallDelay(data.LifeTime, OnLimeOver);
+ this.CallDelay(data.LifeTime, () =>
+ {
+ State = BulletStateEnum.LimeOver;
+ OnLimeOver();
+ });
}
if (Particles2D != null)
@@ -172,6 +181,7 @@
CurrentBounce++;
if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制
{
+ State = BulletStateEnum.MoveCollision;
//创建粒子特效
OnPlayCollisionEffect(collision);
LogicalFinish();
@@ -200,6 +210,7 @@
CurrentPenetration++;
if (CurrentPenetration > BulletData.Penetration)
{
+ State = BulletStateEnum.CollisionTarget;
CallDeferred(nameof(LogicalFinish));
}
}
@@ -224,6 +235,7 @@
protected override void OnFallToGround()
{
+ State = BulletStateEnum.FallToGround;
//落地销毁
OnPlayDisappearEffect();
LogicalFinish();
@@ -295,15 +307,16 @@
{
if (ActivityMaterial.DynamicCollision)
{
- //子弹高度大于 16 关闭碰撞检测
- CollisionShape2D.Disabled = Altitude >= 16;
+ //子弹高度大于 32 关闭碰撞检测
+ CollisionShape2D.Disabled = Altitude >= 32;
}
//距离太大, 自动销毁
if (MoveController.Enable)
{
- CurrFlyDistance += BulletData.FlySpeed * delta;
+ CurrFlyDistance += Velocity.Length() * delta;
if (CurrFlyDistance >= BulletData.MaxDistance)
{
+ State = BulletStateEnum.MaxDistance;
OnMaxDistance();
}
}
@@ -342,6 +355,7 @@
public virtual void OnReclaim()
{
+ State = BulletStateEnum.Normal;
Visible = false;
if (Particles2D != null)
{
diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/BulletStateEnum.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/BulletStateEnum.cs
new file mode 100644
index 0000000..7b21719
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/BulletStateEnum.cs
@@ -0,0 +1,31 @@
+
+///
+/// 子弹逻辑完成条件
+///
+public enum BulletStateEnum
+{
+ ///
+ /// 正常飞行状态
+ ///
+ Normal,
+ ///
+ /// 移动并撞到物体
+ ///
+ MoveCollision,
+ ///
+ /// 飞行到最大距离
+ ///
+ MaxDistance,
+ ///
+ /// 子弹生命周期结束
+ ///
+ LimeOver,
+ ///
+ /// 落地
+ ///
+ FallToGround,
+ ///
+ /// 碰撞到攻击目标物体
+ ///
+ CollisionTarget,
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs
index 56d4b88..a642541 100644
--- a/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs
+++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs
@@ -21,6 +21,12 @@
/// 子弹数据
///
BulletData BulletData { get; }
+
+ ///
+ /// 子弹状态
+ ///
+ BulletStateEnum State { get; }
+
///
/// 初始化子弹数据
///