![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Unity
文章平均质量分 58
张山大人
这个作者很懒,什么都没留下…
展开
-
UnityShader-如果使用遮罩纹理更好控制光照模型下的照亮程度
遮罩纹理的作用传统的遮罩纹理只是为了在同一个采样或者光照模型下,某些会被照亮的区域,我们并不希望他被完全照亮时,我们就会使用遮罩纹理进行调节。遮罩纹理就起到了一个遮罩的作用,让这些区域变的更亮或者更暗一点。在目前的游戏项目中,遮罩纹理其实更像一个调节器,,更自由的控制颜色最终的生成,而不是仅仅根据模型去计算。给予美术人员更高的自由度。纹理的每个像素都有四个通道,在现代项目中,这四个通道会被赋予不同的值。每个值都将在模型的采样或者光照计算中发挥一定的调节作用。比如调节光照强度,边缘光的强度,高光反射指原创 2021-06-08 13:03:40 · 256 阅读 · 0 评论 -
UnityShader-如何使用渐变纹理在模型的表面区分出明显的色域
卡通渲染中的渐变纹理近年来一些卡通渲染中会使用到渐变纹理,在人物模型上营造出随着光照变化明显的明暗部分,比如塞尔达,塞尔达的卡通渲染就大量的应用了渐变纹理。如下图的面部。面部上明显的光暗轮廓就是通过在渐变纹理上的采样,与模型本身的纹理采样进行混合得到。配合上近乎轮廓颜色的描边,成就了一种极为立体的卡通渲染。后面有机会会完整的演示一次这种基于渐变纹理和描边的卡通渲染。渲染原理将模型法线与光照方向求出点积,进一步规范到0-1之间float gradient = dot(worldNorma原创 2021-06-08 11:28:03 · 330 阅读 · 0 评论 -
UnityShader-使用切线空间下的法线贴图
法线贴图在游戏中,如果墙面,草地这些,如果从模型的角度去展现凹凸感,那模型的细节难度会增加不少,同时而来的也是顶点的增加,这样是及其浪费的。我们通常使用法线贴图,使得模型随着环境或者光照的改变增加这种凹凸感,让我们可以用一个简单的面片也能展现出细节丰富的视觉效果为什么使用切线空间下的法线纹理自由度更高,当一张纹理可以用在不同的模型上时,可以只使用一套法线纹理,但是模型空间下,必须对每一个模型都创建一套对应的法线纹理可压缩,切线空间下法线纹理的z方向总是正方向,因此我们可以通过xy轴进行点积,之原创 2021-06-08 00:50:06 · 499 阅读 · 0 评论 -
UnityShader-素描铅笔画风格 实现详解
效果图实现大致思路(1)几张铅笔画程度不同的素描原线图(2)根据模型顶点法线与场景中光照方向的夹角算点积。(3)点积越大,颜色越前,素描程度越低,点积越小,颜色越深,素描程度越大。(4)将点积分为七个不同的范围,其中最大的范围为纯白色(5)其余六个范围,按点积大小从上方素描原线图由浅至深进行采样(6)增加一个纯白贡献度,将不采样的部分及单次采样的部分向白色翻转,形成留白的效果详细代码解释(1) 定义属性 Properties{ //物体本身颜色 _Color("Main原创 2021-05-20 01:01:11 · 981 阅读 · 0 评论 -
UnityShader-通过相机纹理实现镜面效果
镜面效果实现一块镜子材质,让其拥有镜面效果实现(1) 新建一个相机,用一张纹理接收相机拍到的内容纹理没有什么要求,最好是一张纯色的图(2) 创建一张Plane,或者其他可以赋纹理的组件。(3) 思路:------ Shader需要接受一张纹理------ Shader将纹理的x坐标反转------ Shader将纹理返回思路其实非常简单,就是将新相机看到的东西传递到一张纹理,反转坐标之后显示在镜子上Shader "Custom/Mirror"{ Properties原创 2021-05-18 14:45:54 · 700 阅读 · 0 评论 -
UnityMesh:使用程序绘制一个带有UV坐标的Plane面
在游戏开发过程中,模型一般由美术提供,程序一般只负责使用,以及优化。一般的优化手段就是mesh的合批,高低摸的转换之类,以及捏脸系统等等。但是大家要知道一点,Unity不仅可以处理模型,还可以创建模型,只是在正常的商业游戏开发中并不需要程序去用代码制作模型。但是知道Unity中模型是怎么构建的,非常有利于我们对开发的深入理解。1.Unity中模型是怎么显示的(1)简单来说,模型都是用三角面构成。在理解模型的时候,可以直接将模型认作为Mesh网格。所以Mesh网格就是由三角面片组成,如下:这是一个我绘制原创 2021-05-14 00:27:24 · 2125 阅读 · 0 评论 -
Unity特性:使用特性与反射对UI进行prefab绑定
1.什么是特性:相当与一个标签,可以绑定在变量、方法、或者类上,并在这个标签中存放一定的信息。这个标签同时也是一个类,通过这个类对标签中的信息进行一定的处理。最终应用到被绑定的对象身上2.为什么使用特性:特性会使用到反射,熟悉代码的同学都了解,反射的性能并不好,但是为什么还要用呢。这是一个深层次的解耦合操作,当我们需要对不同类进行一些统一的信息处理,尤其是这些类可能并不是同一个继承关系的时候。特性就会发挥一些意想不到的效果。但是由于性能问题,我们并不建议在实际运行中去频繁的使用特性,而是利用特性进行一原创 2021-04-10 19:31:00 · 610 阅读 · 0 评论 -
游戏设计模式与实现之:工厂模式 与 资源工厂
GoF解释:定义一个产生对象的接口,但是让子类决定要产生哪一个类的对象。工厂方法模式让类的实力化延迟到子类是中实施。模式说明:单独声明一个接口,提供某一个子类的实力化工作。在实际项目中,有时候这部分功能会被放在统一的中介类中。但是这样有点不合理,中介类应该只需要负责系统和模块之间的沟通,而不应该参与到具体逻辑的实现。在这里我们使用工厂模式就十分的便利。流程图分析:提供一个抽象工厂类并让客户端持有,实力化根据不同的需求使用不同的工厂进行实力化。案例分析:实现一个资源工厂1.需求分析:我们实现一原创 2021-04-06 19:29:39 · 192 阅读 · 0 评论 -
游戏设计模式与实现之:责任链模式 与 关卡设计
GoF解释:让一群对象都有机会处理一个请求,并减少请求发送者与接受者之间的耦合程度。将所有的接受者对象串联起来,让请求沿着串传递,知道有一个对象可以解决请求的问题为止。模式说明:对于一个问题或者一项需求,我们可以制造一条流水线,流水线上每个节点都可能是解决问题的方式,或者是满足需求的一部分。GoF四人组的解释只解释了对问题的处理,而责任链模式在当前的应用很多都是处理需求的组装,熟悉Java后台开发,尤其是Netty框架,大量的应用了责任链模式对对象进行组装。我们先来了解一下这个模式,再来仔细说一下这个原创 2021-04-06 16:49:21 · 261 阅读 · 0 评论 -
游戏设计模式与实现之:访问者模式 与 信息查询
GoF解释:定义一个能够在一个对象结构中,对于所有元素执行的操作。访问者让你可以定义一个新的操作,而不必更改到被操作元素的接口。模式说明:当我们需要对一组对象进行统一的操作时,我们定义一个管理类,在开发的过程中,我们因为需求可能不断的增加,那我们的管理类是不是就要不断的增加,这理论上违反了开闭原则。访问者模式通过提供不同的访问者,使用同一个公共接口,访问到不同的数据或者进行不同的操作。重要的名词:visitor:访问者,为需要集中处理的对象提供操作方法。案例分析:为一个基类的所有实现子类提供计数原创 2021-04-06 11:55:47 · 150 阅读 · 0 评论 -
游戏设计模式与实现之:命令模式 与 周期任务
GoF解释:将请求封装成对象,让你可以将客户端的不同请求参数化,并配合对列、记录、复原等方法来执行请求的操作模式说明:当我们不希望命令和执行强烈的耦合在一起,需要操作某件事的时候,生成一个命令,然后将这个命令加入对列中,在一个恰当的时机去执行,并且可以存在撤销等操作。当我们不使用设计模式的时候,命令和操作时强烈的耦合在一起的,大多数情况下命令并不能清爽的执行下去,并且也会伴随一些难以撤销的问题。案例分析:简单任务系统1.需求分析:游戏角色可以接收任务,同时可以接很多个,但是每个都需要花费一定的时间原创 2021-04-04 20:20:04 · 171 阅读 · 0 评论 -
游戏设计模式与实现之:观察者模式 与 游戏事件系统 (非回调函数版本)
GoF说明:在对象之间建立一个一对多的链接方法,当一个对象发生改变时,其他关联的对象都会自动接收到通知模式说明:游戏中当某个公共的数据改变之后,通常很多需要显示的地方都要做出相应的改变。如果没有设计模式,我们是不是需要一个个的去通知,并且还需要做一下空判断,看所有需要通知的对象是不是已经在场景中了,这是不好的,数据发生改变,正确的做法时我们已经通知已经在场景中并且在关注这个数据的对象就可以了。这就是观察者模式的核心,为公共数据建立一个主题,所有想观察这个主题的对象把自己注册进这个主题。但主题发生改变时原创 2021-04-04 18:24:24 · 310 阅读 · 0 评论 -
游戏设计模式与实现之:策略模式 与 角色属性计算
GoF说明:定义一组算法并封装每个算法,让他们可以彼此互相使用。策略模式能让客户端在使用它们时更加独立。模式说明:当我们需要计算一样东西、但是计算过程会依赖外界的变化而变化时,我们就使用策略模式对算法进行封装。定义一个接收者,接收者持有一个算法供客户端对象调用,当外界发生改变时,我们改变接收者的算法。但是客户端调用的接口保持不变,这样开发的时候我们就能专注与不同算法的开发而不是调用流程的开发。三个重要对象:ConcreteStrategy:具体算法Strategy:持有一个算法,并提供接口为客户原创 2021-04-03 15:31:46 · 688 阅读 · 0 评论 -
游戏设计模式与实现之:备忘录模式 与 游戏数据版本管理
GoF说明:在不违反封装的原则下,获取一个对象的内部状态并保留在外部,让对象可以再日后回复之前保留的状态。模式说明:不违反封装,也就是开闭原则,但是又把内部细节暴漏出去并做修改,看似有些矛盾,备忘录模式却能做到不矛盾,先看一下备忘录模式的三个重要角色:记录拥有者(Originator):内部的全部数据就是需要被保存的数据,可以自动将内部数据通过生成Memento同步出来,也可以通过外部传入的Memento更新自身内部数据。内部数据可以通过get、set属性调用。记录保存者(Memento):用于作原创 2021-04-03 13:40:29 · 139 阅读 · 0 评论 -
游戏设计模式与实现之:建造者模式 与 角色组装
GoF说明:将一个复杂对象的构建流程与他的对象表现分离开来,让相同的构建流程可以产生不同的对象行为表现模式说明:当你需要一个从构建到行为都非常复杂的对象的时候,你肯定希望找到一个点,用这个点将这个对象的构建和行为区分开。大家可能第一就想到了工厂模式,是的,建造者主要服务于构建复杂的对象,而这个构建行为,通常是在工厂模式下完成的。有所不同的是:通过建造者模式我们可以让不同的角色构建更加灵活多变。案例说明:构建一个复杂的游戏角色1.功能需求:构建一个游戏角色,这个游戏角色包含属性、武器、以及所需的游戏原创 2021-04-02 16:30:28 · 370 阅读 · 0 评论 -
游戏设计模式与实现之:模版方法模式 与 流程管理
GoF说明:在一个操作方法中定义算法的流程,其中某些步骤由子类完成。模版方法模式让子类在不变更算法流程的情况下,能够自定义某些步骤的细节。模式说明:当项目中某个功能的流程是固定的,但是在不同的子类实现中又有区别。我们就可以定义模版方法模式,将功能指向的方法设置为sealed,不可被重写。将每个步骤都定义成一个protected级别,可供子类重写,但是不可被对象持有者调用。这样子类就可以自定义每个步骤的细节,以此满足不同的功能需求。案例说明:生成游戏物体1.需求分析:功能使用者只需要调用Born方法原创 2021-04-02 11:22:03 · 137 阅读 · 0 评论 -
游戏设计模式与实现之:桥接模式 与 装备适配
GoF说明:抽象与实现分离,使二者可以独立变化注:GoF的解释有点让人误解,这个说法难道不是 “只依赖接口而不依赖实现的” 的另一种说明,或者是进一步解释依赖倒置原则吗?我的理解:桥接模式是更高层次的、更复杂的、具有组合性质的抽象设计模式模式说明:当我们制作一个功能,这个功能是两个类群组中任意两个实现类组合起来完成的,这个时候我们就可以使用桥接模式对两个类群组的抽象基类进行组合,并实现功能。案例说明:开发游戏中人物手持武器进行攻击的行为1.需求说明:游戏内角色或者NPC都可以携带武器进行攻击原创 2021-04-02 00:11:44 · 277 阅读 · 1 评论 -
游戏设计模式与实现之:单例模式 与 单例模版
GoF解释:确保类只有一个实例对象,并提供一个全局方法去调用这个对象。模式说明:单例模式通常被使用于一些全局一定唯一的,只关心调用功能,而不关心这个从哪里生成的类,并且这个类通常不应该参与到实际游戏交互子系统的协同工作,负责的功能大量单一且需要统一调度。在项目中,符合这个需求的一般是工具类,如音效管理,UI管理,本地表数据读取等等。案例说明:音效管理,现有MusicManager类统一管理音效的播放1.不使用单例:每个对象都需要持有一个MusicManager对象,这个对象可以是自己New出来,也原创 2021-04-01 19:51:28 · 112 阅读 · 0 评论 -
游戏设计模式与实现之:外观模式 与 子系统管理
GoF解释:外观模式为子系统定义了一组统一的调用接口,这个接口会让子系统变得更加容易使用为什么用这个设计模式:当一个功能模块会调用多个子系统的时候应该怎么做?不用设计模式的情况下,我们需要持有或者访问这些子系统的实例对象或者单例对象,分别访问不同的系统,完成不同的功能。尤其是当一个功能需要调用不同的子系统的时候,代码操作会变得复杂。这违反了面向对象编程的一个特性:迪米特规则,程序解释是对于上层调用者而言,知道的细节越少越好。模式说明:隐藏功能调用所需要的子系统实现细节,提供一个简洁明了的接口供上层原创 2021-04-01 17:42:23 · 247 阅读 · 0 评论 -
Unity Shader 版本升级后:‘UnityObjectToClipPos‘: cannot implicitly convert from ‘float4x4‘ to ‘float4‘ 错误
Unity升级到5.6及以后,所有跟UNITY_MATRIX_MVP运算的矩阵或者向量的mul方法,会被自动转成UnityObjectToClipPos方法,如下RM假定是一个4x4的旋转矩阵,会被强转成初始我们是想获得一个4x4的带旋转的MVP变换矩阵,但是我们看一下UnityObjectToClipPos这个方法的实现返回的是一个float4的变量,这也就是我们主题中包含的错误,cannot implicitly convert from 'float4x4' to 'float原创 2021-01-19 11:27:59 · 7756 阅读 · 0 评论