自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

布衣大侠的博客

记录在工作学习中的一些知识点

  • 博客(72)
  • 资源 (3)
  • 收藏
  • 关注

原创 Unity 通用框架搭建(十)——使用Xlua热更新

前言热更新,是游戏开发中十分重要的一个环节。热更新,指用户不重启应用的前提下能实现代码逻辑的更新。因此,本文主要介绍腾讯开源的热更新方案Xlua的使用,以及在项目框架中对Xlua进行支持。Xlua 教程Lua代码的本质实际上是一个字符串,Xlua插件让系统能够去执行这段代码并且和C#之间能够相互通信。1、加载Lua文件对Unity游戏而言,可以通过资源加载的方式加载TextAsset资源后执行lua代码: public void DoScript(string luaName) {

2021-08-24 15:05:01 1728 4

原创 Lua——基础语法整理学习

前言游戏开发中更新活动、公告以及一些功能某块,为了保证用户体验,通常小版本跟新会采用热更新的方式,即玩家再游戏内既可实现更新无需每次都前往应用商店进行更新。在实际开发中Lua是采用的最多的解决方案,本文主要介绍基础的Lua的基础知识。Lua变量类型Lua 是动态类型语言,变量不需要定义类型,只需要为变量赋值。Lua会根据变量赋的值来确定类型。在Lua语言中,变 量类型包括以下几种类型。number:小数类型,在Lua中没有整数类型,所有的数字类型都属于小数类型。string:字符串类型,字符

2021-08-16 17:08:09 2997

原创 Unity通用框架搭建(九)—— UI交互设计之动态层级刷新

前言前面的文章讲述了关于Unity下资源的打包、加载以及打包工具的设计。从本文开始介绍UI的交互设计。游戏开发中存在很多的UI界面,虽然UGUI本身通过UI节点的位置对显示层级做了处理,但是实际开发中存在部分界面内还存在3D模型的展示、特效的展示,如果设计不当就会存在特效显示穿透的问题,开关界面是遮挡问题。本文就结合之前基于Addressable的资源加载,缓存池等来构建UI界面交互逻辑。本文主要介绍UI窗口的层级控制,程序设计思路UI交互部分核心的设计理念:动态的刷新UI、特效等层级。保证每一层之间

2021-08-13 17:40:19 1795 1

原创 Unity通用框架搭建(八)—— 消息事件封装

在游戏开发中,消息事件通过委托实现。实际开发中,经常会遇到界面之间、玩家之间的相互通信。本文实现的消息事件封装采用的时监听和分发机制,它主要运用在逻辑判断,减少程序之间的耦合度,而且使用起来非常方便。监听服务器消息也可以运用事件监听机制,收到服务器的信息之后可以执行某个事件。曾经维护过一个项目的网络通信相关逻辑全都写在NetManger中,到后期这个脚本一万多行,维护十分困难。合理的框架结构能够帮助我们降低程序的耦合性,使代码易于维护更新。第一版不定参数设计利用不定参params object[] ar

2021-08-12 17:09:28 931

原创 Unity通用框架搭建(七)——基于Addressable加载/缓存池的同步重构

前言前面几篇文章介绍了Addressable的资源加载以及缓存池的设计。彼时是将项目中的设计理念记录下来,设计时Addressable还尚未给出同步的设计方法。虽然Addressable用法简单,但是因为异步的原因导致项目中使用了大量回调委托,一度使项目的维护修改变的及其困难,好在Unity很快给出了同步方法的设计方案,因为在重新整理代码时,将这部分逻辑采用同步的方法进行重构。设计思路Unity的资源加载统分两类资源加载,一类为复制类型资源加载(Gameobject类型),另外一类时引用类型资源加载

2021-08-03 17:39:44 4868 5

原创 Unity通用框架搭建(六)——基于Addressable一键打包工具优化

