Unity 游戏框架搭建 2019 (九、十、十一) 第一章小结&第二章简介&第八个示例(一)

第一章小结

为了强化教程的重点,会在合适的时候进行总结与快速复习。


Unity 游戏框架搭建 2019 (九、十、十一) 第一章小结&第二章简介&第八个示例(一)_第1张图片
006tNc79gy1fzdd6su2bvj312j0qfgsk.jpg

第二章 简介

在第一章我们做了知识库的准备,从而让我们更高效地收集示例。

在第二章,我们就用准备好的导出工具试着收集几个示例,这些示例中有的是我们后续库的基础工具,也有的是在项目中非常实用的小工具,还有一些示例是实践了在框架搭建方向上非常重要的 C# 语法知识。

第二章大纲如下。

Unity 游戏框架搭建 2019 (九、十、十一) 第一章小结&第二章简介&第八个示例(一)_第2张图片
006tNc79gy1fzdh9eedxwj30gr0dhwg2.jpg

第八个示例(一)

在之前,我们完成了一个导出的功能。但是在完成这个功能的过程中,我们也遇到了一些问题。我们回忆一下,在《MenuItem 复用》的这篇文章中,我们想对如下代码进行复用。

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 调用。这样的好处是,我们在创建一个方法的时候,可以好好地利用参数和返回值进行设计。

说了这么多,终于得到了一个明确的方案。我们来通过今天的第八个示例快速试一下。

第八个示例

第八个示例是什么呢,就是在第八个示例中,把所有的示例都提取成方法,并再次完成导出的功能。

首先第一个示例代码如下:

#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,我们直接看提取后的代码。

#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 获取第一时间更新通知及更多的免费内容。


    Unity 游戏框架搭建 2019 (九、十、十一) 第一章小结&第二章简介&第八个示例(一)_第3张图片
    image

你可能感兴趣的:(Unity 游戏框架搭建 2019 (九、十、十一) 第一章小结&第二章简介&第八个示例(一))