昨天呢我们把第八个示例整理完了。整理之后学习了类的第一作用:方法的集合,还有 Obselete 这个 API。并且在进行整理的时候贯彻了我们新的约定和规则:先确保功能有效,再去做变更和删除。

今天我们在往下接着整理第九个示例

第九个示例

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;
}
}
}

我们先看些类的名字,ResolutionCheck,这个没有太大的问题。所以这个示例就留着。

第十个示例

#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; SetLocalPosX(transform, 5.0f);
SetLocalPosY(transform, 5.0f);
SetLocalPosZ(transform, 5.0f);
} 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;
}
}
}

同样也是没啥太大的问题,也留着。

第十一个示例

#if UNITY_EDITOR
using UnityEditor;
#endif using UnityEngine; namespace QFramework
{
public class TransformIdentity : MonoBehaviour
{ #if UNITY_EDITOR
[MenuItem("QFramework/11.Transform 归一化")]
#endif
private static void MenuClicked()
{
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;
}
}
}

类的名字没有问题,但是到这里笔者发现这个类里的方法是可以和 第十个示例: TransformLocalPosImprovements 放在一个类里的,因为都是对 Transform API 的简化。

类名字可以叫 TransformSimplify。

类的定义如下:

	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;
}
}

很简单,就是把上一个示例与这个示例的方法都复制到了这里,类的定义位置在 TransformIdentity 的上方。

接下来,我们要把原来的实现方法做中转,再加上 Obselete 属性。这步就不展示了,内容与上一篇文章一致,

第十二个示例

#if UNITY_EDITOR
using UnityEditor;
#endif using UnityEngine; namespace QFramework
{
public class PercentFunction : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/12.概率函数")]
#endif
private static void MenuClicked()
{
Debug.Log(Percent(50));
} /// <summary>
/// 输入百分比返回是否命中概率
/// </summary>
public static bool Percent(int percent)
{
return Random.Range (0, 100) <= percent;
}
}
}

这个代码的类名就有点问题了,叫做 PercentFunction,Percent 呢,是数学计算,所以我们把这个方法归到 MathUtil 这个类里。

代码如下:

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));
} /// <summary>
/// 输入百分比返回是否命中概率
/// </summary>
[Obsolete("方法已弃用,请使用 MathUtil.Percent")]
public static bool Percent(int percent)
{
return MathUtil.Percent(percent);
}
}
}

第十三个示例

#if UNITY_EDITOR
using UnityEditor;
#endif using UnityEngine; namespace QFramework
{
public class GameObejctActiveImprovements
{
#if UNITY_EDITOR
[MenuItem("QFramework/13.GameObejct 的显示、隐藏简化")]
#endif
private static void MenuClicked()
{
var gameObject = new GameObject(); Hide(gameObject);
} public static void Show(GameObject gameObj)
{
gameObj.SetActive(true);
} public static void Hide(GameObject gameObj)
{
gameObj.SetActive(false);
}
}
}

与 TransformSimplify 一样,我们也定义一个 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);
}
} public class GameObejctActiveImprovements
{
#if UNITY_EDITOR
[MenuItem("QFramework/13.GameObejct 的显示、隐藏简化")]
#endif
private static void MenuClicked()
{
var gameObject = new GameObject(); GameObjectSimplify.Hide(gameObject);
} [Obsolete("方法已启用,请使用 GameObjectSimplify.Show")]
public static void Show(GameObject gameObj)
{
GameObjectSimplify.Show(gameObj);
} [Obsolete("方法已启用,请使用 GameObjectSimplify.Hide")]
public static void Hide(GameObject gameObj)
{
GameObjectSimplify.Hide(gameObj);
}
}
}

到此呢,我们十三个示例都做了一轮整理。整理之后又要回头去解决一些整理过程中发现的问题。这部分内容我们在下一篇开始解决。

今天的内容就这些,拜拜~

转载请注明地址:凉鞋的笔记:liangxiegame.com

更多内容

