Unity 通用功能记录贴

记录下开发中会使用的一些通用api,避免之后每次都去查看过去工程的代码。
1.记录运行日志:

/// <summary>
    /// 保持的日志文件名称
    /// </summary>
    public const string saveLogFileName = "runLog.txt";
    private void Awake()
    {
        Application.logMessageReceived += SaveLog;
    }

    private string tempBeforeLog;
    /// <summary>
    /// 保存日志
    /// </summary>
    /// <param name="condition"></param>
    /// <param name="stackTrace"></param>
    /// <param name="type"></param>
    private void SaveLog(string condition, string stackTrace, LogType type)
    {
        if (condition.Equals(tempBeforeLog))//如果是相同的信息就不再写入
        {
            return;
        }
        string path = GetSaveLogPath();
        using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            using (StreamWriter sw = new StreamWriter(fs))
            {
                fs.Seek(0, SeekOrigin.End);
                sw.WriteLine(DateTime.Now.ToString("G") + " " + type.ToString() + ":" + condition + "{" + stackTrace + "}");
            }
        }
        tempBeforeLog = condition;
    }

2.监听程序退出和编辑器下的停止运行:

     	Application.wantsToQuit += OnQuitEvent;
     	#if UNITY_EDITOR
        EditorApplication.wantsToQuit += OnQuitEvent;
		#endif
 		//返回false回阻止发布后的程序关闭
 		private bool OnQuitEvent()
 		{
       		 return true;
 		}

3.监听UGUI窗口变化:

 	public void OnRectTransformDimensionsChange()
    {
       Debug.Log("窗口大小发生改变");
    }

4.在Awake之前执行

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void AwakeBefore()
    {
 		Debug.Log("在Awake之前调用");
    }

5.隐藏标题栏

 	[DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    public static extern long GetWindowLong(IntPtr hwd, int nIndex);
    [DllImport("user32.dll")]
    public static extern void SetWindowLong(IntPtr hwd, int nIndex, long dwNewLong);
 	[DllImport("user32")]
    static extern int EnumWindows(EnumWindowsCallBack lpEnumFunc, IntPtr lParam);
    [DllImport("user32")]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref IntPtr lpdwProcessId);
    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    public static extern System.IntPtr FindWindow(System.String className, System.String windowName);
    
    /// <summary>
    /// 窗口风格
    /// </summary>
    const int GWL_STYLE = -16;
    /// <summary>
    /// 标题栏
    /// </summary>
    const int WS_CAPTION = 0x00c00000;
    /// <summary>
    /// 外边框显示隐藏
    /// </summary>
    const uint WS_VISIBLE = 0x10000000;
	 private void Awake()
    {
#if !UNITY_EDITOR && UNITY_STANDALONE_WIN
		HideTitle();
        Screen.SetResolution(defaultWindowWidth,defaultWindowHeight,false);
#endif
    }
 	 private static void HideTitle()
    {
        GetSelfWindows();
        IntPtr window = myWindowHandle;//GetForegroundWindow();
        //GetForegroundWindow是获取的当前焦点程序窗口,在启动的一瞬间如果选中别的窗口,则会出现将选中的窗口标题栏隐藏的问题。
        var wl = GetWindowLong(window, GWL_STYLE);
        wl &= ~WS_CAPTION & WS_VISIBLE;
        SetWindowLong(window, GWL_STYLE, wl);
    }
    private static IntPtr myWindowHandle;
    /// <summary>
    /// 获取程序自身窗口
    /// </summary>
    public static void GetSelfWindows()
    {
        IntPtr handle = (IntPtr)System.Diagnostics.Process.GetCurrentProcess().Id;  //获取进程ID
        EnumWindows(new EnumWindowsCallBack(EnumWindCallback), handle);     //枚举查找本窗口
        //打包时的ProductName
        //myWindowHandle = FindWindow(null, "WindowTitleChange");
    }

隐藏后,会出现UGUI鼠标点击位置识别偏差问题,应该是差了一个标题栏的高度,在awake手动设置一下分辨率即可。

6.坐标旋转

