This commit is contained in:
2026-08-26 17:54:28 +08:00
parent 392a45b05d
commit 5613ae428b
7 changed files with 76 additions and 20 deletions
@@ -159,6 +159,32 @@ public class MonsterContral : MonoBehaviour
/// <summary>鱼类型枚举(缓存,避免反复类型转换)</summary>
public FishTypeEnum fishenum;
/// <summary>
/// 是否为"按路线奇偶翻转X轴朝向"的Boss(Boss本体或BossBase子类,且未配置forwordXYZ自定义朝向轴)。
/// 这类Boss不随路线切线旋转,朝向只由路线方向决定:
/// 路线单数=左→右(X保持预制体正向),路线双数=右→左(X取负镜像)。
/// </summary>
protected bool IsRouteFlipBoss =>
(fishenum == FishTypeEnum.Boss鱼 || this is MonsterControl_BossBase)
&& string.IsNullOrEmpty(forwordXYZ);
/// <summary>
/// ⭐ Boss路线朝向:按路线编号奇偶翻转X轴。
/// 单数路线=左→右 → X保持预制体原始值不变
/// 双数路线=右→左 → X取预制体原始值的负数(镜像)
/// 以预制体原始X缩放为基准绝对赋值,对象池复用后重新Init不会叠加翻转。
/// 路线编号非数字时不翻转(保持原朝向)。
/// </summary>
protected void ApplyBossRouteFlip(string pathId)
{
if (!int.TryParse(pathId, out int routeNum)) return;
float dirX = routeNum % 2 == 1 ? 1f : -1f;
var scale = transform.localScale;
scale.x = _prefabScaleX * dirX;
transform.localScale = scale;
}
/// <summary>路径已行进的时间(秒),用于贝塞尔曲线插值;可由外部预设偏移实现同步追帧。</summary>
public float moveTime = 0f;
@@ -284,10 +310,15 @@ public class MonsterContral : MonoBehaviour
// Unity 生命周期
// ================================================================
public bool baseMmove;
/// <summary>预制体原始X缩放(Awake缓存):Boss按路线奇偶翻转X轴的基准,池复用后重新Init不会叠加翻转</summary>
private float _prefabScaleX = 1f;
public virtual void Awake()
{
LoadHitEffect();
baseMmove = isMove;
_prefabScaleX = transform.localScale.x;
}
/// <summary>
/// 查找受击特效子物体并强制隐藏。
@@ -456,6 +487,10 @@ public class MonsterContral : MonoBehaviour
if (!isMove)
transform.position = Vector3.zero;
// ⭐ Boss朝向:不随路线切线旋转,按路线编号奇偶翻转X轴(单数左→右保持正向/双数右→左翻转)
if (isMove && IsRouteFlipBoss)
ApplyBossRouteFlip(pathId);
// ⭐ 创建视频启动逻辑由子类负责:
// - MonsterControl_BossBase 在自己 Init 里启动 createVideo
// - 普通鱼走父类 Init,但普通鱼一般不配 createVideo
@@ -724,6 +759,11 @@ public class MonsterContral : MonoBehaviour
// 处理未指定朝向轴的情况(默认行为)
if (_facingAxis == FacingAxis.None)
{
// ⭐ Boss不随路线切线旋转(重构前旧逻辑Boss鱼本来就不参与朝向):
// 未配置正方向(forwordXYZ)的Boss,朝向由 ApplyBossRouteFlip 按路线奇偶翻转X轴决定;
// 配置了正方向的Boss走下方轴对齐逻辑,保持原有机制不变
if (IsRouteFlipBoss) return;
if (!is3D)
{
float angle = Mathf.Atan2(toNext.y, toNext.x) * Mathf.Rad2Deg;
@@ -130,6 +130,11 @@ public class MonsterControl_BossBase : MonsterContral
// 避免 UpdateYZMovement 里 _yzPrefix 为空导致鱼阵 Boss 不移动
SetYzPrefix(yzID);
// ⭐ Boss朝向:不随路线切线旋转,按路线编号奇偶翻转X轴
// (单数路线=左→右保持预制体正向,双数路线=右→左翻转X轴为负)
if (isMove && IsRouteFlipBoss)
ApplyBossRouteFlip(pathId);
// ⭐ 创建视频处理:配置了 createVideoClip 时通过 GameMainPanel 的播放器播放
// 播放期间 OnMoveUpdata 会跳过移动,视频结束后才开始走路线
_createVideoDuration = 0f;