Unity 游戏框架搭建
从零开始搭建一个 Unity 游戏框架
凉鞋的笔记
QFramework 作者,多年Unity开发者,Steam 多款独立游戏作者,GamePix 独立游戏学院。
展开
-
Shader专题:卡通着色(一)控制颜色的艺术
什么是 Shader?关于什么是 Shader ,各种百科各种教程都有说过,但是今天我们就从一个另一个角度去试着理解什么是 Shader?我们先看下 Shade 的英文意思,如下:v.给…遮挡(光线);把…涂暗其中 把…涂暗 更贴近我们想要的意思。所以:Shader 这个单词从字面上理解,就是把什么东西涂暗。再强调一次:Shader 从单词字面上理解,就是把什么东西涂暗。再强调一次:把什么东西涂暗的就是 Shader,就是着色器。Shader 把什么涂暗了?当然是游戏世界的各个物体,总所周原创 2020-06-29 10:34:42 · 1208 阅读 · 3 评论 -
小班同学学习经历分享(一)游戏程序员成长札记
作者信息昵称:目及远方课程设计 HumanFramework:https://github.com/cyclons/HumanFramewo正文大四毕业,心血来潮,闲余之际,撰文留念。萌芽游戏程序员,把这个分成两块的话就是,游戏,程序。这两个中,只有一个,游戏,在我很小的时候就开始接触,在那个视电子游戏如电子海洛因,父母抵制到要送孩子去网瘾治疗所的年代,三年级的我就已经在玩ps2了,周围的同学还在玩红警qq大乱斗冒险岛飞车的时候,我已经玩高达战神龙珠古墓丽影,最终导致和周围同学没有共同话题。原创 2020-06-25 10:05:00 · 3546 阅读 · 6 评论 -
Unity 游戏框架搭建 2019 (五十六) 需求分析-架构中最重要的一环
需求分析-架构中最重要的一环我们的项目开始立项的时候,最常见的一个情况就是:几个人的小团队,一开始什么也不做,就开始写代码,验证逻辑,游戏就开始写起来了。而公司的一些所谓的领导层面一开始就把游戏定义为我们要做一个大作。这个事情本身就是一个笑话,因为没有任何的规划和设计,我们就妄图写出一个杰出的作品出来是不现实的。Unity 在好用,那么以这个心态去做游戏,一定会写不出来好的游戏来。— 刘钢《Unity 项目架构设计与开发管理》以上这段话说得很清楚了,就是做一个项目的时候一定要做规划和设计,当然这是从原创 2020-06-23 10:06:54 · 2927 阅读 · 2 评论 -
Unity 游戏框架搭建 2019 (五十四、五十五) 第五章简介&Unity 项目架构设计与开发管理
第五章 简介Unity 项目架构设计与开发管理我们在之前花了两篇文章对架构、框架和库进行了简单的介绍。而我们到目前为止,已经写了十四个示例了。目录如下:我们并没有去为了写框架而写框架,而是一个个实际问题地解决,最后解决出来了一个小框架 MonoBehaviourSimplify,又趁势去了解了一点架构、框架和库的概念,一切是那么地自然。那么既然接触了架构、框架和库的概念,我们就可以接下来为搭建框架做准备了,而示例也积累了很多,整理的时机也成熟了,所以到此呢,我们的第二次学习收集示例的阶段就可原创 2020-06-09 10:19:26 · 2277 阅读 · 4 评论 -
Unity 游戏框架搭建 2019 (五十二) 什么是库
在上一篇,我们对框架和架构进行了一点探讨。我们在这一篇再接着探讨。什么是库呢?来自同一位大神的解释:库, 插到 既有 架构 中, 补充 特定 功能。很形象,库就是搞这个的。我们的库最初存在的目的,就是收集知识,而收集知识是一般的架构(项目)中是没有的,那么我们为了补充特定功能(收集知识),就要把我们的库导进来,然后收集一两个示例,再导出去,然后删除掉项目中库的文件,消除痕迹以免被其他人发现:) ,而这个库补充的收集知识这个功能是对于大家有用的,而不是对项目有用的,虽然对大家有用到最后也会慢慢影响原创 2020-06-03 10:55:17 · 1128 阅读 · 1 评论 -
Unity 游戏框架搭建 2019 (五十一) MonoBehaviourSimplify 是框架?
在上一篇呢,我们的得到了目前库的一个分层图,如下:而这个图中,把我们的库分成两个部分。一部分是框架,一部分是工具/库。框架部分,只有一个 MonoBehaviourSimplify,而工具/库,则是除了 MonoBehaviourSimplify 以外的全部内容。为什么 MonoBehaviourSimplify 是框架呢?我们先来看看框架是什么?框架:提供一个架构(文件结构、约定等等),你必须遵守它,只要你遵守,那剩下的就全部处理通用需求了。这个定义呢是来自某个 JavaScript 大原创 2020-06-01 21:04:38 · 2490 阅读 · 5 评论 -
Unity 游戏框架搭建 2019 (五十) 消息机制小结
我们花了 5 篇文章学习了消息机制的方方面面。并且完成了一个简易消息机制,之后集成到了我们的 MonoBehaviourSimplify 里。现在 MonoBehaviourSimplify 有一点框架的感觉了。因为 MonoBehaviourSimplify 在提供消息功能的同时,决定了项目脚本中的交互方式。而目前的这套结构,足够用它来完成一个比较小的项目了。消息机制是笔者在接触单例之后,第二次被震撼到的设计模式(观察者模式/发布者订阅者模式)。而笔者在初学的时候,还不太敢去设计 MonoBehavi原创 2020-05-29 14:08:11 · 1196 阅读 · 6 评论 -
Unity 游戏框架搭建 2019 (四十九) 关于发送事件的简单封装
在上一篇,我们在 MonoBehaviourSimplify 中集成了消息功能。而在做消息功能的过程中,又接触了对象池实现了一个非常简单版本。今天呢我们在接着学习。我们先回顾下 MonoBehaviourSimplify 中关于消息功能的使用方法。注册消息,直接用 RegisterMsg,而注销则在 OnDestroy 的时候统一进行注销。那么单独注销时候怎么办呢?这是第一个问题。第二个问题是,发送消息,我们使用的是 MsgDispatcher.Send 这个方法。和我们的注册消息的方法不是统一原创 2020-05-27 14:58:21 · 1556 阅读 · 1 评论 -
Unity 游戏框架搭建 2019 (四十八) MonoBehaviourSimplify 中的消息策略完善
在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题。我们在这篇试着解决一下。先贴出来代码:using System;using System.Collections.Generic;namespace QFramework{ public abstract partial class MonoBehaviourSimplify { Dictionary<string, Action<object>> m原创 2020-05-24 13:53:41 · 1590 阅读 · 2 评论 -
Unity 游戏框架搭建 2019 (四十七) 集成到 MonoBehaviourSimplify
还记得我们的简易消息机制是为了解决什么问题诞生的嘛?是为了解决脚本间访问的问题。我们回过头再看下 A 脚本如果想访问 B 脚本,使用消息机制,如何实现。代码如下:public class A : MonoBehaviour{ void Update() { if(Input.GetMouseButtonDown(0)) { MsgDispatcher.Send("DO","ok"); } }}public class B : MonoBehaviour{ voi原创 2020-05-23 11:14:54 · 2522 阅读 · 4 评论 -
Unity 游戏框架搭建 2019 (四十六) 简易消息机制
在上一篇,我们接触了单例,使用单例解决了我们脚本之间访问的问题。脚本之间访问其实有更好的方式。我们先分下脚本访问脚本的几种形式。第一种,A GameObject 是 B GameObject 的 Parent,或者是中间隔着几个层级的 Parent。那这种情况下,如果 A 脚本想调用 B 脚本的方法,直接通过 transform.Find(“XXX/YYY/ZZZ”).GetComponent<B>().DoSomething() 就可以了。但是如果是 B 脚本想调用 A 脚本的方法,原创 2020-05-11 18:14:07 · 2579 阅读 · 5 评论 -
Unity 游戏框架搭建 2019 (四十五) 独立的方法和独立的类
我们在开始本示例之前,先整理出我们当前库中的代码类型。工具方法:CommonUtil、GameObjectSimplify等。类: MonoBehaviourSimplify。静态方法中的方法全部都是工具方法,都是可以独立使用的,之所以可以独立使用,是因为这些工具方法所在类是没有状态的。什么叫没有状态呢? 比如 CommonUtil,其中的方法不管怎么使用,CommonUtil 类本身不会发生任何改变。但是像我们的 MonoBehaviourSimplify 用了一次 Show,那么它的 gam原创 2020-05-10 08:52:32 · 2360 阅读 · 8 评论 -
Unity 游戏框架搭建 2019 (四十四) 关于知识库的小结
在上一篇,我们完成了一个定时功能,并且接触了 Action 和委托、lambda 表达式这些概念。到目前为止,我们的库作为知识收录这个功能来说,已经非常好用了,由于使用了 partial 关键字,所以重复的代码少了很多。而作为一个可复用的工具库来说,勉强能够应付。通过 partial 关键字,理论上可以对已有了类,进行无限地增加示例。而我们的示例的类型呢,主要是写可独立使用的方法和 MenuI...原创 2020-05-07 09:37:39 · 976 阅读 · 5 评论 -
Unity 游戏框架搭建 2019 (四十三) 定时功能
在上一篇我们完成了 MonoBehaviour 的简化示例,通过做这个示例,强化了一次继承的使用。而为了让示例脚本自动运行,就接触了 EditorApplication.isPlaying 这个 API,有了这个 API 我们之后所有需要运行 UnityEditor 的脚本都可以按照这种格式去做。今天我们再接着往下学习。第十一个示例我们都知道,在项目中,我们会遇到非常多的定时需求。而定时功...原创 2020-05-05 10:51:49 · 2439 阅读 · 8 评论 -
Unity 游戏框架搭建 2019 (四十二) MonoBehaviour 简化
在前两篇,我们完成了第九个示例。为了完善第九个示例,我们复习了类的继承,又学习了泛型和 params 关键字。我们已经接触了类的继承了。接触继承之前,把类仅仅当做是方法的集合,接触了继承之后,我们的类还可以使用继承来解决一些问题。第十个示例在 Unity 中,我们的脚本都往往继承自 MonoBehaviour,继承了之后我们就可以在脚本内编写很多功能。比如访问 transform/gameO...原创 2020-05-04 10:03:04 · 1806 阅读 · 5 评论 -
Unity 游戏框架搭建 2019 (四十一) 泛型:结构复用利器
在上一篇我们使用 object 解决了方法结构重复的问题,而在文章的尾部又提了一下更好的方法,就是泛型。泛型对很多初学者来说是比较高级的概念,这里呢我们顺便复习一下泛型。泛型是什么呢?对于方法来说,方法结构中的部分或全部类型都可以先不进行定义,而是到调用方法的时候再去定义。我们的 GetRandomValue 的目前代码如下 :public static object GetRandomV...原创 2020-04-30 10:38:50 · 1531 阅读 · 14 评论 -
Unity 游戏框架搭建 2019 (三十九、四十) 第四章 简介与方法的结构重复问题
第四章 简介方法的结构重复问题我们在上一篇正式整理完毕,从这一篇开始,我们要再次进入学习收集示例阶段了。那么我们学什么呢?当然是学习设计工具,也就是在上篇中提到的关键知识点。这些关键知识点,大部分来自于 C# 语法。不过在此之前,我们先实现一个功能,这个功能是,传入几个数字,随机取出其中一个数字。比如传入 1,3,5,7 从这四个数字中随机取出一个数字出来。其实现很简单 代码如下:...原创 2020-04-29 10:02:08 · 1908 阅读 · 12 评论 -
Unity 游戏框架搭建 2019 (三十七、三十八) partial 和 public 的合理使用以及整理完结篇&第三章 小与快速复习
在上一篇中,我们学习了新的知识 partial 关键字,那么我们什么时候该用 partial 呢?我们简单分析一下:像 GameObjectSimplify 和 TransformSimplify 都是很可能增长的类,所以自然就要用到了。而我们的 CommonUtil、EditorUtil、MathUtil 也是非常大的一个范畴,随着时间,要加的东西也会越来越多的。所以这两个类也要加上 p...原创 2020-04-28 10:28:15 · 2123 阅读 · 9 评论 -
Unity 游戏框架搭建 2019 (三十六) 类在多个文件中实现:partial 关键字
在上一篇,我们把菜单的顺序从头到尾整理了一遍。在整理菜单顺序的过程中,记录了一个要做的事情。要做的事情:(完成) 备份:导出文件,并取一个合理的名字。整理完菜单顺序后,学习新的知识,解决随着示例增多,可能出现类需要合并的问题。我们要学习新的知识,试着解决类的合并问题。首先我们来看下要合并的类是什么,在我们的示例中是 TransformSimplify,这个 TransformSimpl...原创 2020-04-26 13:38:44 · 1046 阅读 · 8 评论 -
Unity 游戏框架搭建 2019 (三十五) 整理接近尾声
OK,我们接着整理第十一个示例第十一个示例代码如下using System;#if UNITY_EDITORusing UnityEditor;#endifusing UnityEngine;namespace QFramework{ public class TransformSimplify { /// <summary> /// 重置操作 ...原创 2020-04-25 12:11:50 · 1006 阅读 · 17 评论 -
Unity 游戏框架搭建 2019 (三十四) 9 ~ 10 示例整理
第九个示例目前代码如下:using UnityEngine;#if UNITY_EDITORusing UnityEditor;#endifnamespace QFramework{ public class ResolutionCheck {#if UNITY_EDITOR [MenuItem("QFramework/9.屏幕宽高比判断")]#endif pri...原创 2020-04-24 17:15:04 · 591 阅读 · 4 评论 -
Unity 游戏框架搭建 2019 (三十三) 代码文件命名
在上一篇中,通过第八个示例的第三个 MenuItem 方法,我们更新了约定和规则。我们接着往下整理。第八个示例的第四个 MenuItem 方法 [MenuItem("QFramework/8.总结之前的方法/4.导出 UnityPackage")] private static void MenuClicked4() { EditorUtil.ExportPackage("A...原创 2020-04-23 18:07:17 · 606 阅读 · 8 评论 -
Unity 游戏框架搭建 2019 (三十二) 类的命名
昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整。我们今天再往下接着调整。我们来看下接下来的 MenuItem代码如下: [MenuItem("QFramework/8.总结之前的方法/3.生成文件名到剪切板")] private static void MenuClicked3() { CommonUtil.CopyText(Exporter.Gener...原创 2020-04-22 12:26:03 · 792 阅读 · 8 评论 -
Unity 游戏框架搭建 2019 (二十六) 第一轮整理完结
昨天呢我们把第八个示例整理完了。整理之后学习了类的第一作用:方法的集合,还有 Obselete 这个 API。并且在进行整理的时候贯彻了我们新的约定和规则:先确保功能有效,再去做变更和删除。今天我们在往下接着整理第九个示例第九个示例using UnityEngine;#if UNITY_EDITORusing UnityEditor;#endifnamespace QFramew...原创 2020-04-11 18:31:45 · 560 阅读 · 8 评论 -
Unity 游戏框架搭建 2019 (二十五) 类的第一个作用 与 Obselete 属性
在上一篇我们整理到了第七个示例,我们今天再接着往下整理。我们来看第八个示例:#if UNITY_EDITORusing UnityEditor;#endifusing UnityEngine;using System;using System.IO;namespace QFramework{ public class PreviousFunctions : MonoBeha...原创 2020-04-10 10:17:15 · 846 阅读 · 4 评论 -
Unity 游戏框架搭建 2019 (二十三、二十四) 备份与版本号&危险的操作
先列出上一篇的总结:要做的事情:备份:导出文件,并取一个合理的名字。遗留问题:第八个示例与之前的示例代码重复,功能重复。约定和规则:每个示例在 QFramework 目录下创建一个文件夹,文件夹的格式是: 数字.示例的功能每个示例写一个脚本,脚本中包含可复用的静态方法和 MenuItem 方法。每写一个示例进行一次导出,导出的文件名后边加上日期和时间,这个功能已经在...原创 2020-04-09 10:20:03 · 795 阅读 · 8 评论 -
Unity 游戏框架搭建 2019 (二十一、二十二) 第三章简介&整理前的准备
整理前的准备到目前为止,我们积攒了很多示例了,并且每个示例也都贯彻了最的约定和规则。在上一篇的小结也说了一个比较新的东西:编程体验优化。在之前我们还积攒了一个问题:代码重复问题。我们可是忍住整理的冲动忍了好久了。所以现在也是时候准备着手整理了。知识点和问题总结遗留问题我们写列出来之前记录的第一个问题:第八个示例与之前的示例代码重复,功能重复。这个问题想想就很好解决,只要删...原创 2020-04-08 10:34:50 · 1145 阅读 · 9 评论 -
Unity 游戏框架搭建 2019 (十九) GameObject 显示、隐藏简化 & 第二章 小结与快速复习
我们在做项目的时候,经常会写如下的代码。gameObject.SetActive(true);gameObject.SetActive(false);active 意思是激活,其实是比较贴切的。但是笔者是从其他平台转过来的,最初想找到隐藏/显示 GameObject 的时候有点那么不适应。像 Cocos2d 的显示是 Visible (可以看见的),而 iOS 的则是 Hidden(隐...原创 2020-04-05 19:50:33 · 1970 阅读 · 10 评论 -
Unity 游戏框架搭建 2019 (十七、十八) Transform 重置与概率函数
今天我们再往下接着探索,我们的 Transform。我们经常要写这样的逻辑,对一个 Transform 的位置、旋转、缩放值进行重置。代码如下:transform.localPosition = Vector3.zero;transform.localScale = Vector3.one;transform.localRotation = Quaternion.identity;代...原创 2020-04-03 09:48:23 · 3137 阅读 · 15 评论 -
Unity 游戏框架搭建 2019 (十六) localPosition 简化
在上一篇我们收集了一个 屏幕分辨率检测的一个小工具。今天呢再往下接着探索。问题我们今天在接着探索。不管是写 UI 还是写 GamePlay,多多少少都需要操作 Transform。而在笔者刚接触 Unity 的时候有一个非常不习惯的地方。就是对 transform 的位置、角度、缩放进行赋值。比如,如果仅仅是对 transform.localPosition.x 进行赋值。代码要这样写。...原创 2020-04-01 22:18:37 · 3062 阅读 · 8 评论 -
Unity 游戏框架搭建 2019 (十五) 第九个示例(二)
在上一篇文章中,我们完成了 Pad 设备分辨率的判断。我们今天把剩下的其他分辨率都搞定。16:9 手机分辨率大部分手机是 16 : 9 的。所以代码如下。 /// <summary> /// 是否是手机分辨率 16:9 /// </summary> /// <returns></returns> public static ...原创 2020-03-31 12:12:05 · 2600 阅读 · 10 评论 -
Unity 游戏框架搭建 2019 (十四) 第九个示例(一)
在上一篇文章中,经过大量的思考我们得出了一个学习方向,那就是在项目中比较实用的小知识点。我们大部分 Unity 做的项目呢都是移动端的项目,这里包括 iPhone、iPad 以及各种 Android 端的设备。而经过笔者统计大部分的设备屏幕宽高比都是 16:9(iPhone 5s 至 iPhone 8) 和 4:3 (iPad)。而少部分的则是接近 2:1(iPhone X) 和 3:2(iPh...原创 2020-03-30 11:07:51 · 3243 阅读 · 19 评论 -
Unity 游戏框架搭建 2019 (十三) 接下来要学什么?
在之前的两篇中,我们使用 public 静态方法对之前的内容进行了一个抽取,有了 public 静态方法这个工具,我们的学习行为也发生了一点变化。在没使用 public 关键字之前呢,每一个示例仅仅是一个知识的记录作用。而我们用了 public 关键字之后,我们可以把知识作为一个可以复用的方法。但是呢,这样就有了一个顺序的问题。我们是先写方法在写 MenuItem?还是先写 MenuItem ...原创 2020-03-29 11:23:03 · 1679 阅读 · 4 评论 -
Unity 游戏框架搭建 2019 (十二) 第八个示例(二)
在上一篇我们抽取了第一个示例的方法,我们在这篇在接着往下抽取。提取第二个示例先看第二个示例的代码。#if UNITY_EDITORusing UnityEditor;#endifusing UnityEngine;namespace QFramework{ public static class CopyText2Clipboard {#if UNITY_EDITOR ...原创 2020-03-28 10:46:43 · 877 阅读 · 2 评论 -
Unity 游戏框架搭建 2019 (九、十、十一) 第一章小结&第二章简介&第八个示例(一)
第一章小结为了强化教程的重点,会在合适的时候进行总结与快速复习。第二章 简介在第一章我们做了知识库的准备,从而让我们更高效地收集示例。在第二章,我们就用准备好的导出工具试着收集几个示例,这些示例中有的是我们后续库的基础工具,也有的是在项目中非常实用的小工具,还有一些示例是实践了在框架搭建方向上非常重要的 C# 语法知识。第二章大纲如下。第八个示例(一)在之前,我们完成了一个导出的...原创 2020-03-27 10:08:54 · 831 阅读 · 3 评论 -
Unity 游戏框架搭建 2019 (八) 关于导出 UnityPackage 功能的小结
导出 UnityPackage 功能到这里要告一段落了,相信认真看的童鞋都有收获。笔者在写教程之前纠结了很久。到底是先给出一坨工具代码,然后再逐个讲解比较好,还是一篇一个知识点比较好。后来想通了。工具和知识点都要同时写。也就诞生了这个系列的教程,这对笔者来说是一个挑战。在 框架搭建 2017 年版本,采用的就是一篇文章一个小工具。而到了 2018 年版本,自己的内容变多了,所以一篇文章会讲好多东...原创 2020-03-26 10:00:00 · 906 阅读 · 1 评论 -
Unity 游戏框架搭建 2019 (七) 自定义快捷键
在上一篇我们搞定了一键导出这个功能。那么在这篇文章中我们接着往下探索。我们还是列出我们的导出步骤:点击菜单栏 QFramework/6.MenuItem 复用。这样一步很简单。只要点击菜单栏 QFramework/6.MenuItem 复用,就可以完成我们的导出操作。我们要思考这句话本身“点击菜单栏 QFramework/6.MenuItem 复用”点击,是我们仅做的一步操作。那么...原创 2020-03-25 17:25:47 · 1070 阅读 · 0 评论 -
Unity 游戏框架搭建 2019 (六) MenuItem 复用
在上一篇中我们搞定了直接弹出文件夹功能,那么在这篇我们试着把它集成到我们导出步骤了。那么我们要在第四个示例上直接加入代码嘛?不是的,从笔者写教程的角度来讲,这样做会造成一个问题。教程和示例是一起发布的,如果在第四个示例上直接加入代码,那么,如果刚刚看完第四个篇教程的同学,去翻代码的时候,结果第四个示例根本看不懂,这样很容易造成困惑。而这个框架搭建系列专栏作为笔者打算写一年的年度大专栏,这才刚...原创 2020-03-24 10:12:39 · 683 阅读 · 0 评论 -
Unity 游戏框架搭建 2019 (五) 打开所在文件夹
在上一篇中我们搞定了直接导出的功能,这算是一个巨大的进步了。那么在这篇我们再接着往下分析。这样我们目前的导出步骤为:点击菜单栏 QFramework/4.导出 UnityPackage。我们是不是没有可以优化的空间了?对于导出步骤的数量来说,确实没有了。只需要一步就可以导出了。但是从一个所花费的时间角度来讲其实还有空间的。也就是说,我们还可以节省时间。我们跳出导出步骤这个角度,而是思...原创 2020-03-23 10:54:26 · 685 阅读 · 0 评论 -
Unity 游戏框架搭建 2019 (四) 导出 UnityPackage
在上一篇中我们搞定了合并的功能。那么在这篇文章我们接着继续。先列出我们目前的导出步骤:点击菜单栏 QFramework/3.生成文件名到剪切板。右击 QFramework 文件夹,然后选择 ExportPackage。之后确保取消选择 Include Dependency。粘贴名字,然后导出到指定目录下。目前第一步操作已经没有优化空间了。那么我们看看第二步: 右击 QFramew...原创 2020-03-22 10:33:52 · 1243 阅读 · 0 评论