Unity 游戏框架搭建 2019 (三十六~三十八) partial与public
在上一篇,我们把菜单的顺序从头到尾整理了一遍。在整理菜单顺序的过程中,记录了一个要做的事情。
要做的事情:
- (完成) 备份:导出文件,并取一个合理的名字。
- 整理完菜单顺序后,学习新的知识,解决随着示例增多,可能出现类需要合并的问题。
我们要学习新的知识,试着解决类的合并问题。首先我们来看下要合并的类是什么,在我们的示例中是 TransformSimplify,这个 TransformSimplify 是对 Transform API 的简化,而 Transform 有非常多的 API,那么以后肯定还是会给 TransformSimplify 添加方法的。
而我们的示例是逐个写的,写了一个示例,发现要给 TransformSimplify 添加方法,再回头找 TransformSimplify 类,再更改,这样很不妥。因为如果更改了 TransformSimplify 这个类了,那么对应的此篇专栏的文章就会失效了。
所以如果有一个方法能够解决这个问题就好了,在每个示例就可以为已经有的类添加方法,而不去动用以前的示例代码,等学习到一个阶段后进行整理的时候统一进行合并。有这样的东西嘛?
有的,C# 有提供 partial 关键字。
它可以让一个类在多个文件中实现。那我们就试着给 TransformSimplify 和 GameObject 应用 partial 关键字吧。
TransformSimplify 在第五个示例,增加后的代码如下:
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
#endif
namespace QFramework
{
public partial class TransformSimplify
{
#if UNITY_EDITOR
[MenuItem("QFramework/5.Transform API 简化/1.赋值优化", false, 5)]
#endif
private static void MenuClicked1()
{
var transform = new GameObject("transform").transform;
SetLocalPosX(transform, 5.0f);
SetLocalPosY(transform, 5.0f);
SetLocalPosZ(transform, 5.0f);
}
#if UNITY_EDITOR
[MenuItem("QFramework/5.Transform API 简化/2.重置", false, 6)]
#endif
private static void MenuClicked2()
{
var transform = new GameObject("transform").transform;
Identity(transform);
}
/// <summary>
/// 重置操作
/// </summary>
/// <param name="trans">Trans.</param>
public static void Identity(Transform trans)
{
trans.localPosition = Vector3.zero;
trans.localScale = Vector3.one;
trans.localRotation = Quaternion.identity;
}
public static void SetLocalPosX(Transform transform, float x)
{
var localPos = transform.localPosition;
localPos.x = x;
transform.localPosition = localPos;
}
public static void SetLocalPosY(Transform transform, float y)
{
var localPos = transform.localPosition;
localPos.y = y;
transform.localPosition = localPos;
}
public static void SetLocalPosZ(Transform transform, float z)
{
var localPos = transform.localPosition;
localPos.z = z;
transform.localPosition = localPos;
}
public static void SetLocalPosXY(Transform transform, float x, float y)
{
var localPos = transform.localPosition;
localPos.x = x;
localPos.y = y;
transform.localPosition = localPos;
}
public static void SetLocalPosXZ(Transform transform, float x, float z)
{
var localPos = transform.localPosition;
localPos.x = x;
localPos.z = z;
transform.localPosition = localPos;
}
public static void SetLocalPosYZ(Transform transform, float y, float z)
{
var localPos = transform.localPosition;
localPos.y = y;
localPos.z = z;
transform.localPosition = localPos;
}
}
}
GameObjectSimplify 在第七个示例,增加 partial 之后代码如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public partial class GameObjectSimplify
{
public static void Show(GameObject gameObj)
{
gameObj.SetActive(true);
}
public static void Hide(GameObject gameObj)
{
gameObj.SetActive(false);
}
#if UNITY_EDITOR
[MenuItem("QFramework/7.GameObejct API 简化/显示、隐藏简化", false, 8)]
#endif
private static void MenuClicked()
{
var gameObject = new GameObject();
Hide(gameObject);
}
}
}
增加之后呢,我们添加一个示例,用来验证 partial 关键字是否正确的。
新的示例呢,是第八个示例。
在示例中,分别为 TransformSimplify 和 GameObjectSimplify 增加一个方法。
代码如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public partial class TransformSimplify
{
public static void AddChild(Transform transform, Transform childTrans)
{
childTrans.SetParent(transform);
}
}
public partial class GameObjectSimplify
{
public static void Show(Transform transform)
{
transform.gameObject.SetActive(true);
}
public static void Hide(Transform transform)
{
transform.gameObject.SetActive(false);
}
}
public class PartialKeyword
{
#if UNITY_EDITOR
[MenuItem("QFramework/8.partial 关键字", false, 9)]
#endif
private static void MenuClicked()
{
var parentTrans = new GameObject("Parent").transform;
var childTrans = new GameObject("Child").transform;
TransformSimplify.AddChild(parentTrans,childTrans);
GameObjectSimplify.Hide(childTrans);
}
}
}
执行的结果如下:
菜单如下:

