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

外贸网站建设合同刷关键词排名seo

外贸网站建设合同,刷关键词排名seo,怎么做自己的优惠券网站,ps做网站目录 缘由: 分析: 准备: 完整代码: 缘由: 在使用FairyGUI作为项目UI开发时,有时会使用FairyGUI提供的Scripting Define Symbols。当前FairyGUI中的Scripting Define Symbols有: 骨骼动画 …

目录

缘由:

分析: 

准备:

完整代码:

缘由:

在使用FairyGUI作为项目UI开发时,有时会使用FairyGUI提供的Scripting Define Symbols。当前FairyGUI中的Scripting Define Symbols有:

骨骼动画 Spine:FAIRYGUI_SPINE,龙骨:FAIRYGUI_DRAGONBONES

字体 TextMeshPro:FAIRYGUI_TMPRO

使用ToLua:FAIRYGUI_TOLUA

使用Puerts:FAIRYGUI_PUERTS

显示阿拉伯文本:RTL_TEXT_SUPPORT

UI自动化测试:FAIRYGUI_TEST

 为了方便开发,以上Scripting Define Symbols我将其做成了Unity的菜单,直接看完整代码。

分析: 

在开始制作菜单之前,需要做一些准备工作。比如上述的Scripting Define Symbols是否需要额外的Unity资源包,是否需要熟悉Unity编辑器中的一些方法才能进行?

而且需要注意的是新建的Unity工程中,TextMeshPro组件的必要资源库是需要手动导入或引用的,所以在使用FGUI提供的FAIRYGUI_TMPRO时,需要对TextMeshPro包进行检测。

对于编辑器中的Scripting Define Symbols设置可以通过方法GetScriptingDefineSymbolsForGrouphSetScriptingDefineSymbolsForGroup进行操作。菜单状态则可以通过方法:GetCheckedSetChecked来进行操作。菜单状态的变化Scripting Define Symbols设置有关,所以还要自定义一个同步刷新菜单状态的方法RefreshMenuState

准备:

分析结束,我们在代码中写一下上面的分析结果。新建脚本EditorMenuTool,空间名设置为FairyGUIEditor,添加对UnityEditor的引用。将新建的EditorMenuTool脚本,放到FairyGUI的Editor目录下(也可以根据项目目录结构放置),打开脚本。

#if UNITY_EDITOR
using System;
using UnityEditor;
using UnityEngine;namespace FairyGUIEditor
{public class EditorMenuTool{}
}
#endif

Scripting Define Symbols的操作方法:

        /// <summary>/// 获取Scripting Define Symbols的值/// </summary>/// <returns></returns>private static string GetScriptingDefineSymbolsForGroup(){return PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);}/// <summary>/// 设置Scripting Define Symbols的值/// </summary>/// <param name="newSymbol">新的宏定义</param>private static void SetScriptingDefineSymbolsForGroup(string newSymbol){PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup,newSymbol);}/// <summary>/// 检测Scripting Define Symbols中是否存在目标值/// </summary>/// <param name="define">目标宏</param>/// <returns></returns>private static bool CheckScriptingDefineSymbolsExist(string define){string symbol = GetScriptingDefineSymbolsForGroup();return symbol.Contains(define);}/// <summary>/// 根据菜单状态修改目标宏/// </summary>/// <param name="define">目标宏定义</param>/// <param name="menuState">当前菜单状态</param>private static void SwitchToTargetState(string define, bool menuState = false){//检测目标宏定义if (define == null)return;//获取当前的宏定义string symbol = GetScriptingDefineSymbolsForGroup();if (menuState) //菜单已选中{//获取目标宏所在的位置int index = symbol.IndexOf(define);if (index < 0)return;//如果不在第一个 则将其前面的分号删掉if (index > 0)index -= 1;int length = define.Length;//如果当前宏长度大于要删除的当前长度,才会有分号if (symbol.Length > length)length += 1;//删除目标宏定义symbol = symbol.Remove(index, length);SetScriptingDefineSymbolsForGroup(symbol);}else //菜单未选中{//如果当前的宏是空的,则直接将目标的宏加入if (symbol.Equals(string.Empty))SetScriptingDefineSymbolsForGroup(define);else{//否则,以分号分割加入目标宏string newSymbol = symbol + ";" + define;SetScriptingDefineSymbolsForGroup(newSymbol);}}}