Unity 游戏框架搭建 2019 (二十六) 第一轮整理完结的更多相关文章

  1. Unity 游戏框架搭建 2019 (四十六) 简易消息机制 & 集成到 MonoBehaviourSimplify 里

    在上一篇,我们接触了单例,使用单例解决了我们脚本之间访问的问题. 脚本之间访问其实有更好的方式. 我们先分下脚本访问脚本的几种形式. 第一种,A GameObject 是 B GameObject 的 ...

  2. Unity 游戏框架搭建 2019 (五十六/五十七) 需求分析-架构中最重要的一环&从 EmptyGO 到 Manager Of Managers

    我们的项目开始立项的时候,最常见的一个情况就是:几个人的小团队,一开始什么也不做,就开始写代码,验证逻辑,游戏就开始写起来了.而公司的一些所谓的领导层面一开始就把游戏定义为我们要做一个大作.这个事情本 ...

  3. Unity 游戏框架搭建 2019 (二十五) 类的第一个作用 与 Obselete 属性

    在上一篇我们整理到了第七个示例,我们今天再接着往下整理.我们来看第八个示例: #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; ...

  4. Unity 游戏框架搭建 2019 (二十九) 方法所在类命名问题诞生的原因

    我们在整理阶段解决了一些意外的问题.但是这些问题仅仅只是被解决而已,我们并没有去思考过这些问题是为什么产生的?以及在以后我们如何去避免这些问题的产生? 方法所在类的命名问题,最后我们通过方法分类解决了 ...

  5. Unity 游戏框架搭建 2019 (三十六~三十八) partial与public

    在上一篇,我们把菜单的顺序从头到尾整理了一遍.在整理菜单顺序的过程中,记录了一个要做的事情. 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 整理完菜单顺序后,学习新的知识,解决随着示例 ...

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

    第一章小结 为了强化教程的重点,会在合适的时候进行总结与快速复习. 第二章 简介 在第一章我们做了知识库的准备,从而让我们更高效地收集示例. 在第二章,我们就用准备好的导出工具试着收集几个示例,这些示 ...

  7. Unity 游戏框架搭建 2019 (二十一、二十二) 第三章简介&整理前的准备

    整理前的准备 到目前为止,我们积攒了很多示例了,并且每个示例也都贯彻了最的约定和规则. 在上一篇的小结也说了一个比较新的东西:编程体验优化. 在之前我们还积攒了一个问题:代码重复问题. 我们可是忍住整 ...

  8. Unity 游戏框架搭建 2019 (二十七、二十八)弃用的代码警告解决&弃用的代码删除

    在前两篇,我们把所有的示例重头到尾整理了一遍. 当前的状态如下: 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 遗留问题: (完成) 第八个示例与之前的示例代码重复,功能重复. (完成 ...

  9. Unity 游戏框架搭建 2019 (三十二、三十三) 类的命名 & 代码文件命名

    昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整. 我们今天再往下接着调整. 我们来看下接下来的 MenuItem 代码如下: [MenuItem("QFramework/ ...

随机推荐

  1. java算法--链表

    虽然这个文章看着很多,但是大多是对于细节的讲解,如果想要快速了解,可以直接观看末尾代码.上面的代码内容都是来自于文章末尾的代码. 很重要的算法,也是比较简单的算法. 但是在java中,因为不存在c和c ...

  2. ReentrantReadWriteLock 源码分析以及 AQS 共享锁 (二)

    前言 上一篇讲解了 AQS 的独占锁部分(参看:ReentrantLock 源码分析以及 AQS (一)),这一篇将介绍 AQS 的共享锁,以及基于共享锁实现读写锁分离的 ReentrantReadW ...

  3. IPv6 时代如何防御 DDoS 攻击?

    在互联网世界,每台联网的设备都被分配了一个用于标识和位置定义的 IP 地址.20 世纪 90 年代以来互联网的快速发展,联网设备所需的地址远远多于可用 IPv4 地址的数量,导致了 IPv4 地址耗尽 ...

  4. 华为面试题(JAVA版)

    [编程题] 扑克牌大小时间限制:10秒空间限制:131072K扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写 ...

  5. javascript中事件概述

    事件就是用户或浏览器自身执行的某种动作.诸如click.load.和mouseover,都是事件的名字.而响应某个事件的函数就叫做事件处理程序(或事件侦听器).事件处理程序的名字以"on&q ...

  6. Java中的Xml配置文件(新手)

    Java中的Xml配置文件,本文是转发转发转发!重要的事情说三遍 一:概念 1.XML  Extensible markup Language 可拓展标记语言 2.功能:存储数据(配置文件,在网络中传 ...

  7. C# lock 语法糖实现原理--《.NET Core 底层入门》之自旋锁,互斥锁,混合锁,读写锁

    在多线程环境中,多个线程可能会同时访问同一个资源,为了避免访问发生冲突,可以根据访问的复杂程度采取不同的措施 原子操作适用于简单的单个操作,无锁算法适用于相对简单的一连串操作,而线程锁适用于复杂的一连 ...

  8. 小白学 Python 数据分析(19):Matplotlib(四)常用图表(下)

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  9. Topshelf+Quartz3.0基于控制台应用程序快速开发可调度windows服务

    1.TopShelf TopShelf是一个开源的跨平台的宿主服务框架.可通过.Net Core/.Net Framwork控制台应用程序快速开发windows服务,更加便于服务调试. 本文基于.Ne ...

  10. 33. CentOS7 静态ip设置

    1.网络连接选择NAT模式: 2.关闭vmware的dhcp:选择编辑-->虚拟网络编辑器,选择VMnet8,去掉使用本地DHCP服务将ip地址分配给虚拟机(D). 3. 点击NAT设置(S)查 ...