当前位置: 首页 > news >正文

上线倒计时单页网站模板做网站的资金来源

上线倒计时单页网站模板,做网站的资金来源,阳江网站seo公司,网站页面设计基础教程Unity 权限 之 Android 【权限 动态申请】功能的简单封装 目录 Unity 权限 之 Android 【权限 动态申请】功能的简单封装 一、简单介绍 二、Android 权限 动态申请 三、实现原理 四、注意事项 五、案例实现简单步骤 附录#xff1a; 一、进一步优化 二、多个权限申请…Unity 权限 之 Android 【权限 动态申请】功能的简单封装 目录 Unity 权限 之 Android 【权限 动态申请】功能的简单封装 一、简单介绍 二、Android 权限 动态申请 三、实现原理 四、注意事项 五、案例实现简单步骤 附录 一、进一步优化 二、多个权限申请代码参考 一、简单介绍 Unity 是一个功能强大的跨平台游戏引擎广泛用于开发视频游戏和其他实时3D互动内容如模拟器和虚拟现实应用。 游戏引擎 UnityUnity Technologies 开发的跨平台游戏引擎支持2D和3D图形、物理引擎、音频、视频、网络和多平台发布。跨平台支持Unity 支持在多个平台上发布包括 Windows、macOS、Linux、iOS、Android、WebGL、PlayStation、Xbox、Switch 等。 开发环境 Unity Editor用于创建和管理 Unity 项目的集成开发环境IDE。开发者可以在其中创建场景、设计关卡、编写代码和调试游戏。场景SceneUnity 中的基本构建块一个场景可以被视为一个关卡或一个游戏中的独立部分。 编程语言 C#主要编程语言。Unity 使用 C# 脚本来控制游戏对象和实现游戏逻辑。UnityScript已弃用曾经支持的 JavaScript 变种但已经被弃用。 Unity 进阶开发涉及更复杂的技术和更深入的知识以创建高性能、复杂和专业的游戏和应用程序。以下是一些 Unity 进阶开发的关键领域和技术 设计模式 学习和应用常见的设计模式如单例模式、工厂模式、观察者模式以便更好地组织和管理代码。 异步编程 使用 C# 的 async 和 await 关键字进行异步编程以提高应用的响应速度和性能。 依赖注入 使用依赖注入如 Zenject来管理对象的依赖关系减少耦合提高代码的可测试性和可维护性。 二、Android 权限 动态申请 在开发 Unity Android 应用时动态获取权限是一个常见的需求。由于 Android 6.0API 级别 23引入了运行时权限模型应用必须在运行时请求某些权限。下面是一个如何在 Unity 中封装动态获取权限功能的示例。 在 Unity 中仅使用 C# 代码来处理 Android 动态权限请求是可能的但仍需要调用 Android 的原生 API。这可以通过 AndroidJavaClass 和 AndroidJavaObject 来实现。 三、实现原理 PermissionManager 是一个用于管理 Android 权限请求的单例类。其主要功能是动态请求权限并在用户响应后处理结果。以下是其工作原理和实现步骤的详细解释 单例模式 PermissionManager 使用单例模式确保在整个应用生命周期中只有一个实例。 权限请求接口 RequestPermission 方法用于请求特定的权限。首先检查权限是否已经授予如果已授予则立即调用回调函数返回结果。如果权限未授予启动协程 RequestAndCheckPermission 请求权限并等待用户响应。 协程处理 RequestAndCheckPermission 方法通过协程 IEnumerator 实现异步等待。使用 Permission.RequestUserPermission 方法请求权限。使用 yield return new WaitForSeconds(1.0f) 等待一段时间让用户有足够时间响应权限请求。等待结束后再次检查权限状态并调用回调函数返回结果。 四、注意事项 权限列表 确保在 AndroidManifest.xml 中声明所有需要请求的权限否则请求可能会失败。例如 uses-permission android:nameandroid.permission.CAMERA / 权限请求的异步性 用户响应权限请求的时间是不确定的。使用协程 (IEnumerator) 异步等待用户响应而不阻塞主线程是必要的。yield return new WaitForSeconds(1.0f) 是一个简单的等待机制实际项目中可能需要更复杂的逻辑来处理用户的响应。 回调函数 确保传递给 RequestPermission 的回调函数能正确处理权限被授予或拒绝的情况。回调函数签名为 System.Actionstring, bool其中第一个参数是权限名第二个参数是权限是否被授予的布尔值。 用户体验 提示用户为什么需要请求特定权限以提高用户接受权限请求的概率。在权限被拒绝后提供适当的反馈和处理机制如再次请求权限或退出相关功能。 多权限请求 当前示例处理单个权限请求。如果需要请求多个权限可以扩展 PermissionManager 类以支持批量请求并分别处理每个权限的授予结果。 五、案例实现简单步骤 1、新建一个 Unity 工程 2、新建脚本 PermissionWrapper 封装权限申请功能 3、新建脚本 TestPermissionWrapper 测试封装权限申请功能申请 camera 权限 4、把 TestPermissionWrapper  挂载到场景中 5、在 Player Settings 中的 Build 中勾选 Custom Main Manifest 添加 Camera 权限申请 6、打包运行 六、关键代码 1、PermissionWrapper using UnityEngine; using UnityEngine.Android;public class PermissionWrapper : MonoSingletonPermissionWrapper {/// summary/// 请求权限/// /summary/// param namepermission权限名称/param/// param namecallback权限回调true 权限获取成功回调false 权限获取失败回调/parampublic void RequestPermission(string permission, System.Actionstring, bool callback){if (Permission.HasUserAuthorizedPermission(permission)){callback?.Invoke(permission, true);}else{StartCoroutine(RequestAndCheckPermission(permission, callback));}}/// summary/// 协程请求权限/// /summary/// param namepermission权限名称/param/// param namecallback权限回调true 权限获取成功回调false 权限获取失败回调/param/// returns/returnsprivate System.Collections.IEnumerator RequestAndCheckPermission(string permission, System.Actionstring, bool callback){Permission.RequestUserPermission(permission);yield return new WaitForSeconds(1.0f);bool granted Permission.HasUserAuthorizedPermission(permission);callback?.Invoke(permission, granted);} }2、TestPermissionWrapper using UnityEngine; using UnityEngine.Android;public class TestPermissionWrapper : MonoBehaviour {private void Start(){// 请求摄像头权限PermissionWrapper.Instance.RequestPermission(Permission.Camera, OnPermissionResult);}private void OnPermissionResult(string permission, bool granted){if (granted){Debug.Log(权限已授予: permission);// 执行需要权限的功能}else{Debug.Log(权限被拒绝: permission);// 处理权限被拒绝的情况}} }3、MonoSingleton using System; using UnityEngine;public abstract class MonoSingletonT : MonoBehaviour where T : MonoSingletonT {private static T m_Instance;public static T Instance{get{if ((UnityEngine.Object)m_Instance (UnityEngine.Object)null){T[] array UnityEngine.Object.FindObjectsOfTypeT();if (array ! null array.Length ! 0){if (array.Length ! 1){throw new Exception($## Uni Exception ## Cls:{typeof(T)} Info:Singleton not allows more than one instance);}m_Instance array[0];}else{m_Instance new GameObject(${typeof(T).ToString()}(Singleton)).AddComponentT();m_Instance.OnSingletonInit();}}return m_Instance;}}protected virtual void Awake(){m_Instance this as T;}protected virtual void OnDestroy(){m_Instance null;}protected virtual void OnSingletonInit(){} } 4、AndroidManifest.xml ?xml version1.0 encodingutf-8? manifestxmlns:androidhttp://schemas.android.com/apk/res/androidpackagecom.unity3d.playerxmlns:toolshttp://schemas.android.com/tools!--相机权限--uses-permission android:nameandroid.permission.CAMERA /applicationactivity android:namecom.unity3d.player.UnityPlayerActivityandroid:themestyle/UnityThemeSelectorintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filtermeta-data android:nameunityplayer.UnityActivity android:valuetrue //activity/application /manifest附录 一、进一步优化 用户提示在请求权限前先提示用户为何需要该权限增强用户接受度。多权限支持实现多权限同时请求的逻辑。超时处理考虑在等待用户响应时添加超时处理逻辑避免无限期等待。权限变更监听实现权限变更监听当用户在应用设置中更改权限时做出相应处理。 通过这些改进和注意事项可以确保权限请求功能更加健壮和用户友好。 二、多个权限申请代码参考 1、PermissionJudgeMgr using FfalconXR; using FFALFramework.UIModule; using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Android;public class PermissionJudgeMgr : MonoSingletonPermissionJudgeMgr {#region Data/// summary/// TAG/// /summaryconst string TAG [PermissionJudgeMgr] ;/// summary/// 权限申请列表/// /summaryListIRequestPermissionItem m_RequestPermissionItemLst;/// summary/// 请求权限回调/// /summaryprivate PermissionCallbacks m_PermissionCallbacks;/// summary/// 全部权限允许后的事件/// /summarypublic Action OnAllPermissionGrantedAction;/// summary/// 判断是否有权限/// /summarypublic bool IsHasPermission { get { return JudgeIsHasPermission(); } }#endregion#region public function/// summary/// 检测 权限/// /summarypublic void CheckAppPermission(){CheckRequestPermissionLst();}#endregion#region 生命周期/// summary/// OnSingletonInit/// /summaryprotected override void OnSingletonInit(){base.OnSingletonInit();RegisterPermissionListener();}/// summary/// OnDestroy/// /summaryprotected override void OnDestroy(){base.OnDestroy();UnRegisterPermissionListener();}#endregion#region private function/// summary/// 检测权限队列/// /summaryprivate void CheckRequestPermissionLst() {IRequestPermissionItem requestPermissionItem null;foreach (var item in m_RequestPermissionItemLst){if (item.IsHasPermission false){requestPermissionItem item;break;}}if (requestPermissionItem ! null){requestPermissionItem.RequestPermission(m_PermissionCallbacks);}else{OnAllPermissionGrantedAction?.Invoke();}}/// summary/// 注册权限监听/// /summaryprivate void RegisterPermissionListener(){UIManager.Instance.QuitAll();AddRequestPermissionItem();m_PermissionCallbacks new PermissionCallbacks();//对系统权限处理的回调m_PermissionCallbacks.PermissionGranted OnPermissionGranted;m_PermissionCallbacks.PermissionDenied OnPermissionDenied;}/// summary/// 取消权限监听/// /summaryprivate void UnRegisterPermissionListener(){m_PermissionCallbacks.PermissionGranted - OnPermissionGranted;m_PermissionCallbacks.PermissionDenied - OnPermissionDenied;m_PermissionCallbacks null;OnAllPermissionGrantedAction null;m_RequestPermissionItemLst.Clear();m_RequestPermissionItemLst null;}/// summary/// 权限授予事件/// /summary/// param namePermission/paramprivate void OnPermissionGranted(string Permission){MainThreadQueue.Instance.ExecuteQueue.Enqueue(() {Debug.Log(TAGOnPermissionGranted(): Permission);// 继续请求其他权限CheckRequestPermissionLst();});}/// summary/// 权限拒绝事件/// /summary/// param namePermission/paramprivate void OnPermissionDenied(string Permission){MainThreadQueue.Instance.ExecuteQueue.Enqueue(() {Debug.Log(TAG OnPermissionDenied(): Permission);// Todo 提示1、打开失败页界面2、然后可以继续请求权限});}/// summary/// 添加权限申请判断/// /summaryprivate void AddRequestPermissionItem() {m_RequestPermissionItemLst new ListIRequestPermissionItem();// 相机权限获取m_RequestPermissionItemLst.Add(new CameraRequestPermissionItem());// 麦克风权限获取m_RequestPermissionItemLst.Add(new MicrophoneRequestPermissionItem());// 继续添加更多...}/// summary/// 判断是否有权限没有申请/// /summary/// returns/returnsprivate bool JudgeIsHasPermission() {if (m_RequestPermissionItemLst null) return true;else {foreach (var item in m_RequestPermissionItemLst){if (item.IsHasPermission false) return false;}}return true;}#endregion }2、CameraRequestPermissionItem using UnityEngine.Android;public class CameraRequestPermissionItem : BaseRequestPermissionItem {/// summary/// TAG/// /summaryprotected override string TAG { get; } [CameraRequestPermissionItem] ;/// summary/// 去申请的权限名称/// /summarypublic override string ToRequestPermissionName Permission.Camera; }3、MicrophoneRequestPermissionItem using UnityEngine.Android;public class MicrophoneRequestPermissionItem : BaseRequestPermissionItem {/// summary/// TAG/// /summaryprotected override string TAG { get; } [MicrophoneRequestPermissionItem] ;/// summary/// 去申请的权限名称/// /summarypublic override string ToRequestPermissionName Permission.Microphone; } 4、BaseRequestPermissionItem using UnityEngine; using UnityEngine.Android;public class BaseRequestPermissionItem : IRequestPermissionItem {#region Data/// summary/// TAG/// /summaryprotected virtual string TAG { get; } [BaseRequestPermissionItem] ;/// summary/// 去申请的权限名称/// /summarypublic virtual string ToRequestPermissionName Permission.Camera;/// summary/// 判断是否有权限/// /summarypublic virtual bool IsHasPermission Permission.HasUserAuthorizedPermission(ToRequestPermissionName);#endregion#region Interface function/// summary/// 请求权限/// /summary/// param namepermissionCallbacks权限回调事件/parampublic virtual void RequestPermission(PermissionCallbacks permissionCallbacks){if (permissionCallbacks null) {Debug.LogError(TAG RequestPhoneStatePermission() permissionCallbacks is null );return;}if (!IsHasPermission){Debug.Log(TAG RequestPhoneStatePermission() );Permission.RequestUserPermission(ToRequestPermissionName, permissionCallbacks);}}#endregion }5、IRequestPermissionItem using UnityEngine.Android;public interface IRequestPermissionItem {/// summary/// 去申请的权限名称/// /summarystring ToRequestPermissionName { get; }/// summary/// 请求权限/// /summary/// param namepermissionCallbacks权限回调事件/paramvoid RequestPermission(PermissionCallbacks permissionCallbacks);/// summary/// 判断是否有权限/// /summarybool IsHasPermission { get; } }
http://www.w-s-a.com/news/428785/