包管理(PackageManager)的检测方法:

        /// <summary>/// 检测目标包是否存在/// </summary>/// <param name="packageName">包名</param>/// <param name="callback"></param>private static void CheckTargetPackageExists(string packageName,Action<bool> callback = null){// 创建一个ListRequest请求,用来查询PackageManager中已经安装的packages列表ListRequest request = Client.List();// 发送ListRequest请求,并在每一帧检查请求是否已经完成EditorApplication.CallbackFunction checkUpdateAction = null;checkUpdateAction = () =>{if (request.IsCompleted){bool packageExists = false;EditorUtility.ClearProgressBar();if (request.Status == StatusCode.Success){// 遍历packages列表,查找目标packageName是否存在foreach (var package in request.Result){if (package.name.Contains(packageName) || package.displayName.Contains(packageName)){packageExists = true;break;}}}else if (request.Status >= StatusCode.Failure){Debug.LogError(request.Error.message);}callback?.Invoke(packageExists);// 取消update回调函数EditorApplication.update -= checkUpdateAction;}};EditorApplication.update += checkUpdateAction;EditorUtility.DisplayProgressBar("Check", "Please wait...", 0f);}

同步刷新菜单的方法:

/// <summary>
/// 刷新菜单状态
/// 标签"UnityEditor.Callbacks.DidReloadScripts"可以在脚本编译完成后自动回调这个方法
/// 标签"RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)"在场景加载前执行这个方法
/// </summary>
[UnityEditor.Callbacks.DidReloadScripts,RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void RefreshMenuState()
{//添加需要更新菜单
}

添加UnityEditor.Callbacks.DidReloadScriptsRuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)标签,会在脚本编译完或场景加载前进行状态同步,是个很方便的功能。举例:和小伙伴们一起开发时,只需要自己这边配置好,同步到其他小伙伴那边时,他们的编译器自动就会刷新新配置对应菜单状态。 

完整代码:

