-
scriptObject创建模板的用法
scriptObject可以用来存储游戏数据,以此建立一个模板,然后调整不同的参数值,就可以生成多种不同的物品了。GunTemplate 继承于ScriptObjectusing UnityEngine;using UnityEditor;using System.IO;public class GunGenerator{ [MenuItem("Tools/GenerateGun")] public static void GenerateGun() { v...…
-
如何在编辑器中画出矩形
在做道具配置的时候,想要实现在编辑器内有一个和摄像机可视范围同样大小的矩形框,用来告诉我道具放置的边界在哪里,于是想要实现在scene窗口画矩形的一个效果,Unity的Gizmo可以实现类似的效果。using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEditor;public class ItemGroupGenerator{ //ItemGroup是一个空的Mo...…
-
CRC校验原理
CRC校验用于检验数据传输过程中数据是否有错误。CRC的错误检测能力依赖于关键多项式的阶次以及所使用的特定关键多项式。误码多项式E(x)是接收到的消息码字与正确消息码字的异或结果。当且仅当误码多项式能够被CRC多项式整除的时候CRC算法无法检查到错误。我们传输的信息都可以通过二进制来表示,假设我们传输的信息为1010011,该二进制同时可以用多项式来表示,1010011可以表示为 x^6 + x^4 + x^1 + x^0,该多项式表示对应的二进制码一共6位,第0位,第1位,第4位,第6位...…
-
利用Projector实现伪动态阴影
传统的阴影实现方法是基于ShadowMap的原理,ShadowMap是以光源为视角,先渲染一张深度图缓存起来,记录下物体在光源空间的深度,然后在实际的渲染过程中,将接受阴影的物体的转换到光源空间之后的深度与深度图作比较,如果比深度图要深,则该点处于阴影之中。Unity自带的阴影在某些手机上存在硬件不支持的情况,另一种实现阴影的方式可以通过Projector+RenderTexture来实现。我们通过在projector上挂载阴影相机,将相机渲染到RenderTexture上,再将Rende...…
-
无限滚动列表和自动吸附
今天在做项目的时候,遇到一个问题,就是当数据量有成千上万行的时候,想要通过滚动列表实现的时候,不可能去实例化成千上万个Cell,这样对内存和效率都是暴击。那么唯一能做的就是把有限个Item在列表里不停的重复使用,来实现无限滚动。NGUI下的滚动列表是用scrollview加grid或者table来实现的,在滑动列表的时候,grid是没有位移的,发生位移的是scrollview本身。grid底下的cell是按照CellWidth或者CellHeight来进行排序的。比如说我设置grid只有1...…
-
2017小记
又到了每年一记得时候了,丢三落四的毛病还是没有改掉,去年的年终总结已经不记得扔到哪去了,从今年起,都保留下来吧,毕竟也想过了要孩子的问题,转眼间,自己也是这般年纪了,偏偏恰逢此刻,朋友圈还掀起了一波秀18岁照片的浪潮,哈哈,真希望自己永远18岁。12月25日,忙活了近2年的游戏终于上线啦,首日新增人数18000人,服务器宕机3小时,渠道差评一片,商务同学们忙着刷评论,服务器同学忙着改bug,美术同学忙着新版本,最终在游戏上线3天后,公司决定裁掉大部分美术和商务,祝愿没能留在公司的同事们在2...…
-
游戏里的帧同步机制
游戏同步机制在多人对战的游戏中,游戏的每一方客户端需要保持每一个时刻大家的数据是一致的,常见的同步方式分为帧同步和状态同步,帧同步服务器不需要知道游戏逻辑,只是将客户端的操作进行转发,然后客户端自己计算逻辑,状态同步是服务器计算游戏逻辑,并将角色状态返回给客户端,客户端直接使用服务器返回的状态即可。常见的RTS,Moba一般是帧同步,mmorpg一般是状态同步。帧同步的概念总所周知,游戏是一帧一帧渲染在屏幕上的,我们一般称之为渲染帧,渲染帧是不稳定的,如果一帧计算的东西太多或者画面太复杂,...…
-
游戏事件管理器
事件管理器的由来在游戏系统中,当一个对象需要去访问另一个对象的时候,一般有几种情况:1、A对象是B对象的成员变量,B可以直接访问A对象的公有函数。2、A对象是一个单例,B对象可以通过A对象的单例进行访问。3、A对象注册了回调到事件管理器中,B对象触发事件管理器的事件。这3种方式都能实现B对象调用A对象的函数,区别在于第1,2种方法A,B是直接耦合的,第三种方法A,B是没有耦合关系的。事件管理器还能起到广播的作用,例如当游戏发生掉线时,我们可以触发掉线的事件,这样所有注册过掉线事件的对象都能...…
-
Unity接入微信支付
Unity接入微信支付的时候主要还是看官方文档,再结合其他人的博客,最终还是掉坑里了,这里统一说一下流程和遇到的问题。 微信开放平台和商户平台是2个不同的平台,如果是做App内支付,我们的流程是先去微信开放平台的账号(7个工作日以内),然后创建一个应用,注意Android的应用需要提供应用签名,这个是可以去微信开发平台的资源下载地址下载一个看签名的工具,安装在手机里,输入你的应用的bundlerID(com.xxx.xx)就可以了,下载链接。所以你创建的应用最好使用正式的bundlerI...…
-
Unity热更新之资源的上传与下载
资源的上传打包结束后,我们通过比较打包前和打包后AssetBundle的MD5值是否有变化来判断一个AssetBundle是否需要被更新,如果该AssetBundle的MD5值发生了改变,则我们将这个AssetBundle拷贝到我们的待更新文件夹中。更新文件夹的命名应该为当前的大版本号+资源版本号,这样下载的时候才能找到正确的路径,更新文件夹目录结构如下:UpdateFiles |--iOS |--1.0(大版本号) |--170513.1(资源版本号) ...…
-
Unity热更新之AssetBundle的加载与卸载
unity3d想要从一个AssetBundle里Load出资源,必须将该AssetBundle及该AssetBundle依赖到的其他AssetBundle都先加载到内存中,然后才能从该AssetBundle中Load资源。我们怎么知道一个AssetBundle依赖到了哪些其他的AssetBundle呢,这就需要提一下unity的打包机制。Unity3d调用打包函数BuildPipeline.BuildAssetBundles时,需要传进去一个Path,用于存放你打的AssetBundle,...…
-
Unity热更新之AssetBundle打包篇
unity3d在5.0之后打包Assetbundle变得比之前简单多了,最简单的办法就是把所有资源都标记Assetbundle的Flag,然后直接调用unity3d的打包Assetbundle即可,详情可参见官方文档。通过标记打包方式的优缺点这种打包方式的优点在于简单,缺点在于不好管理需要需要打包的资源。举例来说就是你必须把所有需要打包的资源都标记上Assetbundle的Flag,(包括prefab,texture,material,fbx,animation等),最后容易把资源打得特别...…
-
游戏大版本更新和热更新
游戏上线后,遇见bug或者需要更新内容(包括资源,玩法,数值调整,游戏脚本等)的时候,一般有2种做法。第一种,发个新包,然后让玩家下载新的版本;第二种,在游戏内更新,游戏启动时去下载需要更新的资源。第一种我们一般称为游戏大版本更新,第二种称为热更新。一般来说,不能通过小版本更新解决的问题,才会用到大版本更新,例如,不可热更的游戏代码。而热更新是建立在每次大版本更新的基础上进行的更新,因此,这2种更新方式应该互相承接。我们可以通过MD5文件和更新文件以及版本号来实现大版本更新和热更新。游戏的...…