相关文章:

  • 泸州市建设厅网站中小企业网络需求分析
  • asp网站版权做网页价格
  • 长春网站建设路关键词优化公司哪家好
  • 河南省建设银行网站年报天津设计师网站
  • 沙洋网站定制如果自己建立网站
  • 凡科网站怎么做建站关键字搜索网站怎么做
  • 小说网站建站程序企业邮箱地址
  • 福州市住房和城乡建设网站网站开发方案论文
  • 在线教育网站开发网站推广常用方法包括
  • 东莞高端品牌网站建设软件开发模型及特点
  • 个人网站的设计与实现的主要内容网站开发公司架构
  • 浏览器收录网站什么是新媒体营销
  • 上海营销网站建设公司下面哪个不是网页制作工具
  • 有哪些网站可以做设计比赛苏州设计公司排名前十
  • 公益网站建设需求车陂手机网站开发
  • 高端网站建设专业营销团队宁德网站建设51yunsou
  • 网站如何做cdn购物网站建设app开发
  • 简单的手机网站模板好看大方的企业网站源码.net
  • 沈阳住房和城乡建设厅网站网站个人备案做论坛
  • 企业建网站的目的开家网站建设培训班
  • 做怎么网站网站优化和推广
  • 建站工具 风铃网站每年空间域名费用及维护费
  • 网站开发工具 知乎工业软件开发技术就业前景
  • 永济微网站建设费用新手如何自学编程
  • 在本地怎么做网站深圳保障房申请条件2022
  • 广州天河区网站建设公司东莞网络游戏制作开发
  • 哪个网站做免费小程序rio门户网站的制作
  • 短网站生成查询网站所有关键词排名
  • 阿里云购买网站登录技术服务外包公司
  • 淘宝单页面网站手机制作游戏的软件