#if UNITY_EDITOR
using System;
using UnityEditor;
using UnityEngine;
using UnityEditor.PackageManager;
using UnityEditor.PackageManager.UI;
using UnityEditor.PackageManager.Requests;namespace FairyGUIEditor
{public class EditorMenuTool{#region Define Symbols/// <summary>/// <a href="https://www.fairygui.com/docs/editor/skeleton#%E5%9C%A8unity%E4%B8%AD%E4%BD%BF%E7%94%A8"> 骨骼动画 </a> Spine:FAIRYGUI_SPINE,龙骨:FAIRYGUI_DRAGONBONES/// </summary>private const string DefineSpine = "FAIRYGUI_SPINE", DefineDragonBones = "FAIRYGUI_DRAGONBONES";/// <summary>/// <a href="https://www.fairygui.com/docs/editor/font#textmeshpro%E6%94%AF%E6%8C%81"> 字体 TextMeshPro </a>:FAIRYGUI_TMPRO/// </summary>private const string DefineTMP = "FAIRYGUI_TMPRO";/// <summary>/// <a href="https://www.fairygui.com/docs/unity/lua"> 使用ToLua </a>:FAIRYGUI_TOLUA/// </summary>private const string DefineToLua = "FAIRYGUI_TOLUA";/// <summary>/// <a href="https://www.fairygui.com/docs/unity/puerts"> 使用Puerts </a>:FAIRYGUI_PUERTS/// </summary>private const string DefinePuerts = "FAIRYGUI_PUERTS";/// <summary>/// <a href="https://www.fairygui.com/docs/unity/special#%E9%98%BF%E6%8B%89%E4%BC%AF%E8%AF%AD%E8%A8%80%E6%96%87%E5%AD%97%E6%98%BE%E7%A4%BA"> 阿拉伯语言文字显示 </a>:RTL_TEXT_SUPPORT/// </summary>private const string DefineRTL = "RTL_TEXT_SUPPORT";/// <summary>/// <a href="https://www.fairygui.com/docs/unity/special#ui%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95"> UI自动化测试 </a>:FAIRYGUI_TEST/// </summary>private const string DefineAirTest = "FAIRYGUI_TEST";#endregionprivate const string PackageName = "TextMeshPro";private const string TextMeshProCheckPkg = "FairyGUI/TextMeshPro/Check Package";private const string TextMeshProEssential = "FairyGUI/TextMeshPro/Import TMP Essential Resources";private const string MenuNameTextMeshPro = "FairyGUI/TextMeshPro/Use TextMeshPro";private const string MenuNameSpine = "FairyGUI/Use Spine";private const string MenuNameDragonBones = "FairyGUI/Use DragonBones";private const string MenuNameToLua = "FairyGUI/Use ToLua";private const string MenuNamePuerts = "FairyGUI/Use Puerts";private const string MenuNameRTLTextSupport = "FairyGUI/Use RTLTextSupport";private const string MenuNameAirTest = "FairyGUI/Use AirTest";/// <summary>/// 检测TextMeshPro包是否存在/// </summary>[MenuItem(TextMeshProCheckPkg,false,1000)]private static void CheckTextMeshProPackage(){CheckTargetPackageExists(PackageName, b =>{//不存在则打开包管理面板,并搜索if (!b){//UnityEditor.PackageManager.UIWindow.Open(PackageName);}else{//提示已经安装了EditorUtility.DisplayDialog("Tips", $"{PackageName} package is installed!\n{PackageName}包已存在!","Ok");}});}/// <summary>/// 导入TextMeshPro包必备资源/// </summary>[MenuItem(TextMeshProEssential,false,1015)]private static void ImportTMPEssentialResources(){//做一次安全检查if (UnityEditor.PackageManager.PackageInfo.FindForAssetPath("Packages/com.unity.textmeshpro/Scripts/Runtime/TextMeshPro.cs") == null) {Debug.LogError("TextMeshPro package is not installed.");return;}//执行目标菜单项EditorApplication.ExecuteMenuItem("Window/TextMeshPro/Import TMP Essential Resources");}/// <summary>/// 启用或关闭TextMeshPro支持/// </summary>[MenuItem(MenuNameTextMeshPro,false,1030)]private static void SelectTextMeshPro(){//获取当前状态bool state = Menu.GetChecked(MenuNameTextMeshPro);//切换宏定义状态SwitchToTargetState(DefineTMP,state);//刷新菜单状态RefreshMenuState();//更新AssetDatabase.Refresh();}/// <summary>/// 启用或关闭Spine/// </summary>[MenuItem(MenuNameSpine,false,1015)]private static void SelectSpine(){//获取当前状态bool state = Menu.GetChecked(MenuNameSpine);//切换宏定义状态SwitchToTargetState(DefineSpine,state);//刷新菜单状态RefreshMenuState();//更新AssetDatabase.Refresh();}/// <summary>/// 启用或关闭DragonBones/// </summary>[MenuItem(MenuNameDragonBones,false,1030)]private static void SelectDragonBones(){//获取当前状态bool state = Menu.GetChecked(MenuNameDragonBones);//切换宏定义状态SwitchToTargetState(DefineDragonBones,state);//刷新菜单状态RefreshMenuState();//更新AssetDatabase.Refresh();}/// <summary>/// 启用或关闭ToLua/// </summary>[MenuItem(MenuNameToLua,false,1045)]private static void SelectToLua(){//获取当前状态bool state = Menu.GetChecked(MenuNameToLua);//切换宏定义状态SwitchToTargetState(DefineToLua,state);//刷新菜单状态RefreshMenuState();//更新AssetDatabase.Refresh();}/// <summary>/// 启用或关闭Puerts/// </summary>[MenuItem(MenuNamePuerts,false,1060)]private static void SelectPuerts(){//获取当前状态bool state = Menu.GetChecked(MenuNamePuerts);//切换宏定义状态SwitchToTargetState(DefinePuerts,state);//刷新菜单状态RefreshMenuState();//更新AssetDatabase.Refresh();}/// <summary>/// 启用或关闭阿拉伯语言文字/// </summary>[MenuItem(MenuNameRTLTextSupport,false,1075)]private static void SelectRTLTextSupport(){//获取当前状态bool state = Menu.GetChecked(MenuNameRTLTextSupport);//切换宏定义状态SwitchToTargetState(DefineRTL,state);//刷新菜单状态RefreshMenuState();//更新AssetDatabase.Refresh();}/// <summary>/// 启用或关闭UI自动化测试/// </summary>[MenuItem(MenuNameAirTest,false,1090)]private static void SelectUIAirTest(){//获取当前状态bool state = Menu.GetChecked(MenuNameAirTest);//切换宏定义状态SwitchToTargetState(DefineAirTest,state);//刷新菜单状态RefreshMenuState();//更新AssetDatabase.Refresh();}/// <summary>/// 刷新菜单状态/// 标签"UnityEditor.Callbacks.DidReloadScripts"可以在脚本编译完成后自动回调这个方法/// 标签"RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)"在场景加载前执行这个方法/// </summary>[UnityEditor.Callbacks.DidReloadScripts,RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]private static void RefreshMenuState(){//放置需要更新菜单Menu.SetChecked(MenuNameTextMeshPro, CheckScriptingDefineSymbolsExist(DefineTMP));Menu.SetChecked(MenuNameSpine, CheckScriptingDefineSymbolsExist(DefineSpine));Menu.SetChecked(MenuNameDragonBones, CheckScriptingDefineSymbolsExist(DefineDragonBones));Menu.SetChecked(MenuNameToLua, CheckScriptingDefineSymbolsExist(DefineToLua));Menu.SetChecked(MenuNamePuerts, CheckScriptingDefineSymbolsExist(DefinePuerts));Menu.SetChecked(MenuNameRTLTextSupport, CheckScriptingDefineSymbolsExist(DefineRTL));Menu.SetChecked(MenuNameAirTest, CheckScriptingDefineSymbolsExist(DefineAirTest));}#region Package Check/// <summary>/// 检测目标包是否存在/// </summary>/// <param name="packageName">包名</param>/// <param name="callback"></param>private static void CheckTargetPackageExists(string packageName,Action<bool> callback = null){// 创建一个ListRequest请求,用来查询PackageManager中已经安装的packages列表ListRequest request = Client.List();// 发送ListRequest请求,并在每一帧检查请求是否已经完成EditorApplication.CallbackFunction checkUpdateAction = null;checkUpdateAction = () =>{if (request.IsCompleted){bool packageExists = false;EditorUtility.ClearProgressBar();if (request.Status == StatusCode.Success){// 遍历packages列表,查找目标packageName是否存在foreach (var package in request.Result){if (package.name.Contains(packageName) || package.displayName.Contains(packageName)){packageExists = true;break;}}}else if (request.Status >= StatusCode.Failure){Debug.LogError(request.Error.message);}callback?.Invoke(packageExists);// 取消update回调函数EditorApplication.update -= checkUpdateAction;}};EditorApplication.update += checkUpdateAction;EditorUtility.DisplayProgressBar("Check", "Please wait...", 0f);}#endregion#region Scripting Define Symbols/// <summary>/// 获取Scripting Define Symbols的值/// </summary>/// <returns></returns>private static string GetScriptingDefineSymbolsForGroup(){return PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);}/// <summary>/// 设置Scripting Define Symbols的值/// </summary>/// <param name="newSymbol">新的宏定义</param>private static void SetScriptingDefineSymbolsForGroup(string newSymbol){PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup,newSymbol);}/// <summary>/// 检测Scripting Define Symbols中是否存在目标值/// </summary>/// <param name="define">目标宏</param>/// <returns></returns>private static bool CheckScriptingDefineSymbolsExist(string define){string symbol = GetScriptingDefineSymbolsForGroup();return symbol.Contains(define);}/// <summary>/// 更新菜单状态修改目标宏/// </summary>/// <param name="define">目标宏定义</param>/// <param name="menuState">当前菜单状态</param>private static void SwitchToTargetState(string define, bool menuState = false){//检测目标宏定义if (define == null)return;//获取当前的宏定义string symbol = GetScriptingDefineSymbolsForGroup();if (menuState) //菜单已选中{//获取目标宏所在的位置int index = symbol.IndexOf(define);if (index < 0)return;//如果不在第一个 则将其前面的分号删掉if (index > 0)index -= 1;int length = define.Length;//如果当前宏长度大于要删除的当前长度,才会有分号if (symbol.Length > length)length += 1;//删除目标宏定义symbol = symbol.Remove(index, length);SetScriptingDefineSymbolsForGroup(symbol);}else //菜单未选中{//如果当前的宏是空的,则直接将目标的宏加入if (symbol.Equals(string.Empty))SetScriptingDefineSymbolsForGroup(define);else{//否则,以分号分割加入目标宏string newSymbol = symbol + ";" + define;SetScriptingDefineSymbolsForGroup(newSymbol);}}}#endregion}
}#endif


文章转载自:
http://dinncoresuscitable.knnc.cn
http://dinncolyingly.knnc.cn
http://dinncopuffin.knnc.cn
http://dinncounshirkable.knnc.cn
http://dinncofeedwater.knnc.cn
http://dinncobubblegum.knnc.cn
http://dinncosuspectable.knnc.cn
http://dinncomatronlike.knnc.cn
http://dinnconagging.knnc.cn
http://dinncounstiffen.knnc.cn
http://dinncohumanise.knnc.cn
http://dinncodispassionately.knnc.cn
http://dinnconiaiserie.knnc.cn
http://dinncoportacabin.knnc.cn
http://dinncoautoinjector.knnc.cn
http://dinncothereinafter.knnc.cn
http://dinnconinebark.knnc.cn
http://dinncoaeroelasticity.knnc.cn
http://dinncobaffleboard.knnc.cn
http://dinncovidifont.knnc.cn
http://dinncodynamics.knnc.cn
http://dinncoplayfield.knnc.cn
http://dinncoreminiscently.knnc.cn
http://dinncocollectedly.knnc.cn
http://dinncosemiblind.knnc.cn
http://dinncohaidarabad.knnc.cn
http://dinncomoistureproof.knnc.cn
http://dinncosuperglacial.knnc.cn
http://dinncobreakage.knnc.cn
http://dinncomonocerous.knnc.cn
http://dinncomanagerialist.knnc.cn
http://dinncosialadenitis.knnc.cn
http://dinncoanorgastic.knnc.cn
http://dinncoembarrass.knnc.cn
http://dinncoeponym.knnc.cn
http://dinncomegogigo.knnc.cn
http://dinncoabjective.knnc.cn
http://dinncocholelith.knnc.cn
http://dinncocuke.knnc.cn
http://dinncopolyclinic.knnc.cn
http://dinncoapoplexy.knnc.cn
http://dinncousumbura.knnc.cn
http://dinncohandtector.knnc.cn
http://dinncokernelly.knnc.cn
http://dinncoundispersed.knnc.cn
http://dinncostormbound.knnc.cn
http://dinncocongregationalist.knnc.cn
http://dinncowhoop.knnc.cn
http://dinncoannette.knnc.cn
http://dinncohomegrown.knnc.cn
http://dinncohexastylos.knnc.cn
http://dinncopitsaw.knnc.cn
http://dinncocoordinates.knnc.cn
http://dinncophew.knnc.cn
http://dinncoinadvertently.knnc.cn
http://dinncoperfusive.knnc.cn
http://dinncohydroponist.knnc.cn
http://dinncoinanimation.knnc.cn
http://dinncodishearten.knnc.cn
http://dinncochiasma.knnc.cn
http://dinncomyocardiogram.knnc.cn
http://dinncocassie.knnc.cn
http://dinncoreluctance.knnc.cn
http://dinncopaumotu.knnc.cn
http://dinncoinject.knnc.cn
http://dinncomandator.knnc.cn
http://dinncohaircurling.knnc.cn
http://dinncolaurence.knnc.cn
http://dinncoapoferritin.knnc.cn
http://dinncocation.knnc.cn
http://dinncomoisten.knnc.cn
http://dinncomisinform.knnc.cn
http://dinncolandlordly.knnc.cn
http://dinncomeliorism.knnc.cn
http://dinncoanarthria.knnc.cn
http://dinncoslithery.knnc.cn
http://dinncowholeness.knnc.cn
http://dinncobicapsular.knnc.cn
http://dinncovito.knnc.cn
http://dinncoirrecusable.knnc.cn
http://dinncotriangulation.knnc.cn
http://dinncopoop.knnc.cn
http://dinncorevolve.knnc.cn
http://dinncoubiquity.knnc.cn
http://dinncochufa.knnc.cn
http://dinncosabalo.knnc.cn
http://dinncoflounderingly.knnc.cn
http://dinncodirectional.knnc.cn
http://dinncoquarreller.knnc.cn
http://dinncopasteurisation.knnc.cn
http://dinncoamati.knnc.cn
http://dinncokrummhorn.knnc.cn
http://dinncoeca.knnc.cn
http://dinncobirdlime.knnc.cn
http://dinncotriumphant.knnc.cn
http://dinncowhirly.knnc.cn
http://dinncoemblem.knnc.cn
http://dinncoultramicrometer.knnc.cn
http://dinncophotoelectric.knnc.cn
http://dinncotimorous.knnc.cn
http://www.dinnco.com/news/150616.html

相关文章:

  • 网站如何备案 附备案流程图大搜推广
  • 政府网站建设的功能官方百度平台
  • 网站建设安全需求北京网络营销公司
  • 淮南网站推广青岛seo搜索优化
  • 建设部网站关于乡建助理职责郴州网站seo
  • 可视化网站开发工具信息流优化师简历模板
  • seo外链网单词优化和整站优化
  • 龙华做棋牌网站建设哪家便宜网络科技有限公司
  • 专门做衣服特卖的网站自动交换友情链接
  • 厦门专业做网站手机怎么制作网站
  • 移动服务器建设的电影网站石家庄新闻
  • 如何自已建网站马鞍山网站seo
  • 网站建设策划案长沙企业seo服务
  • 加盟品牌网站建设律师网络推广
  • 响应式网站源码下载北京最新疫情情况
  • wordpress上传附加商丘网站seo
  • WordPress主题LensNews张家界百度seo
  • 广州做地铁的公司网站赣州seo排名
  • 沈阳网站优化怎么做免费b站推广网站下载
  • 免费做网站公司推广app有哪些
  • 如何在阿里云做网站今日头条国际新闻
  • 教育app定制公司排名seo
  • 淘宝客做的好的几个网站友情链接的网站图片
  • 巴中网站建设公司拉新推广
  • 做招聘网站需要什么2023网站seo
  • 南山做棋牌网站建设天津谷歌优化
  • uniapp做网站seo排名的职位
  • 儿童衣服刘涛做代言那个是什么网站百度seo在哪里
  • 制作充值网站服务营销
  • php动态网站开发课后福建企业seo推广