# Unity 游戏框架搭建 2019 (三十四、三十五) 9 ~ 10 示例整理
第九个示例
目前代码如下:
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace QFramework
{
public class ResolutionCheck
{
#if UNITY_EDITOR
[MenuItem("QFramework/9.屏幕宽高比判断")]
#endif
private static void MenuClicked()
{
Debug.Log(IsPadResolution() ? "是 Pad 分辨率" : "不是 Pad 分辨率");
Debug.Log(IsPhoneResolution() ? "是 Phone 分辨率" : "不是 Phone 分辨率");
Debug.Log(IsiPhoneXResolution() ? "是 iPhone X 分辨率" : "不是 iPhone X 分辨率");
}
/// <summary>
/// 获取屏幕宽高比
/// </summary>
/// <returns></returns>
public static float GetAspectRatio()
{
return Screen.width > Screen.height ? (float) Screen.width / Screen.height : (float) Screen.height / Screen.width;
}
/// <summary>
/// 是否是 Pad 分辨率 4 : 3
/// </summary>
/// <returns></returns>
public static bool IsPadResolution()
{
var aspect = GetAspectRatio();
return aspect > 4.0f / 3 - 0.05 && aspect < 4.0f / 3 + 0.05;
}
/// <summary>
/// 是否是手机分辨率 16:9
/// </summary>
/// <returns></returns>
public static bool IsPhoneResolution()
{
var aspect = GetAspectRatio();
return aspect > 16.0f / 9 - 0.05 && aspect < 16.0f / 9 + 0.05;
}
/// <summary>
/// 是否是iPhone X 分辨率 2436:1125
/// </summary>
/// <returns></returns>
public static bool IsiPhoneXResolution()
{
var aspect = GetAspectRatio();
return aspect > 2436.0f / 1125 - 0.05 && aspect < 2436.0f / 1125 + 0.05;
}
}
}
第九个示例没有太大的问题,不管是类名还是目录名、菜单名、代码文件名,以及它每个方法所在的类都没有太大的问题。
所以只需要更改菜单的顺序就好了。
更改后,MenuItem 代码如下:
#if UNITY_EDITOR
[MenuItem("QFramework/4.屏幕宽高比判断", false, 4)]
#endif
private static void MenuClicked()
{
Debug.Log(IsPadResolution() ? "是 Pad 分辨率" : "不是 Pad 分辨率");
Debug.Log(IsPhoneResolution() ? "是 Phone 分辨率" : "不是 Phone 分辨率");
Debug.Log(IsiPhoneXResolution() ? "是 iPhone X 分辨率" : "不是 iPhone X 分辨率");
}
目录结构如下:
第九个示例很容易整理成第四个示例。
第十个示例
目前代码如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class TransformLocalPosImprovements
{
#if UNITY_EDITOR
[MenuItem("QFramework/10.Transform 赋值优化")]
#endif
private static void GenerateUnityPackageName()
{
var transform = new GameObject("transform").transform;
TransformSimplify.SetLocalPosX(transform, 5.0f);
TransformSimplify.SetLocalPosY(transform, 5.0f);
TransformSimplify.SetLocalPosZ(transform, 5.0f);
}
}
}
做如下更改:
- MenuItem:10.Transform 赋值优化 => 5.Transform 赋值优化 并加上顺序号 5。
- 目录名:10.Transform 赋值优化 = > 5.Transform 赋值优化。
- MenuItem 方法名:GenerateUnityPackageName => MenuClicked
这样就可以了。
更改后菜单如下:
目录结构如下:
到目前为止还比较顺利。但是呢代码中使用的 TransformSimplify 这个类,是在别的文件中定义的。
而目前的这个示例仅仅有 MenuItem 方法,没有 TransformSimplify 实现代码,为什么会这样呢?
因为我们在整理之前,对 Transform 的 API 做了两次简化,而我们的示例是一个一个独立写的,所以第一次简化的时候写了一个示例并且创建了一个 Transform 的简化类,第二次也一样也创建了一个 Transform 的简化类,而这两个类在之后整理的时候被合并成一个 Transform 的简化类了。
这种情况,我们以后还会遇到的,可能有无数个 Transform 的简化方法。而我们的写示例的顺序,就是一个示例一个示例地写,这样写的好处就是初学者友好,也比较容易收集知识点。但是随着示例越写越多,会产生一些问题,比如代码重复实现,类需要合并等等,以目前我们的实力来说是没法搞定的,我们要学习新的东西。但是新的东西,要在我们排序完菜单顺序比较好一些。
这个问题我们先记下来。
要做的事情:
- (完成) 备份:导出文件,并取一个合理的名字。
- 整理完菜单顺序后,学习新的知识,解决随着示例增多可能出现类需要合并的问题。
OK,我们接着整理第十一个示例
第十一个示例
代码如下
using System;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class TransformSimplify
{
/// <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;
}
}
public class TransformIdentity : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/11.Transform 归一化")]
#endif
private static void MenuClicked()
{
var transform = new GameObject("transform").transform;
TransformSimplify.Identity(transform);
}
}
}
这个示例可以和第五个示例进行合并。
合并后的代码如下:
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
#endif
namespace QFramework
{
public 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;
}
}
}
菜单如下:
目录及文件如下:
而第一个示例的文件夹已经被笔者删除了。
第十二个示例
代码如下
using System;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using Random = UnityEngine.Random;
namespace QFramework
{
public class MathUtil
{
/// <summary>
/// 输入百分比返回是否命中概率
/// </summary>
public static bool Percent(int percent)
{
return Random.Range (0, 100) <= percent;
}
}
public class PercentFunction : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/12.概率函数")]
#endif
private static void MenuClicked()
{
Debug.Log(MathUtil.Percent(50));
}
}
}
整理步骤:
- 合并 MathUtil 类和 PercentFunction 类为 MathUtil.cs
- 菜单的标题 从 12 改成 6,而顺序改成 7 (因为 5 和 6 已经被第五个示例用了)。
- 目录名改成与菜单名一致。
更改后代码如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using Random = UnityEngine.Random;
namespace QFramework
{
public class MathUtil
{
/// <summary>
/// 输入百分比返回是否命中概率
/// </summary>
public static bool Percent(int percent)
{
return Random.Range (0, 100) <= percent;
}
#if UNITY_EDITOR
[MenuItem("QFramework/6.概率函数", false, 7)]
#endif
private static void MenuClicked()
{
Debug.Log(Percent(50));
}
}
}
目录结构如下
菜单如下
OK,第十二个示例整理完了
第十三个示例
代码如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class GameObjectSimplify
{
public static void Show(GameObject gameObj)
{
gameObj.SetActive(true);
}
public static void Hide(GameObject gameObj)
{
gameObj.SetActive(false);
}
}
public class GameObejctActiveImprovements
{
#if UNITY_EDITOR
[MenuItem("QFramework/13.GameObejct 的显示、隐藏简化")]
#endif
private static void MenuClicked()
{
var gameObject = new GameObject();
GameObjectSimplify.Hide(gameObject);
}
}
}
整理步骤:
- 类合并为 GameObjectSimplify
- 菜单顺序更改以及标题顺序更改
- 代码文件名和目录更改
整理之后代码如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public 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);
}
}
}
编译之后,菜单栏编程如下:
目录结构如下:
到此,全部的菜单顺序整理完了。
小结:
遗留问题:
- (完成) 第八个示例与之前的示例代码重复,功能重复。
- (完成) 方法所在类的命名有问题。
- (完成) 菜单栏显示顺序问题(new)。
- (完成) 弃用的代码警告
遗留问题终于全部解决了,我们的整理阶段也要接近尾声了。
今天就写到这,我们下一篇再见,拜拜~ 。
转载请注明地址:凉鞋的笔记:liangxiegame.com
更多内容
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
Unity 进阶小班:
- 主要训练内容:
- 框架搭建训练(第一年)
- 跟着案例学 Shader(第一年)
- 副业的孵化(第二年、第三年)
- 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
- 主要训练内容:
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。
# Unity 游戏框架搭建 2019 (三十四、三十五) 9 ~ 10 示例整理的更多相关文章
- Unity 游戏框架搭建 2019 (二十一、二十二) 第三章简介&整理前的准备
整理前的准备 到目前为止,我们积攒了很多示例了,并且每个示例也都贯彻了最的约定和规则. 在上一篇的小结也说了一个比较新的东西:编程体验优化. 在之前我们还积攒了一个问题:代码重复问题. 我们可是忍住整 ...
- Unity 游戏框架搭建 2019 (二十七、二十八)弃用的代码警告解决&弃用的代码删除
在前两篇,我们把所有的示例重头到尾整理了一遍. 当前的状态如下: 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 遗留问题: (完成) 第八个示例与之前的示例代码重复,功能重复. (完成 ...
- Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&方法的结构重复问题&泛型:结构复用利器
第四章 简介 方法的结构重复问题 我们在上一篇正式整理完毕,从这一篇开始,我们要再次进入学习收集示例阶段了. 那么我们学什么呢?当然是学习设计工具,也就是在上篇中提到的关键知识点.这些关键知识点,大部 ...
- Unity 游戏框架搭建 2019 (三十二、三十三) 类的命名 & 代码文件命名
昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整. 我们今天再往下接着调整. 我们来看下接下来的 MenuItem 代码如下: [MenuItem("QFramework/ ...
- Unity 游戏框架搭建 2019 (四十六) 简易消息机制 & 集成到 MonoBehaviourSimplify 里
在上一篇,我们接触了单例,使用单例解决了我们脚本之间访问的问题. 脚本之间访问其实有更好的方式. 我们先分下脚本访问脚本的几种形式. 第一种,A GameObject 是 B GameObject 的 ...
- Unity 游戏框架搭建 2019 (四十八/四十九) MonoBehaviourSimplify 中的消息策略完善&关于发送事件的简单封装
MonoBehaviourSimplify 中的消息策略完善 在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题.我们在这篇试着解决一下. 先贴出来代码: usi ...
- Unity 游戏框架搭建 2019 (三十、三十一) MenuItem 显示顺序问题 & 类的提取
在上一篇,我们得出了两个核心的学习思路: 根据问题去学习,并收集. 主动学习,并思考适用场景. 我们今天解决 MenuItem 显示顺序问题. 目前 MenuItem 显示如图所示: 我们来看下 Me ...
- Unity 游戏框架搭建 2019 (三十六~三十八) partial与public
在上一篇,我们把菜单的顺序从头到尾整理了一遍.在整理菜单顺序的过程中,记录了一个要做的事情. 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 整理完菜单顺序后,学习新的知识,解决随着示例 ...
- Unity 游戏框架搭建 2019 (五十二~五十四) 什么是库?&第四章总结&第五章简介
在上一篇,我们对框架和架构进行了一点探讨.我们在这一篇再接着探讨. 什么是库呢? 来自同一位大神的解释: 库, 插到 既有 架构 中, 补充 特定 功能. 很形象,库就是搞这个的.我们的库最初存在的目 ...
随机推荐
- nltk 获取 gutenberg 语料,gensim 生成词库和 onehot 编码
nltk 获取 gutenberg 语料 gensim 生成词库和 onehot 编码 正在尝试基于 Tensorflow LSTM 模型开发另外一个项目,需要自然语言处理的工具和语料. import ...
- SpringBoot安装与配置
1.环境准备 1.1.Maven安装配置 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件. 下载Maven可执行文件 cd /usr/local ...
- Python——NumPy数据存取与函数
1.数据csv文件存贮 1.1 CSV文件写入 CSV (Comma‐Separated Value, 逗号分隔值)CSV是一种常见的文件格式,用来存储批量数据 np.savetxt(frame, a ...
- STL之map与pair与unordered_map常用函数详解
STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...
- Vertica的这些事(二)——SQL-Server、Oracle、MySQL和Vertica数据库常用函数对比
SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 绝对值 S:select abs(-1) value O ...
- java 根据图片文字动态生成图片
今天在做热敏打印机打印二维码,并有文字描述,想到的简单的方法就是根据热敏打印机的纸张宽度和高度,生成对应的图片,如下: package com.orisdom.utils; import lombok ...
- PTA数据结构与算法题目集(中文) 7-29
PTA数据结构与算法题目集(中文) 7-29 7-29 修理牧场 (25 分) 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条 ...
- Hadoop(一)基本简介
是一个由Apache基金会所开发的分布式系统基础架构. 广义上来说,是一个Hadoop生态圈(由一堆框架.软件组成) 版本介绍 分为社区版和商业版 1.x,2.x,-是并行发展的 1.x : 由一个分 ...
- Django -->admin后台(后台管理可以直接往数据库添加数据)
一.使用pymysql时,必须加这两行(#如果使用mysql的数据库,请进行伪装 pymysql伪装为MySQLdb) import pymysqlpymysql.install_as_MySQLdb ...
- MODIS系列之NDVI(MOD13Q1)一:数据下载(二)基于FTP
这一篇我们来介绍下MODIS数据的下载方式.当然这边主要是介绍国外网站的下载方式,国内网站的普遍是在地理空间数据云和遥感集市下载.国外网站(NASA官网)下载方式主要介绍两种.本篇主要针对第一种方式, ...