class unity 定义类_Unity 游戏框架搭建 2019 (二十五) 类的第一个作用 与 Obselete 属性...
在上一篇我們整理到了第七個示例,我們今天再接著往下整理。我們來看第八個示例:
#if UNITY_EDITORusing UnityEditor;
#endif
using UnityEngine;
using System;
using System.IO;
namespace QFramework
{
public class PreviousFunctions : MonoBehaviour
{
public static string GenerateUnityPackageName()
{
return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
}
public static void CopyText(string text)
{
GUIUtility.systemCopyBuffer = text;
}
public static void OpenInFolder(string folderPath)
{
Application.OpenURL("file:///" + folderPath);
}
#if UNITY_EDITOR public static void CallMenuItem(string menuPath)
{
EditorApplication.ExecuteMenuItem(menuPath);
}
public static void ExportPackage(string assetPathName,string fileName)
{
AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
}
#endif
#if UNITY_EDITOR[MenuItem("QFramework/8.總結(jié)之前的方法/1.獲取文件名")]
private static void MenuClicked()
{
Debug.Log(GenerateUnityPackageName());
}
[MenuItem("QFramework/8.總結(jié)之前的方法/2.復(fù)制文本到剪切板")]
private static void MenuClicked2()
{
CopyText("要復(fù)制的關(guān)鍵字");
}
[MenuItem("QFramework/8.總結(jié)之前的方法/3.生成文件名到剪切板")]
private static void MenuClicked3()
{
CopyText(GenerateUnityPackageName());
}
[MenuItem("QFramework/8.總結(jié)之前的方法/4.導(dǎo)出 UnityPackage")]
private static void MenuClicked4()
{
ExportPackage("Assets/QFramework",GenerateUnityPackageName() + ".unitypackage");
}
[MenuItem("QFramework/8.總結(jié)之前的方法/5.打開所在文件夾")]
private static void MenuClicked5()
{
OpenInFolder(Application.dataPath);
}
[MenuItem("QFramework/8.總結(jié)之前的方法/6.MenuItem 復(fù)用")]
private static void MenuClicked6()
{
CallMenuItem("QFramework/8.總結(jié)之前的方法/4.導(dǎo)出 UnityPackage");
OpenInFolder(Path.Combine(Application.dataPath, "../"));
}
[MenuItem("QFramework/8.總結(jié)之前的方法/7.自定義快捷鍵")]
private static void MenuClicked7()
{
Debug.Log("%e 意思是快捷鍵 cmd/ctrl + e");
}
#endif }
}
其實代碼量還是比較多的。
而在上一篇中,我們就知道了,這個示例有類命名的問題。我們運氣比較好,剛好可以試著解決一下。
關(guān)于類,我們在寫第一個示例的時候就去接觸了,不過筆者并沒有講它,是因為作為一個代碼設(shè)計的工具,類是非常重要的一個概念,它比方法復(fù)雜得多,不過今天我們不用全部了解,只需要了解對本示例有用的部分就好了。
我們都知道,在 C# 中方法都是需要在類中實現(xiàn)的。所以類的第一個作用就是方法的集合。
而我們的問題是,對于 OpenInFinder 、ExportPackage 這些方法所在的類的名字比較奇怪。
之所以能意識到問題的存在,是因為筆者知道一個庫不可能僅僅這幾個方法的。如果是僅僅這幾個方法,我們還是可以叫 PreviousFunctions 。因為方法數(shù)量比較小,所以用人腦就可以記住了。就算忘記了再去看一遍也很容易記住的。但是到目前為止我們收集了 13 個示例,那么至少有 13 個方法,在未來隨著時間增長,我們要收集的方法會越來越多。所以給方法進行合理地分類,并把它們放在合適的地方是必須要做的。
不過我們對于對方法分類還是新手,因為到目前為止,筆者沒有在此專欄中提過方法分類這件事,
我們先來看下這些方法是干嘛的,以及用在哪里的? 1. GenerateUnityPackageName:自動生成文件名,是屬于導(dǎo)出功能的一部分,屬于定制方法。 2. CopyText:復(fù)制文本,比較通用。 3. OpenInFolder:打開所在文件夾,在 UnityEditor 里比較通用。 4. CallMenuItem:復(fù)用菜單,在 UnityEditor 里比較通用。 5. ExportPackage:導(dǎo)出 Package,在 UnityEditor 比較通用。
很自然地,根據(jù)用處可以分為三類,一個是定制方法,GenerateUnityPackageName,它只能用在導(dǎo)出功能里。在其他的情況下很少適用。
第二種則是 UnityEditor 通用,比如 OpenInFolder 和 CallMenuItem。 第三種則是可能全平臺通用的,比如 CopyText。
基于以上我們就按照這種方式去分類。如何分呢?
答案就是使用類,給類起一個類型名字就好。
在之前我們提過,類的第一個作用是方法的集合,它可以放若干個方法。而我們方法已經(jīng)分好類型了,現(xiàn)在就差給類起一個合適的名字。我們先叫做 Exporter (導(dǎo)出器) 、EditorUtil (編輯器工具)和 CommonUtil (通用工具)。
代碼如下: CommonUtil 類
public class CommonUtil
{
public static void CopyText(string text)
{
GUIUtility.systemCopyBuffer = text;
}
}
Exporter 類
public class Exporter
{
public static string GenerateUnityPackageName()
{
return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
}
}
EditorUtil 類
public class EditorUtil
{
#if UNITY_EDITOR public static void CallMenuItem(string menuPath)
{
EditorApplication.ExecuteMenuItem(menuPath);
}
public static void OpenInFolder(string folderPath)
{
Application.OpenURL("file:///" + folderPath);
}
public static void ExportPackage(string assetPathName,string fileName)
{
AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
}
#endif }
這樣就算給方法分好類了,這三個類放在了 PreviousFunctions 類定義位置的上方。 如下代碼所示:
#if UNITY_EDITORusing UnityEditor;
#endif
using UnityEngine;
using System;
using System.IO;
namespace QFramework
{
public class CommonUtil
{
...
}
public class Exporter
{
...
}
public class EditorUtil
{
...
}
public class PreviousFunctions : MonoBehaviour
{
...
}
}
那么,PreviousFunctions 里以前實現(xiàn)的方法怎么辦?要進行刪除嘛?
已經(jīng)刪了的童鞋可能知道,直接刪除會造成編譯問題。因為在第七個示例里,已經(jīng)用了 PreviousFunctions 里的方法。所以保險起見,不能馬上進行刪除,而是做一步方法的中轉(zhuǎn)。 例如 PreviousFunction.CopyText 實現(xiàn)如下所示:
public static void CopyText(string text)
{
CommonUtil.CopyText(text);
}
這樣就可以了,ok 了,我們把其他的部分也照著這樣做,代碼如下。
public static string GenerateUnityPackageName()
{
return Exporter.GenerateUnityPackageName();
}
public static void CopyText(string text)
{
CommonUtil.CopyText(text);
}
public static void OpenInFolder(string folderPath)
{
EditorUtil.OpenInFolder((folderPath));
}
#if UNITY_EDITOR public static void CallMenuItem(string menuPath)
{
EditorUtil.CallMenuItem(menuPath);
}
public static void ExportPackage(string assetPathName,string fileName)
{
EditorUtil.ExportPackage(assetPathName, fileName);
}
#endif
這樣,可以保證功能不失效,也就是遵循了我們的約定和規(guī)則之一。
但是這樣還不夠,因為我們逐個整理完示例之后,回過頭來可能會忘記。在這里筆者介紹一個 C# 的標(biāo)簽屬性 [System.Obselete(“方法以過時”)] ,只要在方法上加上這個標(biāo)簽,編譯器就會在使用這個方法的地方報出警告,而警告的內(nèi)容則是 Obselete 括號中的 “方法以過時”。
我們先給這五個方法加上,然后觀察下 Unity 的控制臺的警告。
代碼如下: PreviousFunctions.cs
[Obsolete("方法以過時,請使用 Exporter.GenerateUnityPackageName();")]
public static string GenerateUnityPackageName()
{
return Exporter.GenerateUnityPackageName();
}
[Obsolete("方法以過時,請使用 CommonUtil.CopyText(text);")]
public static void CopyText(string text)
{
CommonUtil.CopyText(text);
}
[Obsolete("方法以過時,請使用 EditorUtil.OpenInFolder(folderPath);")]
public static void OpenInFolder(string folderPath)
{
EditorUtil.OpenInFolder(folderPath);
}
#if UNITY_EDITOR[Obsolete("方法以過時,請使用 EditorUtil.CallMenuItem(menuPath);")]
public static void CallMenuItem(string menuPath)
{
EditorUtil.CallMenuItem(menuPath);
}
[Obsolete("方法以過時,請使用 EditorUtil.ExportPackage(assetPathName, fileName);"]
public static void ExportPackage(string assetPathName,string fileName)
{
EditorUtil.ExportPackage(assetPathName, fileName);
}
#endif
編譯之后的結(jié)果如下:
信息給得非常詳細,這樣我們之后就不會忘記了,只要在方法上有 Obsolete 的方法,在進行整理的時候如果它沒有被引用的時候就可以刪掉了。
現(xiàn)在這幾個方法被第七個示例引用了,所以還不能刪除,而是這一輪示例整理過后,回過頭再整理。
今天新的內(nèi)容夠多了,我們直接列出完整的 PreviousFuctions.cs 代碼。
如下:
#if UNITY_EDITORusing UnityEditor;
#endif
using UnityEngine;
using System;
using System.IO;
namespace QFramework
{
public class CommonUtil
{
public static void CopyText(string text)
{
GUIUtility.systemCopyBuffer = text;
}
}
public class Exporter
{
public static string GenerateUnityPackageName()
{
return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
}
}
public class EditorUtil
{
#if UNITY_EDITOR public static void CallMenuItem(string menuPath)
{
EditorApplication.ExecuteMenuItem(menuPath);
}
public static void OpenInFolder(string folderPath)
{
Application.OpenURL("file:///" + folderPath);
}
public static void ExportPackage(string assetPathName,string fileName)
{
AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
}
#endif }
public class PreviousFunctions : MonoBehaviour
{
[Obsolete("方法以過時,請使用 Exporter.GenerateUnityPackageName();")]
public static string GenerateUnityPackageName()
{
return Exporter.GenerateUnityPackageName();
}
[Obsolete("方法以過時,請使用 CommonUtil.CopyText(text);")]
public static void CopyText(string text)
{
CommonUtil.CopyText(text);
}
[Obsolete("方法以過時,請使用 EditorUtil.OpenInFolder(folderPath);")]
public static void OpenInFolder(string folderPath)
{
EditorUtil.OpenInFolder(folderPath);
}
#if UNITY_EDITOR[Obsolete("方法以過時,請使用 EditorUtil.CallMenuItem(menuPath);")]
public static void CallMenuItem(string menuPath)
{
EditorUtil.CallMenuItem(menuPath);
}
[Obsolete("方法以過時,請使用 EditorUtil.ExportPackage(assetPathName, fileName);")]
public static void ExportPackage(string assetPathName,string fileName)
{
EditorUtil.ExportPackage(assetPathName, fileName);
}
#endif
#if UNITY_EDITOR[MenuItem("QFramework/8.總結(jié)之前的方法/1.獲取文件名")]
private static void MenuClicked()
{
Debug.Log(Exporter.GenerateUnityPackageName());
}
[MenuItem("QFramework/8.總結(jié)之前的方法/2.復(fù)制文本到剪切板")]
private static void MenuClicked2()
{
CommonUtil.CopyText("要復(fù)制的關(guān)鍵字");
}
[MenuItem("QFramework/8.總結(jié)之前的方法/3.生成文件名到剪切板")]
private static void MenuClicked3()
{
CommonUtil.CopyText(GenerateUnityPackageName());
}
[MenuItem("QFramework/8.總結(jié)之前的方法/4.導(dǎo)出 UnityPackage")]
private static void MenuClicked4()
{
EditorUtil.ExportPackage("Assets/QFramework",GenerateUnityPackageName() + ".unitypackage");
}
[MenuItem("QFramework/8.總結(jié)之前的方法/5.打開所在文件夾")]
private static void MenuClicked5()
{
EditorUtil.OpenInFolder(Application.dataPath);
}
[MenuItem("QFramework/8.總結(jié)之前的方法/6.MenuItem 復(fù)用")]
private static void MenuClicked6()
{
EditorUtil.CallMenuItem("QFramework/8.總結(jié)之前的方法/4.導(dǎo)出 UnityPackage");
EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
}
#endif }
}
大家發(fā)現(xiàn) PreviousFunctions 這個類里的所有的 MenuItem 方法里的實現(xiàn),都改成了新的方法。
而筆者刪除了以下方法,原因是知識點和第七個示例重復(fù)了,有了第七個示例就不需要這個方法了。
[MenuItem("QFramework/8.總結(jié)之前的方法/7.自定義快捷鍵")]
private static void MenuClicked7()
{
Debug.Log("%e 意思是快捷鍵 cmd/ctrl + e");
}
小結(jié)要做的事情:(完成) 備份:導(dǎo)出文件,并取一個合理的名字。遺留問題:(完成一部分) 第八個示例與之前的示例代碼重復(fù),功能重復(fù)。
(完成) 方法所在類的命名有問題。
菜單欄顯示順序問題。約定和規(guī)則:每個示例在 QFramework 目錄下創(chuàng)建一個文件夾,文件夾的格式是: 數(shù)字.示例的功能
每個示例寫一個腳本,腳本中包含可復(fù)用的靜態(tài)方法和 MenuItem 方法。
每寫一個示例進行一次導(dǎo)出,導(dǎo)出的文件名后邊加上日期和時間,這個功能已經(jīng)在導(dǎo)出功能里內(nèi)置了。
每次有 API 變更的時候做一次備份,備份的名字采用 QFramework_vX.Y.Z 格式。
每次進行整理的時候要確保是在功能有效的情況下進行刪除和變更。示例分類:知識學(xué)習(xí)&收集API 收集
C# 語法實踐庫本身的功能
規(guī)則實現(xiàn)
使用流程提供及優(yōu)化
效率提升(編碼體驗、邏輯復(fù)用)
項目實用工具收集
今天的內(nèi)容就寫到這里,下一篇再見,拜拜~
更多內(nèi)容Unity 進階小班:主要訓(xùn)練內(nèi)容:框架搭建訓(xùn)練(第一年)
跟著案例學(xué) Shader(第一年)
副業(yè)的孵化(第二年、第三年)
關(guān)注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內(nèi)容。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的class unity 定义类_Unity 游戏框架搭建 2019 (二十五) 类的第一个作用 与 Obselete 属性...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ibe加密原理_ibe 基于身份的IBE
- 下一篇: vilatile 深入理解java虚拟机