using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif using System.Collections.Generic; using System.Text; using vnxbqy.UI; public class RuntimeLogUtility : MonoBehaviour { private static string LS_Key_ForceAutoFight = "LS_Key_ForceAutoFight"; public static bool TEST_CLIENT_PVP = false; public static bool TEST_CLIENT_PVP_AI = true; public static bool s_BattleLog = false; public static bool s_MoveLog = false; public static bool s_ForceOneEnemy = false; public static bool s_PerpetualAttack = true; public static bool s_UseKeyBoardCastSkill = false; public static bool s_LogMoveDistance = false; public static bool s_SkillEffectLog = false; public static bool s_ShowMapLine = false; public static bool s_ShowZZAtkValue = false; public static bool s_ForceSupperHit = false; public static bool s_ForceLuckHit = false; public static bool s_LogProcessInfo = false; public static bool s_forceAutoFight { get { #if UNITY_EDITOR return EditorPrefs.GetBool("LS_Key_ForceAutoFight", true); #else return true; #endif } set { #if UNITY_EDITOR EditorPrefs.SetBool("LS_Key_ForceAutoFight", value); #endif } } public static string s_LogPath; static readonly Dictionary s_LogDict = new Dictionary(); static readonly List s_LogList = new List(); public static bool s_HurtValueLog = false; public static UnityEngine.AI.NavMeshObstacle obstacle; public static SFXController sfx; public static void ClearLogs() { s_LogDict.Clear(); s_LogList.Clear(); } public static void AddLog_Blue(string info, uint objId = 0) { string _content; if (s_BattleLog) { _content = string.Format("{0}", info); string _strTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); Debug.Log(string.Format("[{0}] {1}", _strTime, _content)); } _content = string.Format("{0}", info); AddLog(_content, objId); } public static void AddLog_Green(string info, uint objId = 0) { string _content; if (s_BattleLog) { _content = string.Format("{0}", info); string _strTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); Debug.Log(string.Format("[{0}] {1}", _strTime, _content)); } _content = string.Format("{0}", info); AddLog(_content, objId); } public static void AddLog_Red(string info, uint objId = 0) { string _content; if (s_BattleLog) { _content = string.Format("{0}", info); string _strTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); Debug.Log(string.Format("[{0}] {1}", _strTime, _content)); } _content = string.Format("{0}", info); AddLog(_content, objId); } public static void AddLog_Black(string info, uint objId = 0) { if (s_BattleLog) { string _strTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); Debug.Log(string.Format("[{0}] {1}", _strTime, info)); } string _content = string.Format("{0}", info); AddLog(_content, objId); } public static void AddLog(string info, uint objId = 0, bool force = false) { if (!s_BattleLog && !s_MoveLog && !force) { return; } string _strTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); string _content = string.Format("[{0}] {1}
", _strTime, info); s_LogList.Add(_content); if (objId == 0) { foreach (var _objId in s_LogDict.Keys) { s_LogDict[_objId].Append(_content); } } else { if (s_LogDict.ContainsKey(objId) == false) { s_LogDict.Add(objId, new StringBuilder()); } s_LogDict[objId].Append(_content); } } public static void SaveNpcLog() { s_LogPath = Application.dataPath.Substring(0, 3) + "unit3D_Logs/"; if (System.IO.Directory.Exists(s_LogPath) == false) { System.IO.Directory.CreateDirectory(s_LogPath); } string _strTime = System.DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff"); string _path = string.Empty; foreach (var _objId in s_LogDict.Keys) { _path = s_LogPath + _objId; if (System.IO.Directory.Exists(_path) == false) { System.IO.Directory.CreateDirectory(_path); } _path = string.Format(s_LogPath + "{0}/{1}.html", _objId, _strTime); using (System.IO.StreamWriter _writer = new System.IO.StreamWriter(_path)) { _writer.Write(s_LogDict[_objId].ToString()); } } s_LogDict.Clear(); _path = string.Format(s_LogPath + "Log_{0}.html", _strTime); StringBuilder _stringBuilder = new StringBuilder(); for (int i = 0; i < s_LogList.Count; ++i) { _stringBuilder.Append(s_LogList[i]); } using (System.IO.StreamWriter _writer = new System.IO.StreamWriter(_path)) { _writer.Write(_stringBuilder.ToString()); } s_LogList.Clear(); } } #if UNITY_EDITOR [CustomEditor(typeof(RuntimeLogUtility))] public class RuntimeLogUtilityEditor : Editor { private Vector3 _navChkPos; private int _param1; private int _param2; private Vector2 _start; private Vector2 _end; private Vector3 _start3; private Vector3 _end3; private int _triggerID = 11204008; private int _clientNpcSID; public override void OnInspectorGUI() { GUILayout.Space(5); EditorGUILayout.BeginHorizontal(); _triggerID = EditorGUILayout.IntField("触发器ID", _triggerID); if (GUILayout.Button("触发客户端触发器")) { // ClientSceneManager.Instance.TriggerTest(_triggerID); // GA_NpcFunc.SetNpcFuncVisible(10104003, true); // Vector3 ppp; // if (ClientSceneManager.Instance.AAA(PlayerDatas.Instance.hero.Pos, new Vector3(6, 0, 39.5f), out ppp)) // { // Debug.Log("最终....PPP: " + ppp); // } // for (int i = 0; i < 10; ++i) // { // ClientDropItemUtility.Instance.DropInShortTime(PlayerDatas.Instance.hero.Pos, 10427); // } PlayerDatas.Instance.hero.Play(GAStaticDefine.State_IdleHash); } EditorGUILayout.EndHorizontal(); _start3 = EditorGUILayout.Vector3Field("起点: ", _start3); _end3 = EditorGUILayout.Vector3Field("终点: ", _end3); if (GUILayout.Button("测试寻路")) { // Debug.Log(PathFinder.WalkAble(_start3, _end3)); // MapTransferUtility.Instance.MoveToNPC(10904012); // MapTransferUtility.Instance.MoveToLocalMapPosition(new Vector2(_end3.x, _end3.z)); MapTransferUtility.Instance.MoveToNPC(_triggerID); } EditorGUILayout.LabelField("Log存储路径", RuntimeLogUtility.s_LogPath); if (GUILayout.Button("保存Log")) { RuntimeLogUtility.SaveNpcLog(); } if (GUILayout.Button("清空Log")) { RuntimeLogUtility.ClearLogs(); } RuntimeLogUtility.s_BattleLog = EditorGUILayout.Toggle("战斗过程的Log输出", RuntimeLogUtility.s_BattleLog); RuntimeLogUtility.s_MoveLog = EditorGUILayout.Toggle("移动过程的Log输出", RuntimeLogUtility.s_MoveLog); RuntimeLogUtility.s_ForceOneEnemy = EditorGUILayout.Toggle("强制只攻击一个目标对象", RuntimeLogUtility.s_ForceOneEnemy); RuntimeLogUtility.s_PerpetualAttack = EditorGUILayout.Toggle("执行攻击至死逻辑", RuntimeLogUtility.s_PerpetualAttack); RuntimeLogUtility.s_UseKeyBoardCastSkill = EditorGUILayout.Toggle("使用键盘释放技能", RuntimeLogUtility.s_UseKeyBoardCastSkill); RuntimeLogUtility.s_forceAutoFight = EditorGUILayout.Toggle("是否强制开启AI", RuntimeLogUtility.s_forceAutoFight); RuntimeLogUtility.s_SkillEffectLog = EditorGUILayout.Toggle("技能效果log输出", RuntimeLogUtility.s_SkillEffectLog); RuntimeLogUtility.s_LogMoveDistance = EditorGUILayout.Toggle("位移距离Log输出", RuntimeLogUtility.s_LogMoveDistance); RuntimeLogUtility.s_ShowMapLine = EditorGUILayout.Toggle("显示地图网格", RuntimeLogUtility.s_ShowMapLine); RuntimeLogUtility.s_ShowZZAtkValue = EditorGUILayout.Toggle("显示助战伤害", RuntimeLogUtility.s_ShowZZAtkValue); RuntimeLogUtility.TEST_CLIENT_PVP = EditorGUILayout.Toggle("模拟客户端PVP状态", RuntimeLogUtility.TEST_CLIENT_PVP); RuntimeLogUtility.TEST_CLIENT_PVP_AI = EditorGUILayout.Toggle("模拟客户端PVP的AI状态", RuntimeLogUtility.TEST_CLIENT_PVP_AI); RuntimeLogUtility.s_ForceSupperHit = EditorGUILayout.Toggle("强制暴击", RuntimeLogUtility.s_ForceSupperHit); RuntimeLogUtility.s_ForceLuckHit = EditorGUILayout.Toggle("强制会心一击", RuntimeLogUtility.s_ForceLuckHit); RuntimeLogUtility.s_LogProcessInfo = EditorGUILayout.Toggle("输出AI流程控制", RuntimeLogUtility.s_LogProcessInfo); _triggerID = EditorGUILayout.IntField("NPCID", _triggerID); if (GUILayout.Button("创建PVP敌方")) { PersonalEnemy.Create((uint)_triggerID, E_ActorGroup.Enemy, PlayerDatas.Instance.hero.Pos); // BossShowModel.Instance.Start(PlayerDatas.Instance.baseData.MapID, 10103001); // ClientDropItemUtility.Instance.Drop(PlayerDatas.Instance.hero.Pos, // new int[] { 5006, 5301, 5410, 5505, 10543, 1043050, // 5301, 5410, 5505, 10543, 1043050, // 5301, 5410, 5505, 10543, 1043050}); // var _npc = GAMgr.Instance.ReqClntFightNpc(10103001, E_ActorGroup.Enemy); // GActorPlayerBase.PlayerInfo _playerInfo = new GActorPlayerBase.PlayerInfo(); // _playerInfo.maxHp = (uint)PlayerDatas.Instance.extersion.MaxMP; // _playerInfo.hp = _playerInfo.maxHp; // _playerInfo.level = 200; // _playerInfo.job = 1; // _playerInfo.name = "机器人"; // _playerInfo.itemDatas = new GActorPlayerBase.CEquipInfo[4]; // // 10484, 10481, 10482, 3713 // _playerInfo.itemDatas[0] = new GActorPlayerBase.CEquipInfo // { // id = 10484, // place = (int)RoleEquipType.Clothes // }; // _playerInfo.itemDatas[1] = new GActorPlayerBase.CEquipInfo // { // id = 10481, // place = (int)RoleEquipType.Weapon // }; // _playerInfo.itemDatas[2] = new GActorPlayerBase.CEquipInfo // { // id = 10482, // place = (int)RoleEquipType.Weapon2 // }; // _playerInfo.itemDatas[3] = new GActorPlayerBase.CEquipInfo // { // id = 3713, // place = (int)RoleEquipType.Wing // }; // GAMgr.Instance.ReqClntPlayer(_playerInfo, E_ActorGroup.Player); // AdventureStage.Instance.Enter(); } if (GUILayout.Button("重置PVP敌方")) { // GA_PVPClientPlayer.Reset(); // AdventureStage.Instance.Exit(); ClientSceneManager.Instance.ExitClientFightMode(); } EditorGUILayout.BeginHorizontal(); _clientNpcSID = EditorGUILayout.IntField("NPC SID", _clientNpcSID); if (GUILayout.Button("显示NPC信息")) { var _npc = GAMgr.Instance.GetBySID((uint)_clientNpcSID) as GActorNpcFight; if (_npc != null) { Debug.LogFormat("{0} => 血量: {1}/{2}, 攻击: {3}-{4}, 防御: {5}", _clientNpcSID, _npc.ActorInfo.RealHp, _npc.ActorInfo.RealMaxHp, _npc.NpcConfig.MinAtk, _npc.NpcConfig.MaxAtk, _npc.NpcConfig.Def); } } EditorGUILayout.EndHorizontal(); _navChkPos = EditorGUILayout.Vector3Field("检测点", _navChkPos); if (GUILayout.Button("检测")) { Vector3 _position = Vector3.zero; if (GActor.TryGetValidPos(_navChkPos, ref _position)) { Debug.Log("正常点........: " + _position); } else { Debug.Log("障碍点........"); } } _param2 = EditorGUILayout.IntField("param2", _param2); _start = EditorGUILayout.Vector2Field("开始点", _start); _end = EditorGUILayout.Vector2Field("结束点", _end); _param1 = EditorGUILayout.IntField("角度", _param1); if (GUILayout.Button("创建障碍点")) { if (RuntimeLogUtility.obstacle) { DestroyImmediate(RuntimeLogUtility.obstacle.gameObject); } if (RuntimeLogUtility.sfx) { SFXPlayUtility.Instance.Release(RuntimeLogUtility.sfx); } RuntimeLogUtility.obstacle = SoMap.CreateImpasse.General(new Vector3(_start.x, 0, _start.y), new Vector3(_end.x, 0, _end.y), _param1); var _pos = RuntimeLogUtility.obstacle.transform.position; var _y = 0f; if (CollisionUtility.TryGetGroundHeight(_pos, out _y)) { _pos.y = _y; } float _scale = 1; _scale = RuntimeLogUtility.obstacle.transform.localScale.x * 0.25f; RuntimeLogUtility.sfx = SFXPlayUtility.Instance.PlayWithEulerAngle(1040, _pos, RuntimeLogUtility.obstacle.transform.eulerAngles); RuntimeLogUtility.sfx.duration = 0; RuntimeLogUtility.sfx.transform.localScale = new Vector3(_scale, 1, 1); } if (GUILayout.Button("清除障碍点")) { if (RuntimeLogUtility.obstacle) { DestroyImmediate(RuntimeLogUtility.obstacle.gameObject); } if (RuntimeLogUtility.sfx) { SFXPlayUtility.Instance.Release(RuntimeLogUtility.sfx); } } if (GUILayout.Button("直接重连")) { GameNetSystem.Instance.Reconnect(); } if (GUILayout.Button("GC.Collect()")) { System.GC.Collect(); } if (GUILayout.Button("Resources.UnloadUnusedAssets")) { Resources.UnloadUnusedAssets(); } if (GUILayout.Button("上马/下马")) { if (PlayerDatas.Instance.hero != null) { DTC0428_tagPlayerRideHorse.Send_tagPlayerRideHorse(PlayerDatas.Instance.hero.MovingState != E_MovingState.Ride); } } if (GUILayout.Button("采集")) { GA_Hero _hero = PlayerDatas.Instance.hero; if (_hero != null) { if (_hero.IsCollect()) { _hero.Idle(); } else if (_hero.IsIdle()) { _hero.Collect(); } } } GUILayout.Space(10); EditorGUILayout.LabelField("# 玩家当前信息 #"); if (PlayerDatas.Instance.hero != null) { GA_Hero _hero = PlayerDatas.Instance.hero; if (_hero.SkillMgr.CurCastSkill != null) { int _curSkillID = _hero.SkillMgr.CurCastSkill.id; bool _isCompelete = _hero.SkillMgr.CurCastSkill.SkillCompelete; bool _isXuli = _hero.SkillMgr.CurCastSkill.SkillPreparing; string _content = string.Format("ID: {0}, 蓄力:{2}, 完成: {1}", _curSkillID, _isCompelete, _isXuli); EditorGUILayout.LabelField("技能信息", _content); } EditorGUILayout.IntField("当前主角AI执行状态值: ", HeroAI_Base.stopReason); EditorGUILayout.TextField("队伍ID", _hero.ActorInfo.teamID.ToString()); EditorGUILayout.TextField("是否处于地图切换", GA_Hero.s_MapSwitching.ToString()); EditorGUILayout.TextField("当前身体状态", _hero.MovingState.ToString()); EditorGUILayout.TextField("当前行为状态", _hero.State.ToString()); EditorGUILayout.TextField("当前AI状态", _hero.aiHandler.currentType.ToString()); EditorGUILayout.TextField("是否死亡", _hero.ActorInfo.serverDie.ToString()); if (_hero.SelectTarget != null) { EditorGUILayout.TextField("当前选择目标", _hero.SelectTarget.ServerInstID.ToString()); } if (_hero.LockTarget != null) { EditorGUILayout.TextField("当前锁定目标", _hero.LockTarget.ServerInstID.ToString()); } for (MapArea.E_Type i = MapArea.E_Type.RebornSafe; i <= MapArea.E_Type.Boss; i = (MapArea.E_Type)((int)i << 1)) { bool _isIn = MapArea.IsInMapArea(_hero.CurMapArea, i); EditorGUILayout.Toggle(i.ToString(), _isIn); } } } } #endif