예제 #1
0
	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;
		}
	}
예제 #2
0
	public void OnApplicationQuit()
	{
		destroy();
		UnityUtility.log("程序退出完毕!", LOG_LEVEL.FORCE);
#if !UNITY_EDITOR
		FrameBase.mLocalLog?.destroy();
		FrameBase.mLocalLog = null;
#endif
	}
예제 #3
0
	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;
	}
예제 #4
0
    // 打开一个二进制文件,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);
    }
예제 #5
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);
        }
    }
예제 #6
0
	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
	}
예제 #7
0
 public void log(string info)
 {
     UnityUtility.log("android : " + info, 0);
     mOnAndroidLog?.Invoke(info);
 }