UnityShader的内置时间变量
序列帧动画
通过使用Time实现循环的特效播放。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374Shader "Unlit/Exp2Shader"{ Properties { _Color ("Color Tint",Color)=(1,1,1,1) _MainTex ("Texture", 2D) = "white" {} _HorizontalAmount("Horizontal Amount",Float)=4 _VerticalAmount("Vertical Amount",Floa ...
Unity Shader 第七章 基础纹理
纹理——使用一张图片来控制模型的外观,使用纹理映射技术把一张图黏在模型表面,逐纹素地控制模型的颜色。
通常使用纹理映射坐标对应纹理中的2D坐标,这被称为是UV坐标。
顶点UV坐标的范围通常被归一到[0,1]范围内。
DirectX 中原点位于左上角,OpenGL中原点位于左下角。
$\color{red}{Unity 使用的是OpenGL的坐标,即原点位于左下角}$
纹理采样123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityOb ...
对于Unity官方的TimeLine相必我们都很熟悉了,使用时间轴我们可以实现许多功能,这里推荐一款同样优秀的第三方TimeLine插件——SLATE。
快速食用
首先,让我们创建一个CuteScene,点击EDIT 打开编辑窗口。
相关链接
SLATE | Realtime Cinematic Sequencer for Unity (paradoxnotion.com)
ParadoxNotion-Slate学习笔记与拓展计划 | 烟雨迷离半世殇的成长之路 (lfzxb.top)
:dash: 每朵云都下落不明,每盏月亮都不知所踪。
按照传统程序员思维来开发游戏或许并不那么合适。从大一开始接触程序设计时,老师让我们学习编程思维。
所谓编程思维,也就是将一个复杂问题进行拆解,然后按部就班的去完成的能力。
对于大多数程序开发来说,这种思维确实是至关重要的,可以公式化处理问题,但在需求多变的游戏开发中,很难做到公式化处理。
是否过分重视框架式设计
++过早优化是大忌,对于游戏开发来说这一点尤为明显。++
有一些水平的程序员总是期望自己写出优雅的代码:逻辑清晰、结构稳定、高效复用。
然而在实际开发时,往往我们很难一次性就处理好软件之间的结构和复杂逻辑,我们需要一边实践一边证明自己的想法是否可行,并不断修正直到自己觉得满意。
有时我们为了写出完美的代码而花费许多时间和精力,也许此时看来完美的代码在反而制约了你新功能的实现,在我们没有确定需求时不要过早过度的优化程序。
算法——解决问题的有限步骤,我们习惯按部就班的完成任务,这显得逻辑清晰。
在一开始我们就试图搭建一个完美的框架,考虑性能高效、逻辑严密,作为商业游戏这是没问题的,但作为独立游戏这往往制约了游戏的完成 ...
:bookmark:快速食用在场景中创建一个空物体,并挂载如下几个脚本。
网络管理器
其中,需要指定Player Prefab,勾选自动生成玩家可以在连接到服务器时,自动生成玩家对象。
玩家为玩家添加如下组件:
Network Identity 表示这是一个需要进行网络同步的物体。
NetWork Transform 表示可同步Transfrom
PS:注意勾选认证,让玩家只能控制自己的物体
玩家控制脚本12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970using System;using System.Collections;using System.Collections.Generic;using Mirror;using UniRx;using UnityEngine;Qpublic class PlayerCtr : NetworkBehaviour ...
IOC 控制反转
IOC 提供一个对象生成容器,在我们需要取得某个对象时,不再使用New关键字进行对象生成操作,而是通过IOC容器内部控制来获得对象。
使用这种思想方式,可以让我们无需关心对象的生成方式,只需要告诉容器我需要xxx对象即可,而高旭容器我需要xxx对象的方式就叫做DI依赖注入。
DI依赖注入这种思想,我是在学习.net core时发现的,一般采用特性注入或者使用构造函数注入。
经过标记的字段会在该类构造时在IOC容器中执行构造获取对应的对象示例。
VContainerVContainer是在Unity端使用的一种轻量级的DI框架,通过GameLifeScope划分作用域,和普通的web后端的Di框架不同的是,针对Unity的Mono特殊性,提出了GameLifeScope的方式,通过在Game Object上挂载Scope,可以在代码中动态切换使用的实例和Scope。并且提供了一种父子继承Scope方式供用户使用。
Scope 作用域
作用域指函数、变量的作用范围,在Di中一般可以注册singleton单例,Trans复例等
在netcore中有类似下面这样的形式:
...
UniRx 初体验
链式编程
所谓链式编程——使用. . . 像是链条一样进行编程。
:bookmark: 下面是一个延迟调用的示例:
1234567891011121314151617public class UniRxTest : MonoBehaviour{ private void Start() { Debug.Log("开始时间:"+Time.realtimeSinceStartup); Observable.Timer(TimeSpan.FromSeconds(2)).Subscribe((x) => { Debug.Log("现在时间:" + Time.realtimeSinceStartup); }).AddTo(this); Observable.EveryUpdate().Where(_ => Input.GetKeyDown(KeyCode.A)).Subscribe(_ => & ...
PolygonCollider2DPolygonCollider2D是Unity用于多边形检测的组件,可以进行不规则UI、2d对象的射线检测。
为UI对象添加如下脚本:
1234567891011121314151617181920212223public class CustomImage : Image{ private PolygonCollider2D _polygon; private PolygonCollider2D Polygon { get { if (_polygon == null) _polygon = GetComponent<PolygonCollider2D>(); return _polygon; } } public override bool IsRaycastLocationValid(Vector2 screenPoint, C ...
Unity Ui
UnreadUnity Ui 合批学习Stats 统计面板
stats面板可以展示摄像机范围内,所有游戏对象元素的顶点、面片、批处理次数、CPU耗时等。
参数
说明
备注
tris
三角形面数
verts
顶点数
Batches
批处理个数
Saved By batching
批处理被合并后的批处理个数
实际执行的批处理个数Draw Call
CPU
cpu执行耗时
FPS
时间段执行次数
流畅度
天空盒子
新建一个场景发现,有1.7k的三角和5k的顶点。
++ 这些顶点和三角面其实来源于天空盒,天空盒也是一个模型。 ++
修改为适用纯色背景:
可以看到此时,降低到了2个三角面和4个顶点。如下图所示的分割情况.
批处理
我们最常看到的优化技术大概就是批处理了。批处理的实现原理就是为了减少每一帧需要的draw call数目。为了把一个对象渲染到屏幕上,CPU需要检查哪些光源影响了该物体,绑定Shader 被设置它的参数,再把渲染纹理发送给GPU。当场景中包含了大量对象时,这些操作就会非常耗时。一个极端的例子是,如果我们需要渲染一千个三角形,把它 ...











