# am.unity_unitypackage **Repository Path**: game-for-all_0/am.unity_unitypackage ## Basic Information - **Project Name**: am.unity_unitypackage - **Description**: Am.Unity 是一个高性能、低内存占用的 Unity 3D 解决方案。此仓库的内容是一个 Unity 3D 自定义包。 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-02 - **Last Updated**: 2024-04-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 介绍 Am.Unity 是一个高性能、低内存占用的 Unity 3D 解决方案。 # 依赖 在向您的 Unity 3D 项目添加这个包之前,您需要首先添加这些依赖的包: * Unity UI(官方); * [Am](https://gitee.com/kevin-games/am_unitypackage)。 # 使用 此仓库的内容是一个 Unity 3D 自定义包,您可以通过以下几个步骤将这个包添加到您的 Unity 3D 项目中: 1. 在 Unity 3D 的菜单栏点击`Window`,然后在弹出的二级菜单中点击`Package Manager`,打开包管理器窗口; 2. 在包管理器窗口中点击左上角的`+`按钮,选择`Add package from git URL...`,然后填入此仓库的 git 地址,最后点击`Add`按钮。 # 示例 ## 拓展播放器循环 [PlayerLoop(播放器循环)](https://docs.unity3d.com/ScriptReference/LowLevel.PlayerLoop.html) 是 Unity 的一个重要的底层概念,Unity 中各种代码按由默认的播放器循环规定的顺序执行。
Am.Unity 向默认的播放器循环注入了 5 个代码执行点,它们分别位于第一次动态帧率更新之前(`UpdatePhase.Update`)、第一次动态帧率更新之后(`UpdatePhase.UpdateDelayed`)、第二次动态帧率更新之前(`UpdatePhase.LateUpdate`)、固定帧率更新之前(`UpdatePhase.FixedUpdate`)、固定帧率更新之后(`UpdatePhase.FixedUpdateDelayed`)。
使用 `PlayerLoopUtility.AddPlayerLoopItem` 添加播放器更新循环操作。
使用 `PlayerLoopUtility.RemovePlayerLoopItem` 移除播放器更新循环操作。
使用 `PlayerLoopUtility.AddContinuation` 添加延续操作。 ## 可等待表达式 基于 C# 规范[可等待表达式](https://learn.microsoft.com/dotnet/csharp/language-reference/language-specification/expressions#12982-awaitable-expressions),[Am](https://gitee.com/kevin-games/am) 框架提供 [IAwaitable](https://gitee.com/kevin-games/am/blob/master/Am/CompilerServices/IAwaitable.cs)、[IAwaitable\](https://gitee.com/kevin-games/am/blob/master/Am/CompilerServices/IAwaitable`1.cs)、[IAwaiter](https://gitee.com/kevin-games/am/blob/master/Am/CompilerServices/IAwaiter.cs)、[IAwaiter\](https://gitee.com/kevin-games/am/blob/master/Am/CompilerServices/IAwaiter`1.cs) 四个接口。
Am.Unity 在此基础上提供了一些实现,例如:
> - [MainThreadAwaitable](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/CompilerServices/MainThreadAwaitable.cs) 结构,提供上下文,用于在切换到 Unity 主线程时等待。 > - [UpdatePhaseAwaitable](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/CompilerServices/UpdatePhaseAwaitable.cs) 结构,提供上下文,用于在切换到更新阶段时等待。 > - [DelayFrameAwaitable](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/CompilerServices/DelayFrameAwaitable.cs) 结构,提供上下文,用于等待几帧。 > - [AsyncOperationAwaitable](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/CompilerServices/AsyncOperationAwaitable.cs) 结构,提供上下文,用于在 [AsyncOperation](https://docs.unity3d.com/ScriptReference/AsyncOperation.html) 执行时等待。 > - 以及更多,它们都位于 [CompilerServices](https://gitee.com/kevin-games/am.unity_unitypackage/tree/master/Runtime/CompilerServices) 目录下。 ## Unity 主线程任务调度器 [UnityMainThreadTaskScheduler](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/Threading/Tasks/UnityMainThreadTaskScheduler.cs) 类实现 Unity 主线程任务调度器。
它继承自 [TaskScheduler](https://learn.microsoft.com/dotnet/api/system.threading.tasks.taskscheduler)。
可继续拓展此类,实现更复杂的调度方式,例如,假如您想要在 Unity 主线程中排队和执行任务,并且想要限制每帧执行任务的耗时,可写一个类,继承 UnityMainThreadTaskScheduler 类,初始化一个计时器,重写 `UnityMainThreadTaskScheduler.BeginProcess` 属性,在其中重置计时器,然后重写 `UnityMainThreadTaskScheduler.Continue` 属性,在其中判断计时器的当前时间超过了您期望的最大耗时时返回 `false` 以结束这一帧的任务处理。 ## 图形 Am.Unity 提供下列图形组件,它们都继承自 [MaskableGraphic](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.UI.MaskableGraphic.html) 类: > - [Clear(透明)](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/Clear.cs),它不绘制任何图像,但可以接收点击事件。 > - [Block(色块)](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/Block.cs),若您只需要一个简单矩形,请使用它,而不是使用 [Image](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.UI.Image.html) 或 [RawImage](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.UI.RawImage.html)(这两者会带来额外消耗)。 > - [Circle(圆)](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/Circle.cs),它用于绘制圆形。 > - [Annulus(环)](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/Annulus.cs),它用于绘制环形。 > - [RoundedRectangle(圆角矩形)](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/RoundedRectangle.cs),它用于绘制圆角矩形。 > - [RoundedRectangleBorder(圆角矩形边框)](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/RoundedRectangleBorder.cs),它用于绘制圆角矩形边框。 > - [CustomGraphic(自定义图形)](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/CustomGraphic.cs),想绘制点特别的图形时,用这个,传入各顶点的位置、UV,并传入各三角形的顶点索引即可,您也可以通过这个组件学习 Unity UI 绘制图形的原理。 ## 控件 Am.Unity 提供下列控件组件: > - [AmTimer(计时器)](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/AmTimer.cs),它用于计时。 > - [AmButton(按钮)](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/AmButton.cs),它可同时作为按钮和开关,具体取决于您想要如何使用它。 ## 布局组 Am.Unity 提供下列布局组: > - [ScrollLayoutGroup](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/ScrollLayoutGroup.cs),它用于滚动布局。 > - [WrappedLinearLayoutGroup](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/WrappedLinearLayoutGroup.cs),它用于自动换行线性布局。 ## 界面系统 [View](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/ViewSystem/View.cs) 类实现界面。
使用 `View.RootViewContainer` 设置根界面的容器。
其中,根界面,是指没有父界面的界面;允许有多个根界面,它们都位于根界面的容器下。
每个界面都可以有多个子界面。
使用 `View.OpenAsync`,并向第一个参数`parent`传入一个已有的界面,可让此次异步操作打开的界面以`parent`为父界面;否则,它将没有父界面,也就是说它将成为一个根界面。
使用 `View.Close` 关闭界面。 使用 `View.Parent` 获取或设置父界面,设为`null`时表示让它成为根界面。 [ViewHandler](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/ViewSystem/ViewHandler.cs) 类实现界面处理程序,用于创建新界面、回收或销毁旧界面。
您必须使用 `ViewHandler.Register` 将您自定义的 ViewHandler 的子类注册到界面系统中。
在创建界面、关闭界面时,界面系统将选择合适的 ViewHandler 来实际执行这些操作。 ## 轴对齐包围盒 >- [AABB2](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/AABB2.cs),二维轴对齐包围盒。 >- [AABB3](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/AABB3.cs),三维轴对齐包围盒。 ## 判断音频源的状态 使用 `AudioSourceExtensions.GetStatus` 获取 [AudioSource(音频源)](https://docs.unity3d.com/ScriptReference/AudioSource.html) 的状态,共有 4 种状态: > 1. 没有音频剪辑(`AudioSourceStatus.None`) > 2. 停止(`AudioSourceStatus.Stopped`) > 3. 播放(`AudioSourceStatus.Playing`) > 4. 暂停(`AudioSourceStatus.Paused`) (小声地说)“如何区分停止与暂停状态”相信也是困扰某些朋友很久的问题了吧? ## 获取特殊的取消令牌 > - 使用 `GameObjectExtensions.GetDestroyCancellationToken` 获取与游戏物体生存状态关联的取消令牌。 > - 使用 `GameObjectExtensions.GetDisableCancellationToken` 获取与游戏物体的激活状态关联的取消令牌。 ## 矩形变换工具类 [AmRectTransformUtility](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UI/AmRectTransformUtility.cs) 是矩形变换工具类,它提供了各种方法设置矩形变换的各属性。 ## 使用单例模式的单线行为 想要拥有一个单例脚本?继承 [SingletonBehaviour\](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/SingletonBehaviour.cs) 类即可! ## 在 Unity 中发送 HTTP 请求和接收 HTTP 响应 注意以下两点事实: > 1. C# 规范建议使用 [HttpClient](https://learn.microsoft.com/dotnet/api/system.net.http.httpclient) 类发送 HTTP 请求和接收 HTTP 响应。 > 2. Unity 建议使用 [UnityWebRequest](https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.html) 类发送 HTTP 请求和接收 HTTP 响应。 您将会如何选择?似乎很难完全倒向其中一方。
Am.Unity 提供了 [UnityWebRequestHandler](https://gitee.com/kevin-games/am.unity_unitypackage/blob/master/Runtime/UnityWebRequestHandler.cs) 类来解决这一问题。
您应该遵循 C# 规范,使用 HttpClient 类发送 HTTP 请求和接收 HTTP 响应,但是,您可以在初始化 HttpClient 实例时,传入一个 UnityWebRequestHandler 实例。
这样,您既使用了 HttpClient 类发送 HTTP 请求和接收 HTTP 响应,又在其内部将这些工作交给了 UnityWebRequest 类来完成,两全其美的做法! 事实上,当您要将这些 HTTP 代码移植到其它使用 C# 语言开发的项目中时,您可以保持原有的代码不变,仅将这里传入的 UnityWebRequestHandler 实例替换为另一个 [HttpMessageHandler](https://learn.microsoft.com/dotnet/api/system.net.http.httpmessagehandler) 子类的实例即可。