前言在Addressable一键打包工具一文中写了一键打包的设计思路和实现,但是由于当时当时只管堆功能,导致所有核心代码都在一处,导致后期代码维护困难。后期又因为商务需求,涉及部分资源打包,原有的结构不能支持,因为对其进行了优化重构。选择指定路径的资源第一版资源设计时,默认全选,优化时提供可以选择的路径,打包资源时只打包自定路径的资源。(即只标记指定路径的资源)拖动指定路径的文件夹到触碰区域,自动获取资源路径地址 GUILayout.Label("设置打包资源"); for (i

2021-07-29 11:57:42 2468 6

原创 JavaScript学习 —— 基础知识

JavaScript 输出(显示数据)使用window.alert():弹出警告框使用document.write():将方法内容写到HTML文档中使用innerHTML写入到HTML元素使用console.log():写入到浏览器的控制台JavaScript 字符串使用单引号或双引号来定义一个创建一个原始字符串 如:var name="Freecy;",也可以通过new关键字将字...

2021-06-24 10:38:56 125

原创 JavaScript学习 —— 函数

函数定义JavaScript使用关键字function定义函数,函数可以通过声明定义,也可以是一个表达式。function myFunction(a,b){ return a*b;}JavaScript函数可以通过一个表达式定义:var add=function(a,b){ return a+b};var x=add(3,4);以上函数表达式存储在变量后,变量也可作为一...

2021-06-24 10:38:17 136

原创 LayaAir demo 学习3D弹力球简单实现

公司要开始做小游戏了,经过研究讨论之后决定采用Laya作为开发引擎,本身是做Unity3D开发的,学习成本很低,Laya的编程方式和Unity很相似,对Unity开发人员来说没有什么难度,从这篇文章开始就记录一下学习以Laya制作demo使用Unity导出资源加载Scene场景让柱子跟随手指转动起来小球下落穿过空白加分碰到红色区域死亡增强体验添加无敌模式...

2021-06-24 10:32:03 1008 4

原创 微信小程序简单入门

为了业务流水,公司也开始做一些小程序/小游戏的项目。因为要的急切,赶鸭子上架学习了一下,简单记录一下小程序新的体会。总的来说小程序的开发难度不算特别大,熟悉了样式文件和布局之后,还是能弄个像样的小程序出来。小程序结构小程序的文件结构总提来说分为页面,组件,资源,和工具类等等。设计时每个页面的显示只能从当前页面对应的数据块刷新显示。每个页面/组件包含4个文件,分别对应代码逻辑、配置、显示以及样式文件。小程序的基础组件的使用参考官方文档小程序基本使用小程序下方导航栏,TabBar在app.jso

2021-06-23 15:17:59 183 1

原创 Unity——主角移动与摄像机跟随

在游戏开发中,主角需要通过跑地图来通关升级,本章主要介绍主角的移动和摄像跟随的操作。主角移动角色位移通过主角的骨骼动画控制(后续文章会详细介绍状态机的使用),这里只需要勾选Animator动画控制器下Apply Root Motion让角色的移动受动画控制。通过碰撞检测来判断哪些位置主角可以移动,哪些位置角色不能行走,这里需要两个组件Rigidbody刚体,和Collider碰撞组件Rigidbody:为游戏赋予物理属性,在游戏中只有添加了刚体的物体才能模拟物理属性,如重力等。如上图

2021-03-08 10:26:39 953

原创 游戏开发组件——delegate事件监听

在实际的开发过程中经常遇到这样一个问题:游戏的很多个界面同时开着的,这些界面又共享一部分数据信息,需要实时的动态的刷新这些数据信息。设计思路:构造全局的事件监听器,在每个界面打开时做好相应数据的监听事件,当数据发生改变时只需要派发相应的事件即可。using System.Collections.Generic;public delegate void GameEventHandler(params object[] args);public class GlobalEvent{ ///

2021-03-04 15:08:51 330 1

原创 Unity 简单实例——聊天室功能

简单聊天室功能,客户端发送消息后,服务器接收到消息后分发到其它客户端上并显示聊天内容聊天室服务器服务器需要有以下几个步骤1、确定Socket协议类型(采用TCP协议或者UDP协议)2、绑定服务器的IP地址和端口号3、设置最大监听数量4、等到连接并处理消息由于服务器属于一对多的处理关系,因为我们需要用线程来监听消息: class Client { private Socket clientSocket; private Thread t;

2021-03-02 10:43:46 1004

原创 C# 学习——反射和特性

反射程序在运行时,可以查看其它程序集或者本身的元数据的行为叫做反射。BCL声明了一个叫做Type的抽象类,它被设计用来包含类型的特性。使用这个类的对象能让我们获取程序使用的类型信息。以下是System.Type类部分成员信息Name:返回类型的名字NameSpace:返回包含类型声明的命名空间Assembly:放回声明类型的程序集Assembly.FullName:获取程序集的全名GetTypes():获取程序集中定义的类型GetCustomAttributes():获取特性

2021-02-23 17:09:10 285

原创 C# 学习——LINQ 查询

标题

2021-02-23 14:46:02 1075

原创 C# 学习 ——正则表达式

正则表达式概念英文Regular Expression 是计算机科学的一个重要概念,使用一种数学算法来解决计算机程序中的文本检索,匹配等问题。主要用于解决下面的问题:1、检索:通过正则表达式,从字符串中获取我们想要的部分2、判断给定的字符串是否符合正则表达式的过滤逻辑,可以认为正则表达式表述了一个字符串的书写规则在C#中位于命名空间System.Text.RegularExpressions下定位元字符^ :匹配必须出现在字符串的开头或者行的开头$ :匹配必须出现在以下的位置:字符串结尾、字

2021-02-19 16:38:31 228

原创 Python学习 ——文件(持久化)和异常

文件长久保存信息的一种数据集合,常用操作:1、打开,关闭文件;2、读写3、查找Open函数负责打开一个文件,带有很多参数open(),第一参数必须有,文件的路径和名称mode:表明文件的打开方式-r:只读-w:写方式打开,会覆盖以前的内容-x: 创建的方式打开,如果文件存在会报错-a:append,以追加的方式对文件的内容进行写入- b:binary,二进制方式写入- ...

2021-01-18 16:44:07 258

原创 Python学习 —— Python的基础知识

Python中可以自定义数据类型。系统默认提供6个标准数据类型。在Python的数据类型中不需要像C/C++那样提前定义好数据类型,Python中根据赋值的数据类型来确定变量的数据类型。可以使用type()函数来检测变量的数据类型。Number (数值)整数a=1000此处a就是整型数据浮点数a=3.1415926此处a是浮点型数据复数由实数和虚数两部分组成,如:163+2j布尔...

2021-01-14 17:15:09 254 1

原创 Unity通用框架搭建(五)——基于Addressable一键打包工具

分组策略游戏的资源类型大致分为:全局资源:图集、贴图、配置表、字体、音频等。使用频繁,多处使用。关卡资源:指定场景下使用的资源。特定关卡下使用的资源。使用频率低,甚至需要游戏等级达到一定等级之后才能使用。根据Addressable系统的特性,我们大致可以将游戏的资源文件分两类:Local:本地资源,资源随安装包发布。Remoted:远程资源,当用户需要使用的时候在下载使用。(Addressable会自动检查,如果本地已有最新资源,则不会下载) 本文主要记录,如果自动化分组标记资源

2021-01-12 16:56:39 7675 6

原创 数据结构学习 —— 二叉树(二叉排序、AVL平衡二叉树C#实现)

二叉树每个节点最多有两颗子数;左右子树有序,不能颠倒即使某个节点中只有一颗子树,也要区分是左右;如上图所示:节点C是节点A的右子树,节点F是节点C的右子树。特殊的二叉树:1、斜树:所有节点都只有左子节点或都只有右子节点2、满二叉树:在一颗二叉树中,所有的分支节点都存在左子树和右子树,并且所有叶子节点都在同一层,这样的二叉树称为满二叉树。3、完全二叉树:对一颗具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的节点同样深度的满二叉树中编号为i的节点在二叉树中的位置完

2021-01-07 15:45:22 295

原创 经典算法学习——串的模式匹配

在刷题时有一道很经典的题型:从输入的字符串中,找出给定的子字符串的位置。列如:在字符串 “god is good” 中找出 “good” 的位置。暴力循环——朴素的模式匹配算法不考虑任何优化和性能,我们直接挨个遍历主串和子串(双重循环),依次检查每个字符是否相等,只要输入正确,就一定能检查。...

2020-12-28 17:27:20 406

原创 Unity通用框架搭建(四)—— 缓存池设计

前面一文基于Addressable的资源加载更新记录了资源的加载,本文将紧贴资源的加载,结合设计模式中的享元模式的理念设计对象缓存池,避免在游戏过程中频繁的进行创建和销毁的工作。缓存池...

2020-12-21 16:08:53 1366 3

原创 Unity通用框架搭建(三)—— 基于Addressable资源加载更新

前一篇文章记录了Addressable可寻址地址系统的一些基本概念和基本用法,本章将会记录一套基于Addressable的资源加载卸载。结合前面学习的享元模式的理念,也会设计缓存池的相关逻辑。如上图所示,整套流程主要分为两大部分:资源加载部分和缓存池设计部分。资源加载AddressableManager通过单例模式,将各种类型的加载、下载以及卸载入口都放入统一的入口处。public void LoadAsset<T>(string address, System.Action<T

2020-12-17 16:53:44 5482 5

原创 Unity通用框架搭建(二)——基于可寻址地址系统的资源加载

可寻址地址资源系统

2020-12-15 11:01:07 2158 2

原创 Unity通用框架搭建(一)—— Scheduler 定时器

本人是从事Unity客户端开发工作的,从本文开始将会记录一些在实际项目中用到的一些通用框架和功能组件,整理完善一套比较适用的基础框架(最近有空闲时间,将以前的项目的代码重构一下,如有不合适的地方请大神们多多指教)Single单例之前在设计模式的学习中学习了单例模式,在实际开发中,我们也将经常访问一些全局唯一的数据或者某些操作的入口都是固定的。结合C#的泛型,我们可以设计泛型单例,让其子类直接能够实现单例模式,而不是每一块单例类都需要重新定义。考虑可能会存在一些初始化的情况,因此设计一个IManage

2020-12-09 10:31:55 1425 1

原创 设计模式学习汇总

创建型模式抽象工厂:提供一个创建一系列或相关依赖对象的接口,而无需指定具体的类建造者:将一个复杂对象的构建与表现分离,使得同样的构建过程可以穿件不同的表示。工厂方法原型...

2020-12-07 17:08:08 95

原创 设计模式(十六)——缓存池:享元模式

享元模式享元模式(Flyweight Pattern):主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它减少对象数量,从而改善所需要的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新的对象。根据实际开发经验来理解享元模式其本质就是对象缓存池。通过缓存池复用来减少动态创建对象的数量以及次数。(后续代码重构的时候会记录实际用例,这里不再介绍缓存池的实例)几种“共享”设计模式的区别原型模式:使用原型实例指定创建对象的种类,然后通过

2020-12-07 15:41:44 417

原创 设计模式(十五)——多“类”通信:中介者模式

中介者模式中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。用来降低多个对象和类之间通信复杂性。优点:降低类的复杂度,将一对多的关系转化成一对一关系。将各类之间解耦缺点:使用中介者到后期会十分庞大,变得复杂,维护难度会巨增使用场景:当系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系混乱难以复用其对象。想通过一个中间类来封装多个类的行为,而又不想生成太多子类的时候可以考虑采用中介者模式。示例利用群聊来展示中介者模式的简单使用:类结构设计如下:代码逻辑如下:

2020-12-03 16:58:06 199

原创 设计模式(十四)——自动更新:观察者模式

观察者模式观察者模式又叫做发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。典型案例:游戏开发中,会有多种使用金币,展示金币的地方。当使用或获得金币后需要通知所有展示的界面刷新当前最新的金币信息。简单的观察者模式类结构图如下所示:通过GoldSubject通知改变,让所有监听者自动刷新,在游戏设计中多处界面用到相同数据时,比较适合使用观察者模式。 public abstract

2020-12-01 16:57:06 360

原创 设计模式(十三)—— 模块化建设:建造者模式;做好备份:备忘录模式

建造者模式建造者模式(Builder Pattern) 使用多个简单的对象一步一步构建一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。通俗的来讲就是讲一个复杂的对象的创建,拆分为若干子过程。在一些零部件基本不发生变化,但是组合经常发生变化的时候考虑使用建造者模式使用建造者模式,独立的建造者相对独立,易于扩展,便于控制细节风险使用建造者模式,产品需要有共同点,范围使用有限制。如果内部变化复杂,会有很多建造者类列如:1、游戏玩家的装备:武器、技能、皮肤、外观模型

2020-11-26 09:59:24 126

原创 设计模式(十二)——抽象现实分离:桥接模式

桥接模式桥接模式(Bridge):官宣是用于把抽象化与实现化解耦,使得二者可以独立变化。属于结构型模式,它通过提供抽象化和实现化之间的桥接结构来实现二者的解耦。其实通俗的理解来说就是基类A包含B接口,但是B接口不属于基类A,但是通过B接口,可以扩展衍生很多不用的方法。A类和继承自A的派生类都可以很容易的通过B的接口来实现不同的功能表现。虽然Play,和Stop需要执行DoAction方法,但是将DoAction做成接口,后期扩展时只需要添加相应的DO的类就可以实现不同的功能方法。如果变化情况多,采用原

2020-11-25 16:21:17 300

原创 设计模式(十一)——树形结构:组合模式

组合模式组合模式(Composite Pattern),又称之为部分整体模式。将对象组合成树形结果以表示“部分-整体”的层次结果。组合模式使得用户对单个对象的组合对象具有一致性。当需求中国是提现部分与整体层次的结构是,以及希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑组合模式了。...

2020-11-25 11:04:20 1185

原创 算法学习 —— N*N型螺旋矩阵输出

刷LeetCode题时做到的一到题(曾经面试一家大型互联网公司时遇到过),给定数N,输出他的螺旋矩阵,列如:如:NUM=3 NUM=401 08 07 01 12 11 1002 08 06 02 13 16 0903 04 05 03 14 15 08 04 05 06 07其实这道题如果准确的发现了螺旋矩阵的规律问题也就迎刃而解了,找到关键的拐点,按照螺旋的顺序依次将二维数组中的值填

2020-11-24 11:11:05 1711

原创 设计模式(十)—— 且听号令:命令模式

命令模式命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传递给调用对象。调用对象寻找可以处理改命令的合适对象,并把改命令传给相应的对象,该对象执行命令。优点:降低系统耦合度,新的命令可以很容易的添加到系统中缺点:使用命令模式可能会导致某些系统有过多的具体命令类以下是命令模式的一个简单示例: public interface ICommand { void Execute(); }

2020-11-23 16:50:14 87

原创 设计模式(九)——全局唯一:单例模式

单例模式单例模式:保证一个类有且仅有一个实例,并提供一个访问它的全局点在内存中只有一个实例,减少内存的开销,尤其是频繁的创建和销毁实例避免对资源的多重占用一个类只关心内部逻辑,并不关心如何实例化 class Singleton<T> where T:new () { private static T instance; public static T Instance { get

2020-11-23 15:42:05 255

原创 设计模式(八)—— 兼容适配:适配器模式

适配器模式适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容不能一起工作的那些类可以一起工作。适配器模式主要解决在软件系统中,常常要将一些现存的对象放到新的环境中,而新环境的接口是现对象不能满足的。可以让任何没有关联的类一起运行,提高复用性,灵活性好。过多的使用适配器模式会让系统非常凌乱,不易整体把握,后期维护困难。适配器模式大多用于软件开发后期,为了兼容就版本时使用适配器模式的本质就是通过为不同类添加相同的接口,来达到统一的目的。此处不做详细的

2020-11-23 15:05:37 458

原创 设计模式(七)—— 状态切换:状态模式

状态模式状态模式(State Pattern),类的行为是基于它的状态改变的,状态模式主要解决的是当控制一个对象的条件表达式过于复杂的情况。把状态的判断逻辑装移到表示不同的一系列类当中,可以把复杂的判断逻辑简化。状态模式的好处是将特定的状态相关的行为局部化,并且将不同状态的行为分割开来。将特定行为的状态相关都放入一个对象中,由于所有的状态相关的代码都存在于某个ConcretaState,所以通过定义新的子类可以很容易地增加新的状态和转换。通俗来讲,状态模式就是为了消除庞大的条件分支语句。当一个对象的

2020-11-23 10:41:12 1391

原创 设计模式(六)—— 模板方法模式,外观模式

模板模式模板方法模式(Template Pattern)是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使用子类可以不改变一个算法的结构即可重定义该算的某些特定步骤。模板方法模式是通过把不变的行为搬移到超类,去除子类中的重复代码来提现它的优势。模板方式模式提供了一个很好的代码复用平台。在虚拟基类中定义好一系列的动作,在子类中进行实现: public abstract class MyGame { public abstract void Init();

2020-11-19 15:38:15 225 1

原创 设计模式(五)——拷贝复制:原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。其实所谓的原型模式本质上是在勒种预留的对对象的复制接口。对于一些初始化信息发生变化不大的情况下,可以采用Clone的方式创建对象,不用每次都是重新初始化对象。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。浅拷贝在.Net中,System命名空间中提供了I

2020-11-18 17:27:05 572

原创 设计模式(四)—— 代理访问控制:代理模式

在面向对象的编程中,由于某些原因(安全控制,核心保护等),或者直接访问对象时会给使用者或系统带来很多麻烦,这时需要为对象提供一种代理来控制对该对象的访问,这种结构型模式就属于代理模式代理模式使用代理模式职责清晰,扩展性高。但是由于增加了代理对象,因此有些类型的代理模式可能会造成请求的速度变慢。部分代理实现的过程可能相对比较复杂。上图为简易的代理模式设计图,用代理类ProxyPrivilege来实际控制RootPrivilege对象,程序设计时可以将有限的接口暴露出来使用扩展,而不影响原有的RootP

2020-11-18 15:18:07 264

LayaDemo.zip

Laya 3D弹力球 Laya工程 引擎版本2.12

2021-06-24

基于Addressable可寻址地址系统一键打包工具

根据Unity新推出的Addressable可寻址地址系统,设计的一键出包(Android直接导出APK,IOS可以导出Xcode工程)

2021-01-12

Scheduler 源代码

基于Parallel并行运算的游戏定时器设计的核心代码,仅记录自己学习的资料,需要Unity2018之后的版本

2019-02-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除