目录如下:

学了这个 partial 之后,我们的合并问题就解决了。
这样我们整理阶段要做的事情就做完了。
要做的事情:
- (完成) 备份:导出文件,并取一个合理的名字。
- (完成) 整理完菜单顺序后,学习新的知识,解决随着示例增多,可能出现类需要合并的问题。
partial 和 public 的合理使用以及整理完结篇
在上一篇中,我们学习了新的知识 partial 关键字,那么我们什么时候该用 partial 呢?
我们简单分析一下:
- 像 GameObjectSimplify 和 TransformSimplify 都是很可能增长的类,所以自然就要用到了。
- 而我们的 CommonUtil、EditorUtil、MathUtil 也是非常大的一个范畴,随着时间,要加的东西也会越来越多的。所以这两个类也要加上 partial。
- 而 ResolutionCheck 类,目前只完成了比较常用的分辨率,未来随着时间肯定会遇到比较奇葩的分辨率的。所以 ResolutionCheck 也要加上 partial。
- Exporter 呢,是专门为导出功能定制的,目前比较完善了。所以用不到 partial。而且 Exporter 里的 GeneratePackageName 事实上也不需要被其他的类调用了,所以它的访问权限也可以从 public 关键字也可以改成 private 了。
基于以上,我们要给除了 Exporter 以外的所有的类都加上 partial,然后要把第一个示例的 Exporter.GeneratePackageName 的 public 关键字改成 private。
到此呢,我们的整理就算真正的结束了。
整理之后我们得到了几个类
- 简化类:GameObjectSimplify、TransformSimplify
- Util 类:CommonUtil、EditorUtil、MathUtil、ResolutionCheck
- 编辑器功能:Exporter
这已经可以构成一个代码库了。
复盘
我们大体回忆下我们从第一篇到现在经历的阶段,大致可以分为如下两个阶段
- 学习收集示例阶段。
- 整理阶段。
学习收集示例阶段
其实我们可以理解为做项目或者做功能,为了做项目呢,往往我们会积累下来大量的代码。从而导致项目慢慢趋于混乱,直到无法在写下去(比如笔者也是写到某个示例的时候呢已经是瓶颈了,不知道写什么。
整理阶段
在整理阶段,会处理掉好多项目时间紧的时候没时间解决的代码设计问题。然后在整理阶段呢,也还会遇到很多意外的问题。不过经过整理之后,项目的结构会更加合理精简,再未来的一段时间内,可以让开发者愉快滴写功能,并且项目的发展也有了个方向(笔者也是通过这次整理,才知道了接下来的方向)。
知识库 到 代码库
而我们的知识库,一开始只是一个一个示例。而示例本身的存在,只是为了记录我们所接触的知识。但是随着我们的示例增加以及经验的提高,我们对示例库的要求就会变高,从只是为了记录知识到方法可复用、类名要合理。慢慢地就会变成一个代码库。
那么大家还记得我们在第一篇定的小目标嘛? 打造自己的知识库,结果打造着打造着变成了个代码库。当然代码库本身还是有记录知识的作用的,只不过在记录知识的作用上还能提高我们的编码效率。之所以会这样是因为程序语言本身的存在就是为了提高人类生产力(编码效率),和传达信息的(记录知识)。
提高编码效率,是因为它能够复用,能够记录知识的原因是,本身程序语言就是传达信息的,要不,它怎么叫语言呢?
我们可以用日常用的语言写笔记,但是用程序语言一样也可以写笔记,同样笔记也是需要整理的。
从知识库到代码库,我们也遇到了很多关键知识点,如下:
- public 关键字
- 类的第一作用
- partial 关键字
在接触了这些关键知识点后,库的结构就会发生革命性的变化,结构会变得更合理清晰,且更容易扩展。而这些关键知识点,目前大多来自于 C# 语法,但是它们不仅仅是语法知识,而是能够帮助我们进行代码设计的知识,笔者把这些知识叫做设计工具。
在代码中不管是设计一个庞大系统还是给一个项目做架构,或者仅仅是设计一个方法,都离不开这些设计工具,有了这些,可以让结构有更多地选择,更多地可能性。
再次起航
通过这次整理,我们收获了很多法宝,有了这些法宝我们有信心可以在接下来学习阶段中克服一切困难。如果实在克服不了,大不了我们再进行一次整理。
说到整理,我们的库开发流程已经算是成型了。很简单,流程如下:
- 学习收集示例
- 整理
- 学习收集示例
- 整理
- 学习收集示例
- …
如此往复,很快我们就能造出一个 QFramework,只不过要再多接触几个设计工具(C# 关键知识)。
导出
到此呢,我们的整理就真正完结了。我们好久没有进行导出了,在这篇我们就要进行一次导出,这次导出呢,要加上版本号。
版本号为 v0.0.1 ,所以导出的文件名应该是 QFramework_v0.0.1。
现在我们手头应该有两个版本的文件.
- QFramework_v0.0.0: 整理之前的备份版本。
- QFremework_v0.0.1: 整理完结后的版本。
第三章 小与快速复习

转载请注明地址:凉鞋的笔记:liangxiegame.com
更多内容
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
Unity 进阶小班:
- 主要训练内容:
- 框架搭建训练(第一年)
- 跟着案例学 Shader(第一年)
- 副业的孵化(第二年、第三年)
- 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
- 主要训练内容:
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

Unity 游戏框架搭建 2019 (三十六~三十八) partial与public的更多相关文章
- Unity 游戏框架搭建 2019 (二十一、二十二) 第三章简介&整理前的准备
整理前的准备 到目前为止,我们积攒了很多示例了,并且每个示例也都贯彻了最的约定和规则. 在上一篇的小结也说了一个比较新的东西:编程体验优化. 在之前我们还积攒了一个问题:代码重复问题. 我们可是忍住整 ...
- Unity 游戏框架搭建 2019 (二十七、二十八)弃用的代码警告解决&弃用的代码删除
在前两篇,我们把所有的示例重头到尾整理了一遍. 当前的状态如下: 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 遗留问题: (完成) 第八个示例与之前的示例代码重复,功能重复. (完成 ...
- Unity 游戏框架搭建 2019 (三十二、三十三) 类的命名 & 代码文件命名
昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整. 我们今天再往下接着调整. 我们来看下接下来的 MenuItem 代码如下: [MenuItem("QFramework/ ...
- Unity 游戏框架搭建 2019 (四十六) 简易消息机制 & 集成到 MonoBehaviourSimplify 里
在上一篇,我们接触了单例,使用单例解决了我们脚本之间访问的问题. 脚本之间访问其实有更好的方式. 我们先分下脚本访问脚本的几种形式. 第一种,A GameObject 是 B GameObject 的 ...
- Unity 游戏框架搭建 2019 (二十六) 第一轮整理完结
昨天呢我们把第八个示例整理完了.整理之后学习了类的第一作用:方法的集合,还有 Obselete 这个 API.并且在进行整理的时候贯彻了我们新的约定和规则:先确保功能有效,再去做变更和删除. 今天我们 ...
- Unity 游戏框架搭建 2019 (三十、三十一) MenuItem 显示顺序问题 & 类的提取
在上一篇,我们得出了两个核心的学习思路: 根据问题去学习,并收集. 主动学习,并思考适用场景. 我们今天解决 MenuItem 显示顺序问题. 目前 MenuItem 显示如图所示: 我们来看下 Me ...
- # Unity 游戏框架搭建 2019 (三十四、三十五) 9 ~ 10 示例整理
第九个示例 目前代码如下: using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace QFramework { p ...
- Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&方法的结构重复问题&泛型:结构复用利器
第四章 简介 方法的结构重复问题 我们在上一篇正式整理完毕,从这一篇开始,我们要再次进入学习收集示例阶段了. 那么我们学什么呢?当然是学习设计工具,也就是在上篇中提到的关键知识点.这些关键知识点,大部 ...
- Unity 游戏框架搭建 2019 (五十六/五十七) 需求分析-架构中最重要的一环&从 EmptyGO 到 Manager Of Managers
我们的项目开始立项的时候,最常见的一个情况就是:几个人的小团队,一开始什么也不做,就开始写代码,验证逻辑,游戏就开始写起来了.而公司的一些所谓的领导层面一开始就把游戏定义为我们要做一个大作.这个事情本 ...
随机推荐
- SpringCloud服务的注册发现--------Eureka实现高可用
1,Eureka作为注册中心,掌管者服务治理的功能,十分重要,如果注册中心的服务一旦宕机,所有的服务就会挂了,为此,实现注册中心的集群(高可用)就显得十分必要了 2,Eureka 搭建集群 实现原理就 ...
- Hadoop 集群的基准测试
集群搭建完毕之后,需要对集群进行基准测试 第一方面:基本测试 服务启动,是否可用,简单的应用 *hdfs 读写操作 bin/hdfs dfs -mkdir - p /user/chris/tmp/co ...
- 批量生成sql语句,难得
在工作我们常常要批量生成sql文件,因为业务部门经常给我们的是excel文件,根据我的经验,推荐两种批量生成sql文件方式 1.excel批量生成sql ,sql语句如下 INSERT INTO Ta ...
- Scala环境及IDEA配置
Scala环境及IDEA配置 1 语言介绍 他已经出生15年了,就像明星一样,谁都不可能一开始就人气爆棚粉丝无数,得慢慢混. 成功原因:完全兼容java代码. 身世介绍 Scala在2004年正式问世 ...
- Bitmap之位图采样和内存计算详解
原文首发于微信公众号:躬行之(jzman-blog) Android 开发中经常考虑的一个问题就是 OOM(Out Of Memory),也就是内存溢出,一方面大量加载图片时有可能出现 OOM, 通过 ...
- 拿万元月薪必备的书单,学JAVA的程序员必看的5本书!
点击蓝色"程序员黄小斜"关注我哟 加个"星标",每天带你读好书! 文/黄小斜 转载请注明出处 每一年的年初都是买书学习热情高涨的时候,虽然不知道你们是让这些书吃 ...
- git设置
1:注册码云2:点击个人主页创建私有项目3:下载git4:点击码云 头像 选择下方的设置-->点击左侧的SSH公钥-->怎样生成公钥(linux操作) window系统可以右击选择 git ...
- docker下安装centos,并在其上搭建lnmp环境
一.安装CentOs容器 1.进入docker下载CentOs,这里我使用的CentOs6.8 docker pull centos:6.8 2.创建容器 sudo docker run --priv ...
- 初识docker与理解
因最近公司的一个新项目,有一个业务场景是需要给多个甲方的服务器配置运行环境与部署,所以考虑使用docker来实现环境配置的统一 1.docker是什么 docker是一种容器虚拟化技术的实现,相当于在 ...
- Aactivity跳转到Bactivity之后再返回Aactivity的几种操作
一个主界面(主Activity)通过意图跳转至多个不同子Activity上去,当子模块的代码执行完毕后再次返回主页面,将子activity中得到的数据显示在主界面/完成的数据交给主Activity处理 ...