public virtual void keyProcess() { // F1切换日志等级 if (FrameBase.getKeyCurrentDown(KeyCode.F1)) { int newLevel = ((int)UnityUtility.getLogLevel() + 1) % (int)LOG_LEVEL.MAX; UnityUtility.setLogLevel((LOG_LEVEL)newLevel); } // F2检测当前鼠标坐标下有哪些窗口 if (FrameBase.getKeyCurrentDown(KeyCode.F2)) { Vector3 mousePos = FrameBase.getMousePosition(); var resultList = FrameBase.mGlobalTouchSystem.getAllHoverWindow(ref mousePos, null, true); int resultCount = resultList.Count; for (int i = 0; i < resultCount; ++i) { UIDepth depth = resultList[i].getDepth(); UnityUtility.log("窗口:" + resultList[i].getName() + ", 深度:layout:" + depth.toDepthString() + ", priority:" + depth.getPriority(), LOG_LEVEL.FORCE); } } // F3启用或禁用用作调试的脚本的更新 if (FrameBase.getKeyCurrentDown(KeyCode.F3)) { mEnableScriptDebug = !mEnableScriptDebug; } }
public void OnApplicationQuit() { destroy(); UnityUtility.log("程序退出完毕!", LOG_LEVEL.FORCE); #if !UNITY_EDITOR FrameBase.mLocalLog?.destroy(); FrameBase.mLocalLog = null; #endif }
public void Start() { UnityUtility.setMainThreadID(Thread.CurrentThread.ManagedThreadId); Application.targetFrameRate = 60; AppDomain app = AppDomain.CurrentDomain; app.UnhandledException += UnhandledException; mFrameComponentMap = new Dictionary<string, FrameSystem>(); mFrameComponentInit = new List<FrameSystem>(); mFrameComponentUpdate = new List<FrameSystem>(); mFrameComponentDestroy = new List<FrameSystem>(); mTimeLock = new ThreadTimeLock(15); // 本地日志的初始化在移动平台上依赖于插件,所以在本地日志系统之前注册插件 registeFrameSystem(UnityUtility.Typeof<AndroidPluginManager>()); registeFrameSystem(UnityUtility.Typeof<AndroidAssetLoader>()); #if !UNITY_EDITOR // 由于本地日志系统的特殊性,必须在最开始就初始化 FrameBase.mLocalLog = new LocalLog(); FrameBase.mLocalLog.init(); #endif UnityUtility.setLogCallback(getLogCallback()); UnityUtility.log("start game!", LOG_LEVEL.FORCE); UnityUtility.log("QualitySettings.currentLevel:" + QualitySettings.GetQualityLevel(), LOG_LEVEL.FORCE); UnityUtility.log("QualitySettings.activeColorSpace:" + QualitySettings.activeColorSpace, LOG_LEVEL.FORCE); UnityUtility.log("Graphics.activeTier:" + Graphics.activeTier, LOG_LEVEL.FORCE); UnityUtility.log("SystemInfo.graphicsDeviceType:" + SystemInfo.graphicsDeviceType, LOG_LEVEL.FORCE); UnityUtility.log("SystemInfo.maxTextureSize:" + SystemInfo.maxTextureSize, LOG_LEVEL.FORCE); UnityUtility.log("SystemInfo.supportsInstancing:" + SystemInfo.supportsInstancing, LOG_LEVEL.FORCE); UnityUtility.log("SystemInfo.graphicsShaderLevel:" + SystemInfo.graphicsShaderLevel, LOG_LEVEL.FORCE); try { DateTime startTime = DateTime.Now; start(); UnityUtility.log("start消耗时间:" + (DateTime.Now - startTime).TotalMilliseconds); // 根据设置的顺序对列表进行排序 mFrameComponentInit.Sort(FrameSystem.compareInit); mFrameComponentUpdate.Sort(FrameSystem.compareUpdate); mFrameComponentDestroy.Sort(FrameSystem.compareDestroy); notifyBase(); registe(); init(); } catch (Exception e) { string innerMessage = e.InnerException != null ? e.InnerException.Message : "empty"; UnityUtility.logError("init failed! " + e.Message + ", inner exception:" + innerMessage + "\nstack:" + e.StackTrace); } // 初始化完毕后启动游戏 launch(); mCurTime = DateTime.Now; }
// 打开一个二进制文件,fileName为绝对路径,返回值为文件长度 // 使用完毕后需要使用releaseFileBuffer回收文件内存 public static int openFile(string fileName, out byte[] fileBuffer, bool errorIfNull) { fileBuffer = null; try { #if !UNITY_ANDROID || UNITY_EDITOR FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); if (fs == null) { if (errorIfNull) { UnityUtility.log("open file failed! filename : " + fileName); } return(0); } int fileSize = (int)fs.Length; fileBuffer = FrameBase.mBytesPoolThread.newBytes(getGreaterPow2(fileSize)); fs.Read(fileBuffer, 0, fileSize); fs.Close(); fs.Dispose(); return(fileSize); #else // 安卓平台如果要读取StreamingAssets下的文件,只能使用AssetManager if (startWith(fileName, FrameDefine.F_STREAMING_ASSETS_PATH)) { // 改为相对路径 fileName = fileName.Substring(FrameDefine.F_STREAMING_ASSETS_PATH.Length, fileName.Length - FrameDefine.F_STREAMING_ASSETS_PATH.Length); fileBuffer = AndroidAssetLoader.loadAsset(fileName, errorIfNull); } // 安卓平台如果要读取persistentDataPath的文件,则可以使用File else if (startWith(fileName, FrameDefine.F_PERSISTENT_DATA_PATH)) { fileBuffer = AndroidAssetLoader.loadFile(fileName, errorIfNull); } else { UnityUtility.logError("openFile invalid path : " + fileName); } return(fileBuffer.Length); #endif } catch (Exception) { UnityUtility.log("open file failed! filename : " + fileName); } return(0); }
// 打开一个文本文件,fileName为绝对路径 public static string openTxtFile(string fileName, bool errorIfNull) { try { #if !UNITY_ANDROID || UNITY_EDITOR StreamReader streamReader = File.OpenText(fileName); if (streamReader == null) { if (errorIfNull) { UnityUtility.log("open file failed! filename : " + fileName); } return(null); } string fileBuffer = streamReader.ReadToEnd(); streamReader.Close(); streamReader.Dispose(); return(fileBuffer); #else // 安卓平台如果要读取StreamingAssets下的文件,只能使用AssetManager if (startWith(fileName, FrameDefine.F_STREAMING_ASSETS_PATH)) { // 改为相对路径 fileName = fileName.Substring(FrameDefine.F_STREAMING_ASSETS_PATH.Length, fileName.Length - FrameDefine.F_STREAMING_ASSETS_PATH.Length); return(AndroidAssetLoader.loadTxtAsset(fileName, errorIfNull)); } // 安卓平台如果要读取persistentDataPath的文件,则可以使用File if (startWith(fileName, FrameDefine.F_PERSISTENT_DATA_PATH)) { return(AndroidAssetLoader.loadTxtFile(fileName, errorIfNull)); } UnityUtility.logError("openTxtFile invalid path : " + fileName); return(null); #endif } catch (Exception) { UnityUtility.log("open file failed! filename : " + fileName); return(null); } }
protected virtual void init() { // 必须先初始化配置文件 int count = mFrameComponentInit.Count; for (int i = 0; i < count; ++i) { try { DateTime start = DateTime.Now; mFrameComponentInit[i].init(); UnityUtility.log(mFrameComponentInit[i].getName() + "初始化消耗时间:" + (DateTime.Now - start).TotalMilliseconds); } catch (Exception e) { UnityUtility.logError("init failed! :" + mFrameComponentInit[i].getName() + ", info:" + e.Message + ", stack:" + e.StackTrace); } } System.Net.ServicePointManager.DefaultConnectionLimit = 200; // 默认不启用调试脚本 mEnableScriptDebug = false; mEnableKeyboard = (int)FrameBase.mFrameConfig.getFloat(GAME_FLOAT.ENABLE_KEYBOARD) > 0; ApplicationConfig appConfig = FrameBase.mApplicationConfig; QualitySettings.vSyncCount = (int)appConfig.getFloat(GAME_FLOAT.VSYNC); int width = (int)appConfig.getFloat(GAME_FLOAT.SCREEN_WIDTH); int height = (int)appConfig.getFloat(GAME_FLOAT.SCREEN_HEIGHT); int fullScreen = (int)appConfig.getFloat(GAME_FLOAT.FULL_SCREEN); #if !UNITY_EDITOR && (UNITY_ANDROID || UNITY_IOS) // 移动平台下固定为全屏 fullScreen = 1; #endif Vector2 screenSize = UnityUtility.getScreenSize(); if (fullScreen == 1) { width = (int)screenSize.x; height = (int)screenSize.y; } Screen.SetResolution(width, height, fullScreen == 1 || fullScreen == 3); #if !UNITY_EDITOR && UNITY_STANDALONE_WIN // 设置为无边框窗口,只在Windows平台使用 if (fullScreen == 2) { // 无边框的设置有时候会失效,并且同样的设置,如果上一次设置失效后,即便恢复设置也同样会失效,也就是说本次的是否生效与上一次的结果有关 // 当设置失效后,可以使用添加启动参数-popupwindow来实现无边框 long curStyle = User32.GetWindowLong(User32.GetForegroundWindow(), FrameDefine.GWL_STYLE); curStyle &= ~FrameDefine.WS_BORDER; curStyle &= ~FrameDefine.WS_DLGFRAME; User32.SetWindowLong(User32.GetForegroundWindow(), FrameDefine.GWL_STYLE, curStyle); } #endif // UGUI GameObject uguiRootObj = UnityUtility.getGameObject(FrameDefine.UGUI_ROOT); RectTransform uguiRectTransform = uguiRootObj.GetComponent<RectTransform>(); uguiRectTransform.offsetMin = -screenSize * 0.5f; uguiRectTransform.offsetMax = screenSize * 0.5f; uguiRectTransform.anchorMax = Vector2.one * 0.5f; uguiRectTransform.anchorMin = Vector2.one * 0.5f; GameCamera camera = FrameBase.mCameraManager.getUICamera(); if (camera != null) { FT.MOVE(camera, new Vector3(0.0f, 0.0f, -height * 0.5f / MathUtility.tan(camera.getFOVY(true) * 0.5f))); } GameCamera blurCamera = FrameBase.mCameraManager.getUIBlurCamera(); if (blurCamera != null) { FT.MOVE(blurCamera, new Vector3(0.0f, 0.0f, -height * 0.5f / MathUtility.tan(blurCamera.getFOVY(true) * 0.5f))); } // 设置默认的日志等级 #if UNITY_EDITOR UnityUtility.setLogLevel(LOG_LEVEL.NORMAL); #else UnityUtility.setLogLevel((LOG_LEVEL)(int)FrameBase.mFrameConfig.getFloat(GAME_FLOAT.LOG_LEVEL)); #endif }
public void log(string info) { UnityUtility.log("android : " + info, 0); mOnAndroidLog?.Invoke(info); }