Unity-Shader开发(二)
基础数学
Mathf
Math是C#封装的一个类,Mathf是Unity中封装的工具结构体,不仅包含了Math中的方法,还多了一些适用于游戏开发的方法
CeilToInt:向上取整 Mathf.CeilToInt(1.3f) == 2
FloorToInt:向下取整 Mathf.CeilToInt(1.3f) == 1
Clamp:钳制函数 Mathf.Clamp(10, 11, 20) == 11 Mathf.Clamp(21, 11, 20) == 20
Pow:一个数的n次方 Mathf.Pow(2, 3) == 8
RoundToInt:四舍五入 Mathf.RoundToInt(1.5f) == 2
Sqrt:开平方根 Mathf.Sqrt(4) == 2
IsPowerOfTwo:是否是2的n次方 Mathf.IsPowerOfTwo(4) == true
Sign:判断正负数 Mathf.Sign(10) == 1 ...
Unity-编辑器开发
自定义菜单栏扩展
特殊文件夹Editor
Editor文件夹是Unity中的特殊文件夹*,*所有Unity中编辑器相关的脚本都需要放置在其中。因为这些使用了Unity编辑器相关命名空间的脚本最终是不能被打包出去的,否则会报错
一般自定义菜单栏拓展都是使用的MenuItem特性,加载静态函数上面,一般该静态函数所在的类不需要继承MonoBehavior
在Unity菜单栏中添加自定义页签:
1[MenuItem("页签/一级选项/二级选项/....")]
在Hierarchy窗口中添加自定义页签:
只需要前面多加个GameObject
1[MenuItem("GameObject/页签/一级选项/二级选项/....")]
在Project窗口中添加自定义页签:
前面多加Assets
1[MenuItem("Assets/页签/一级选项/二级选项/....")]
在Inspector为脚本右键添加菜单:
1[MenuItem("CONTEXT/脚本名/页签/一级选项/二级选项/....")]
加入快捷键:
单 ...
Unity前缀树红点系统
红点系统设计
RedDotSystem: 红点系统管理类,提供初始化红点逻辑、更新红i的那状态、注册、移除、红点事件改变
RedDotDefine: 红点定义,主要用来作为红点的前缀唯一标识(key值定义)
RedDotNode: 红点节点,主要用来处理单个红点的具体逻辑
RedDotItem: 红点UI节点,主要用来监听红点的改变,是否隐藏显示红点以及红点数量
工作流程:
界面显示时,他的红点预制体上的脚本在激活时去调用红点系统RedDotSystem的UpdateRedDotState(redKey) 更新对应Key的红点状态
这个方法会调用当前红点对象RedDotNode的RefreshRedDotState(),这个方法会先获取子节点的红点显示数量,并执行自己的红点逻辑(比如:自己的红点是否显示由子节点红点数量决定或者从服务端缓存的数据决定)
之后执行UI层注册的事件(比如:点击后设置红点状态)
上面的结束之后,再按相同的步骤更新对应父节点Key的红点状态
RedDotSystem
1234567891011121314151617181920212223242526 ...
Unity-Shader开发(一)
Shader必备基础
渲染管线概述
他是计算机图形学中用于将三维场景数据经过一系列的阶段性处理转化为最终屏幕所见图像的过程。
三维场景数据包括:
顶点数据:模型顶点坐标、法线向量等
纹理数据:纹理贴图
光照数据:光照参数、信息等
阶段:
应用阶段、集合阶段、光栅化阶段
Unity的渲染管线
Unity中的渲染管线和计算机图形学中的渲染管线基本上是相同的概念,但是Unity的渲染管线是建立在图形学基础上,有自己的实现和拓展,提供了高度可配置和可拓展的框架,允许开发者可自定义渲染流程
应用阶段
大部分内容和渲染无关,但是为渲染管线的后续提供了最重要的内容——数据,主导者——CPU
将不可见的物体数据剔除
准备模型的相关数据
将数据加载到显存中
设置渲染状态(网格需要使用哪个着色器、材质、光源属性等)
调用DrawCall
DrawCall:
CPU通过图像编程接口向命令缓冲区添加命令[模型数据和渲染状态的命令]的动作,GPU会从这个缓冲区读取命令。
性能瓶颈在于CPU,所以使用批处理、合并网格、共用材质、合并图集等减少DrawCall可以提升性能
几何阶段
图元
是几何数据的基本单 ...
Unity-UGUI实践小项目
需求分析
游戏准备
导入资源和Json脚本
设置UI相机和Canvas
面板基类
整体显示隐藏
淡入淡出
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465public abstract class BasePanel : MonoBehaviour{ private CanvasGroup _canvasGroup; //淡入淡出的速度 private float alphaSpeed = 10; private bool isShow; private UnityAction hideCallBack; private void Awake() { _canvasGroup = GetComponent<CanvasGroup>(); if (_canvasGroup ...
Unity-UGUI
UGUI基础
六大基础组件
六大基础组件在Canvas对象和Event System对象上
Canvas对象:
Canvas:画布组件,主要用于渲染UI空间
Canvas Scaler:画布自适应分辨率组件,主要用于分辨率自适应
Graphic Raycaster:射线事件交互组件,用于控制射线响应相关
RectTransform:UI对象位置锚点控制组件,主要用于控制位置和对齐方式
Event System对象(监听玩家操作):
EventSystem:玩家输入事件响应系统
Standalone Input Module:玩家独立输入模块组件
Canvas组件
Canvas组件用来干啥
它是UGUI中所有UI元素能够被显示的根本 它主要负责渲染自己的所有UI子对象
如果UI控件对象不是Canvas的子对象,那么控件将不能被渲染我们可以通过修改Canvas组件上的参数修改渲染方式
场景中可以有多个Canvas对象
场景中允许有多个Canvas对象 可以分别管理不同画布的渲染方式,分辨率适应方式等等参数,一般情况场景上一个Canvas即可
Canvas组件的3种渲染方式(笔试遇到 ...
Unity-MVC思想
主要内容
MVC基础
MVC变形–MVX概念
Pure MVC框架
基本概念
数据、界面、逻辑分离
游戏中的应用: 非必须的UI系统开发框架
MVX
MVP: 断开model和view层的耦合
MVVM:数据双向绑定
MVE:基于事件分发
PureMVC
基本结构:MVC+Proxy+Mediator+Command+Facade
导入
方式一:生成dll文件直接导入
方式二:导入Core、Interface、Patterns三个文件夹
第一步:创建一个通知名类
123456789/// <summary>/// 通知类/// </summary>public class MyNotification{ public const string SHOW_PANEL = "showPanel"; public const string UPDATE_PLAYER_INFO = "updatePlayerInfo"; public const string START_GAME = "start ...
Unity-热更新中AB包的上传下载
主要内容
AB包更新列表文件的生成
AB包上传
本地远端资源对比
AB包下载
功能拓展
上传相关
准备AB资源
获取AB包文件的MD5码
根据文件路径获取文件流信息
利用MD5对象根据文件流对象,生成16字节的MD5码
将字节数据形式的MD5码转换成16进制字符串(减少MD5码长度)
12345678910111213141516171819public string GetMD5(string filepath){ using (FileStream fs = new FileStream(filepath, FileMode.Open)) { //md5对象生成MD5码 MD5 md5 = new MD5CryptoServiceProvider(); byte[] md5Info = md5.ComputeHash(fs); fs.Close(); //将字节数组形式的MD5码转成 16进制字符串 StringBuilder sb = new Stri ...
Unity-XLua热更新
xLua热更新
学习目标
导入xLua框架
C#调用Lua
Lua调用C#
xLua热补丁
C#调用lua(相对较少)
准备工作
导入xLua
导入AssetBundleBrower
导入AB包管理器ABMgr
导入BaseManager
LuaEnv
Lua解析器能够让我们在Unity中执行Lua
一般情况下,保持它的唯一性
1LuaEnv env = new LuaEnv();
使用 DoString直接执行Lua语言
1env.DoString("print('你好世界')");
执行一个Lua脚本 Lua知识点 :多脚本执行 require
注意:默认寻找脚本的路径是在 Resources下,并且因为在这里,可能是通过 Resources.Load去加载Lua脚本, 它只能加载txt bytes等等后缀的文件无法加载.lua后缀文件。所以Lua脚本后缀要加一个.txt
1env.DoString("require('Main')");
1env.Tick();
帮助我们清除Lua中我们没有 ...