// Play 중 보스 상태 요약(읽기 전용) var sb = new System.Text.StringBuilder(); sb.Append("playing=").Append(UnityEngine.Application.isPlaying); var director = BurningTimes.Boss.TVBossDirector.Instance; sb.Append(" director=").Append(director != null); if (director == null) return sb.ToString(); sb.Append(" config=").Append(director.ConfigReady).Append(" bosses=").Append(director.BossCount).Append(" tier=").Append(director.Tier); sb.Append(" player=").Append(Fx.Player.Instance != null).Append(" world=").Append(Fx.WorldManager.HasInstance()); sb.Append(" timeScale=").Append(UnityEngine.Time.timeScale.ToString("0.0")); var world = Unity.Entities.World.DefaultGameObjectInjectionWorld; if (world == null || world.IsCreated == false) return sb.Append(" world=none").ToString(); var em = world.EntityManager; double now = world.Time.ElapsedTime; sb.Append(" t=").Append(now.ToString("0.0")); if (director.TryGetHud(out var hud)) sb.Append("\nHUD alive=").Append(hud.aliveCount).Append(" idx=").Append(hud.bossIndex).Append(" phase=").Append(hud.phase + 1).Append('/').Append(hud.phaseCount) .Append(" hp=").Append(hud.hpRatio.ToString("0.000")).Append(" inv=").Append(hud.invincible).Append(" groggy=").Append(hud.groggyGauge).Append('/').Append(hud.groggyHits) .Append(" stun=").Append(hud.groggy).Append(" enraged=").Append(hud.enraged).Append(" elapsed=").Append(hud.elapsed.ToString("0.0")) .Append(" zone=").Append(hud.zoneType).Append(" zoneR=").Append(hud.zoneRadius.ToString("0.0")).Append(" zoneStack=").Append(hud.zoneStack.ToString("0.0")); using (var q = em.CreateEntityQuery(Unity.Entities.ComponentType.ReadOnly())) using (var entities = q.ToEntityArray(Unity.Collections.Allocator.Temp)) { sb.Append("\nstateEntities=").Append(entities.Length); foreach (var e in entities) { var st = em.GetComponentData(e); var h = em.GetComponentData(e); var lt = em.GetComponentData(e); var atk = em.GetComponentData(e); var idx = em.GetComponentData(e); var spd = em.GetComponentData(e); sb.Append("\n [").Append(e.Index).Append(" idx=").Append(idx.characterIndex).Append(" init=").Append(st.initialized).Append(" dead=").Append(st.dead).Append(" phase=").Append(st.phase) .Append(" hp=").Append(h.health).Append('/').Append(h.healthMax).Append(" inv=").Append(h.invincibilityCount).Append(" abn=").Append(h.applyAbnormalState) .Append(" scale=").Append(lt.Scale.ToString("0.00")).Append(" atk=").Append(atk.attack).Append(" speed=").Append(spd.runSpeed.ToString("0.0")) .Append(" pos=").Append(lt.Position.x.ToString("0.0")).Append(',').Append(lt.Position.y.ToString("0.0")).Append(',').Append(lt.Position.z.ToString("0.0")) .Append(" arena=").Append(st.arenaCenter.x.ToString("0.0")).Append(',').Append(st.arenaCenter.z.ToString("0.0")) .Append(" gauge=").Append(st.groggyGauge).Append(" groggyLeft=").Append(System.Math.Max(0.0, st.groggyUntil - now).ToString("0.0")) .Append(" zone=").Append(st.zoneType).Append(" stack=").Append(st.zoneStack.ToString("0.0")).Append(" enraged=").Append(st.enraged); if (em.HasComponent(e)) { var stun = em.GetComponentData(e); sb.Append(" stunActive=").Append(stun.active); } if (em.HasComponent(e)) { var c = em.GetComponentData(e); sb.Append(" contactOff=").Append(c.nextByteTimeSeconds > 1e100); } if (em.HasBuffer(e)) { var uses = em.GetBuffer(e, true); sb.Append("\n skills="); for (int i = 0; i < uses.Length; i++) sb.Append(uses[i].skillID).Append('(').Append(uses[i].useElapsedTime.ToString("0.0")).Append(')').Append(i < uses.Length - 1 ? "," : ""); } if (em.HasBuffer(e)) { var watch = em.GetBuffer(e, true); sb.Append("\n watch="); for (int i = 0; i < watch.Length; i++) sb.Append(watch[i].skillId).Append(":stage").Append(watch[i].stage).Append(i < watch.Length - 1 ? "," : ""); } sb.Append(']'); } } using (var pq = em.CreateEntityQuery(Unity.Entities.ComponentType.ReadOnly(), Unity.Entities.ComponentType.ReadOnly())) using (var players = pq.ToEntityArray(Unity.Collections.Allocator.Temp)) { foreach (var p in players) { var h = em.GetComponentData(p); var lt = em.GetComponentData(p); sb.Append("\nplayer hp=").Append(h.health).Append('/').Append(h.healthMax).Append(" inv=").Append(h.invincibilityCount) .Append(" pos=").Append(lt.Position.x.ToString("0.0")).Append(',').Append(lt.Position.y.ToString("0.0")).Append(',').Append(lt.Position.z.ToString("0.0")); } } // 몬스터 수(종류별) using (var mq = em.CreateEntityQuery(Unity.Entities.ComponentType.ReadOnly(), Unity.Entities.ComponentType.ReadOnly())) using (var all = mq.ToEntityArray(Unity.Collections.Allocator.Temp)) { var counts = new System.Collections.Generic.SortedDictionary(); foreach (var e in all) { if (em.HasComponent(e)) continue; if (em.IsEnabled(e) == false) continue; var h = em.GetComponentData(e); if (h.health <= 0) continue; int id = em.GetComponentData(e).characterIndex; counts.TryGetValue(id, out int c); counts[id] = c + 1; } sb.Append("\nalive monsters: "); foreach (var pair in counts) sb.Append(pair.Key).Append('x').Append(pair.Value).Append(' '); } return sb.ToString();