找回密碼
 注冊帳號

掃一掃,訪問微社區

涼鞋同學 Unity 游戲框架搭建 2019 (九、十、十一) 第一章小結&第二章簡介&第八個示例(一)

0
回復
150
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
排名
2324
昨日變化

78

主題

526

帖子

2471

積分

Rank: 9Rank: 9Rank: 9

UID
148923
好友
67
蠻牛幣
2663
威望
0
注冊時間
2016-5-17
在線時間
845 小時
最后登錄
2020-4-18

專欄作家

QQ

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
本帖最后由 liangxiegame 于 2020-3-27 10:05 編輯

第一章小結
為了強化教程的重點,會在合適的時候進行總結與快速復習。
006tNc79gy1fzdd6su2bvj312j0qfgsk.jpg
第二章 簡介
在第一章我們做了知識庫的準備,從而讓我們更高效地收集示例。
在第二章,我們就用準備好的導出工具試著收集幾個示例,這些示例中有的是我們后續庫的基礎工具,也有的是在項目中非常實用的小工具,還有一些示例是實踐了在框架搭建方向上非常重要的 C# 語法知識。
第二章大綱如下。006tNc79gy1fzdh9eedxwj30gr0dhwg2.jpg
第八個示例(一)
在之前,我們完成了一個導出的功能。但是在完成這個功能的過程中,我們也遇到了一些問題。我們回憶一下,在《MenuItem 復用》的這篇文章中,我們想對如下代碼進行復用。
[C#] 純文本查看 復制代碼
using System;
#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;

namespace QFramework
{
    public class ExportUnityPackage : MonoBehaviour
    {
#if UNITY_EDITOR
        [MenuItem("QFramework/4.導出 UnityPackage")]
        private static void MenuClicked()
        {
            var assetPathName = "Assets/QFramework";
            var fileName = "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh") + ".unitypackage";
            AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
        }
#endif
    }
}

這個方法被聲明為 private 權限,所以是不可以被訪問的。不過還好,MenuItem 可以復用,問題就勉強解決了。但是每次復用的時候要手打或復制一遍字符串未免也太麻煩了,而且也容易出錯。那么還有其他的方式么?
這就是今天要解決的問題。當別的示例想調用以上的方法的時候,由于是 private 類型,所以只能通過 MenuItem 的方式進行調用,而 MenuItem 這種方式比較麻煩。
解決方案大家很容易就想到,把 private 改成 public 就行了。這樣從達成代碼復用這個目的的這個角度來說,問題是算是解決了,但是以筆者的經驗來講,這樣還會有一些問題,就到這樣就好。我們好好享受這個勝利的果實。
到這里如果有不知道 private 和 public 關鍵字的作用是什么的童鞋,那么筆者就簡單提一句,使用 private 定義的方法只能在類的內部或者內部類中被調用,則不可以被子類和外部類調用,而使用 public 定義的方法,如果所在類也是 public 類型的,那么在任意地方可以被調用。
我們要怎么用這個 public 關鍵字呢?是在寫示例的時候,僅僅把 private 改成 public 就行了嘛?有沒有更好用的方法?
如果僅僅是把 private 改成 public 不是最好的方法,因為通過 MenuItem 修飾的方法,不能傳參數,也沒有返回值。不能傳參或不能返回值的話,一個方法的使用就會受限。
所以筆者給出的方案是,再創建一個靜態的 public 方法,而這個方法被 MenuItem 調用。這樣的好處是,我們在創建一個方法的時候,可以好好地利用參數和返回值進行設計。
說了這么多,終于得到了一個明確的方案。我們來通過今天的第八個示例快速試一下。
第八個示例
第八個示例是什么呢,就是在第八個示例中,把所有的示例都提取成方法,并再次完成導出的功能。
首先第一個示例代碼如下:
[C#] 純文本查看 復制代碼
#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;
using System;

namespace QFramework
{
    public static class LogFileName 
    {
        #if UNITY_EDITOR
        [MenuItem("QFramework/1.生成 unitypackage 名字")]
        #endif
        private static void GenerateUnityPackageName()
        {
            Debug.Log("QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh"));
        }
    }
} 

這個示例的核心是 DateTime.Now.ToString() 這個代碼。之所以是核心,是因為沒用過它的人,第一次用會感覺很陌生,而且 Unity 和 C# 的 API 有那么多,怎么可能一個一個全部記住呢?所以就寫了這樣的一個示例,以便日后,要用的時候迅速翻閱這個代碼就可以知道怎么用。隨著時間,這個 API 用的次數會越來越多,慢慢自己就記住了。但是就算記住了,也有可能會忘的那一天,所以還有得讓它在我們的庫中存在。
OK,我們直接看提取后的代碼。
[C#] 純文本查看 復制代碼
#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;
using System;

namespace QFramework
{    
    public class PreviousFunctions : MonoBehaviour
    {
#if UNITY_EDITOR
        [MenuItem("QFramework/8.總結之前的方法/1.獲取文件名")]
#endif
        private static void MenuClicked()
        {
            Debug.Log(GenerateUnityPackageName());
        }

        public static string GenerateUnityPackageName()
        {
            return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
        }
    }
}

首先注意,MenuItem,由于第八個示例是有很多的東西,所以就又加了一級菜單。
點擊以上菜單,執行結果正確。
OK,今天就先到這里。
轉載請注明地址:涼鞋的筆記:liangxiegame.com
更多內容
  • QFramework 地址:https://github.com/liangxiegame/QFramework
  • QQ 交流群:623597263
  • Unity 進階小班
    • 主要訓練內容:
      • 框架搭建訓練(第一年)
      • 跟著案例學 Shader(第一年)
      • 副業的孵化(第二年、第三年)
    • 權益、授課形式等具體詳情請查看《小班產品手冊》:https://liangxiegame.com/master/intro
  • 關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

神马电影34pp影视午夜