using Assets.MyGame.Scripts.Net.WebResponses; using System.Collections; using System.Collections.Generic; using UnityEngine; public class DefaultBossControl : MonsterControl_BossBase { // ================================================================ // ⭐ 翻转排查日志(临时):ischild0=true 时朝向逻辑旋转的是第0个子物体, // 本体(transform)不被 ApplyFacingDirection 触碰,日志全部观测 child0 // ================================================================ /// 翻转排查:child0 上一帧的世界旋转与缩放(突变时打印,捕获翻转瞬间) private Quaternion _dbgLastRot; private Vector3 _dbgLastScale; private bool _dbgHasLast; /// 调试用:获取第0个子物体(与朝向逻辑的 _cachedChild 同源) private Transform DbgChild => transform.childCount > 0 ? transform.GetChild(0) : null; public override void OnEnable() { base.OnEnable(); _dbgHasLast = false; // ⭐ 出场状态:child0 是实际被旋转的对象 var c = DbgChild; if (c != null) { Debug.Log($"[Boss翻转排查] OnEnable guid={guid} child0 " + $"localScale={c.localScale.ToString("F3")} localEuler={c.localEulerAngles.ToString("F1")} " + $"worldEuler={c.rotation.eulerAngles.ToString("F1")} | 本体 scale={transform.localScale.ToString("F3")} " + $"forwordXYZ=[{forwordXYZ}] isMove={isMove}"); } else { Debug.Log($"[Boss翻转排查] OnEnable guid={guid} 无child0! 本体localScale={transform.localScale.ToString("F3")} forwordXYZ=[{forwordXYZ}]"); } } public override void Init(string pathId, float time, bool isyuzhen = false, string yzID = "") { base.Init(pathId, time, isyuzhen, yzID); // ⭐ Init 后状态:forwordXYZ 配了轴 → IsRouteFlipBoss=false → 本体不做奇偶翻转, // 朝向完全由 ApplyFacingDirection 的六分支每帧驱动 child0; // forwordXYZ 为空 → Boss走默认分支return,child0 保持预制体姿态 var c = DbgChild; Debug.Log($"[Boss翻转排查] Init guid={guid} pathId={pathId} isyuzhen={isyuzhen} yzID={yzID} " + $"forwordXYZ=[{forwordXYZ}] isMove={isMove} child0={(c != null ? $"localEuler={c.localEulerAngles.ToString("F1")} localScale={c.localScale.ToString("F3")}" : "无")} " + $"本体scale={transform.localScale.ToString("F3")}"); } public void TimeDieFish() { CreateFishManager.Instance.Id_DieFish_NotFX(guid); } public override void DieFish(RoomKillNotice obj = null) { base.DieFish(obj); CreateFishManager.Instance.Id_DieFish_NotFX(guid); action_effect_DieAward = (o) => { if (obj == null) return; foreach (var item in CreateFishManager.Instance.currGameType.list_Sits) { if (item.user == obj.userId) { var v = o.GetComponent(); v.Init( obj.gold, // goldCount item.posID, // posID obj.skillsGold, // paobei obj.fishScore, // fishScore obj.beishu, // beishu JiaFen, // action () => { v.obj = obj.param; } ); } } }; } public override void OnDisable() { // ⭐ 回收状态:child0 离场时姿态(是否中途被翻转过可由游动期突变日志判断) var c = DbgChild; Debug.Log($"[Boss翻转排查] OnDisable guid={guid} child0={(c != null ? $"localEuler={c.localEulerAngles.ToString("F1")} localScale={c.localScale.ToString("F3")}" : "无")} " + $"路线={lastMoveLineId}"); //GetComponent().enabled = false; if (currEffect_DieAward != null) currEffect_DieAward.SetActive(true); } public override void OnMoveUpdata() { base.OnMoveUpdata(); // ⭐ 每帧检测 child0 突变(旋转的是child0不是本体): // - 单帧世界旋转跳变>90° = 翻转瞬间(候选来源:mirror180镜像切换/_rollSign符号切换/ // heading跟随/其他外部代码),moveTime 可定位发生时刻 var ch = DbgChild; if (ch != null) { if (!_dbgHasLast) { _dbgLastRot = ch.rotation; _dbgLastScale = ch.localScale; _dbgHasLast = true; } else { float angleDelta = Quaternion.Angle(_dbgLastRot, ch.rotation); if (angleDelta > 90f) { Debug.Log($"[Boss翻转排查] ⚠️child0旋转单帧突变{angleDelta:F0}°! guid={guid} " + $"worldEuler {_dbgLastRot.eulerAngles.ToString("F1")}→{ch.rotation.eulerAngles.ToString("F1")} " + $"moveTime={moveTime:F2}s 路线={lastMoveLineId}"); } if ((ch.localScale.x >= 0f) != (_dbgLastScale.x >= 0f) || (ch.localScale.y >= 0f) != (_dbgLastScale.y >= 0f) || (ch.localScale.z >= 0f) != (_dbgLastScale.z >= 0f)) { Debug.Log($"[Boss翻转排查] ⚠️child0缩放符号翻转! guid={guid} {_dbgLastScale.ToString("F3")}→{ch.localScale.ToString("F3")} " + $"moveTime={moveTime:F2}s 路线={lastMoveLineId}"); } _dbgLastRot = ch.rotation; _dbgLastScale = ch.localScale; } } if (moveTime >= monsterData.moveLine.moveTime) { CreateFishManager.Instance.Id_DieFish_NotFX(guid); } } }