: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。当场景中包含了大量对象时,这些操作就会非常耗时。一个极端的例子是,如果我们需要渲染一千个三角形,把它 ...
高级纹理
基础纹理:法线纹理、渐变纹理、遮罩纹理等。
高级纹理:CubeMap、Render Texture、Procedure Texture
CubeMap立方体纹理
在图形学中,立方体纹理是环境映射的一种实现方法。
立方体纹理采样
立方体纹理常常用于天空盒、环境映射。
TureShadow 和名称一样——真阴影
其作用就是为图像、文字添加阴影效果,通常我们使用Ps之类的软件为其添加阴影,现在使用这个插件就可以自动动态的实现阴影。
添加TureShadow脚本











