写在前面
在游戏存储中我们可以使用多种方法,json、二进制、xml、csv、excel、或者是文本、自定义格式等等。使用这些的时候我们基本都需要将文件整个读入内存中,那有没有一种办法可以不用将所有数据载入内存呢?
答案就是————使用++数据库++。
数据库的种类很多,大都都服务于网络服务,在单机游戏中使用数据库的话,可以选择sqllite。
SqlLite
sqllite是一种轻量的文件型数据库,整个数据库只有一个.db文件而且其使用范围非常广,支持的平台多,是我们在使用Unity开发单机游戏时的好选择。
快速食用
要使用SqlLite,我们至少需要导入:
sqllte3.dll
Mono.Data.Sqllite.dll
在这里我们额外导入Dapper作为Orm方便我们对数据进行curd:
Dapper.dll
Dapper.Contrib.dll
Mono.Data.Sqlite.dll
创建数据表
首先我们创建一个数据表的模型类User如下:
在类名上标注表的名称,++这个名称需要和db文件中的数据表名称对应++。
12345678910111213141516171 ...
通知系统在各种各样的游戏、应用中都有。
相信大家都看过win10的通知消息,在游戏中,我们获得xx道具、达成xx成就、或是做了xx事情需要通知给玩家,这些都可以看作是通知。
通知系统的特点
通知系统具备以下特点:
时效性: 每一个通知就像一条讯息,存在存活时间,死亡后就应该从屏幕空间消失。
排列性:按照先来先服务原则,很有可能上一条讯息还处于存活时间,就来了很多条新讯息,此时新讯息不应该抢占当前讯息的存活时间,而是在等待讯息死亡后再按照排列进行数据显示。
置顶性:通知系统应该具备较高的显示优先级,即不该被基础元素遮挡。
显示层:以上几点均为逻辑设计,一般来说,通知系统显示新消息时会将旧消息顶上去。
依据以上特点我们可以这样考虑:
时效性
自消息显示时开始记录时效,在指定时间后 杀死消息。
排列性
遵循先来先服务的原则,我们可以使用一个队列结构对等待消息进行缓存。在显示消息时将消息从队列中移除。
置顶性
写在前面
接触过web前端的人,应该都知道网页 以Html+Css+Js的形式构成,这种高度灵活的方式一直延续至今。当然后续推出了如Vue、Rective等前端框架和Thymeleaf、Asp等模板引擎。。。扯远了…
总之,我们可以借鉴Web的做法,使用类似的结构去编写Unity Ui,如Unity 的新UI系统 UIElement(UiToolkit)也是这么做的。此文并不想介绍UIElement,因为通过作者实际使用体验来说,UIElement还有很多路要走,可能在制作编辑器领域可以打破原先Gui的桎梏,然而在运行时下的UI,MarkLight 则舒服许多。
关于MarkLight
在Ui框架的领域中一直流行MVVM的设计,M 模型 V 视图 VM 视图模型 通过三者的配合,可以将表现层与逻辑层相分离,有利于解除耦合。MarkLight 同样是使用了这一套设计方案,通过Xml文件编写View,配合ViewModel的C#文件进行控制。同时吸纳了Html的优点,使用类Css的Xml文件可以对控件进行统一的样式配置,这让换肤和界面规范统一变得十分容易。
快速食用
首先我们可以通过包 ...
一个简单树12345class Item{ public string Name { get; set; } public List<Item> Items { get; set; } = new List<Item>();}
基础数据12345678910111213var aa = new List<Item>();var a = new Item() { Name = "A" };var b = new Item() { Name = "B" };var c = new Item() { Name = "C" };var d = new Item() { Name = "D" };var e = new Item() { Name = "E" };a.Items.Add(new ...
坐标转换
已知云端坐标点A(10,10),需要转换到本地坐标轴下的位置 B?
可能的问题
坐标平移
坐标旋转
参考
Unity 不同空间坐标转换中的矩阵应用_心之凌儿的博客-CSDN博客_unity 空间变换
Unity中内置转换
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103using UnityEngine; /// <summary>/// 坐标转换工具类/// </summary>public static class CTUtils{ /// <summary> /// 世界坐标转屏幕坐标 /// </summary> public st ...
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",Fl ...
Unity Shader 第七章 基础纹理
纹理——使用一张图片来控制模型的外观,使用纹理映射技术把一张图黏在模型表面,逐纹素地控制模型的颜色。
通常使用纹理映射坐标对应纹理中的2D坐标,这被称为是UV坐标。
顶点UV坐标的范围通常被归一到[0,1]范围内。
DirectX 中原点位于左上角,OpenGL中原点位于左下角。
$\color{red}{Unity 使用的是OpenGL的坐标,即原点位于左下角}$
纹理采样
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'Unity ...
对于Unity官方的TimeLine相必我们都很熟悉了,使用时间轴我们可以实现许多功能,这里推荐一款同样优秀的第三方TimeLine插件——SLATE。
快速食用
首先,让我们创建一个CuteScene,点击EDIT 打开编辑窗口。
相关链接
SLATE | Realtime Cinematic Sequencer for Unity (paradoxnotion.com)
ParadoxNotion-Slate学习笔记与拓展计划 | 烟雨迷离半世殇的成长之路 (lfzxb.top)
💨 每朵云都下落不明,每盏月亮都不知所踪。
按照传统程序员思维来开发游戏或许并不那么合适。
从大一开始接触程序设计时,老师让我们学习编程思维。
所谓编程思维,也就是将一个复杂问题进行拆解,然后按部就班的去完成的能力。
对于大多数程序开发来说,这种思维确实是至关重要的,可以公式化处理问题,但在需求多变的游戏开发中,很难做到公式化处理。
是否过分重视框架式设计
++过早优化是大忌,对于游戏开发来说这一点尤为明显。++
有一些水平的程序员总是期望自己写出优雅的代码:逻辑清晰、结构稳定、高效复用。
然而在实际开发时,往往我们很难一次性就处理好软件之间的结构和复杂逻辑,我们需要一边实践一边证明自己的想法是否可行,并不断修正直到自己觉得满意。
有时我们为了写出完美的代码而花费许多时间和精力,也许此时看来完美的代码在反而制约了你新功能的实现,在我们没有确定需求时不要过早过度的优化程序。
算法——解决问题的有限步骤,我们习惯按部就班的完成任务,这显得逻辑清晰。
在一开始我们就试图搭建一个完美的框架,考虑性能高效、逻辑严密,作为商业游戏这是没问题的,但作为独立游戏这往往制约了游戏的完成。
...