/// <summary>
    /// 围绕某点旋转指定角度
    /// </summary>
    /// <param name="position">自身坐标</param>
    /// <param name="center">旋转中心</param>
    /// <param name="axis">围绕旋转轴</param>
    /// <param name="angle">旋转角度</param>
    /// <returns></returns>
    public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)
    {
        return Quaternion.AngleAxis(angle, axis) * (position - center) + center;
    }

7 清理所有进程内存

[DllImport("psapi.dll")]
    private static extern int EmptyWorkingSet(IntPtr hwProc);
    public static void ClearMemory()
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Process[] processes = Process.GetProcesses();

        foreach (Process process in processes)
        {
            try
            {
                EmptyWorkingSet(process.Handle);
            }
            catch (Exception ex)
            {
                Debug.Log(ex.Message);
            }
        }
    }

8 UGUI识别当前鼠标是否位于UI控件上

  public static Transform GetOverUI()
    {
        Transform obj = null;

        EventSystem uiEventSystem = EventSystem.current;
        if (uiEventSystem != null)
        {
            PointerEventData uiPointerEventData = new PointerEventData(uiEventSystem);
            uiPointerEventData.position = Input.mousePosition;

            List<RaycastResult> uiRaycastResultCache = new List<RaycastResult>();

            uiEventSystem.RaycastAll(uiPointerEventData, uiRaycastResultCache);
            if (uiRaycastResultCache.Count > 0)
            {
                obj = uiRaycastResultCache[0].gameObject.transform;
            }
        }

        return obj;
    }

9 Inspector 面板显示按钮,调用方法

#if UNITY_EDITOR
    [UnityEditor.CustomEditor(typeof(TestClass))]
    public class ViveInputAdapterManagerEditor : UnityEditor.Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            if (!Application.isPlaying)
            {
                var targetNode = target as TestClass;
                if (targetNode == null)
                {
                    return;
                }
                GUILayout.BeginHorizontal();
                if (GUILayout.Button("自定义按钮"))
                {
                    targetNode.Init();
                }
                GUILayout.EndHorizontal();
            }
        }
    }
#endif

10.获取模型中心点坐标

   public static Vector3 GetModelsCenter(GameObject go)
    {
        Vector3 center = Vector3.zero;
        MeshRenderer mr = go.GetComponent<MeshRenderer>();
        if (mr != null)
        {
            center = mr.bounds.center;
        }
        else
        {
            MeshRenderer[] mrs = go.GetComponentsInChildren<MeshRenderer>();
            for (int i = 0; i < mrs.Length; i++)
            {
                center += mrs[i].bounds.center;
            }
            if (mrs.Length > 0)
            {
                center /= mrs.Length;
            }

        }
        return center;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity通用新手引导管理器是一个用于管理和展示游戏中新手引导的工具。它可以帮助开发者在游戏中引导玩家进行操作和了解游戏规则,以提高游戏的易用性和玩家体验。 通用新手引导管理器通常包括以下功能: 1. 引导流程管理:可以定义和管理游戏中的引导流程,包括引导的顺序、条件和触发方式等。开发者可以根据游戏需求自定义引导流程,以逐步引导玩家进行游戏操作。 2. 引导提示展示:提供一系列的引导提示样式和展示方式,如弹窗、箭头指示、高亮显示等。开发者可以根据游戏风格和需求选择合适的样式和展示方式,以吸引玩家注意并引导其进行操作。 3. 引导条件判断:可以根据游戏状态或玩家操作判断是否触发引导。例如,在玩家第一次进入某个场景时触发引导,或者在玩家完成某个任务后触发引导。 4. 引导进度管理:可以记录玩家的引导进度,以确保每个玩家都能按照正确的顺序进行引导。开发者可以根据玩家的进度调整引导流程,以确保引导的连贯性和有效性。 5. 引导反馈与跳过:提供引导反馈机制,如玩家对引导步骤的反馈和评价。同时也应该允许玩家跳过某些引导步骤,以满足一些有经验的玩家的需求。 总之,Unity通用新手引导管理器可以帮助开发者设计和实现游戏中的新手引导,提供更好的游戏体验和上手指导,使玩家更容易上手并享受游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值