游戏开发
文章平均质量分 75
coffeecato
思从深而行从简
展开
-
Unity 反射从入门到跑偏(BoxProjection 到 Fake Interior)
前言:最近在学习反射相关的内容,从反射的原理到Cube Map的生成及使用,Reflection Probe的原理及使用,重点研究了Box Projection Reflection Probe与Fake Interior(假室内效果)的关系,及其背后的原理。运行环境:Unity 2020.3.18f1Render Pipeline: URP测试场景:Unity 3D Sample Scene(URP)环境映射 Environment Mapping环境映射可以分为静态的(Cube Map)与原创 2022-05-16 20:30:00 · 1907 阅读 · 0 评论 -
[Unity]屏幕空间(视口)坐标(viewport coordinate)的几种计算方法对比分析
前言:本本的主要目的在于对比分析几种计算屏幕空间坐标的方法,顺便梳理了一遍坐标在不同阶段的变换。其中特别对比了SV_Postion语义及TEXCOORD0传递参数的异同,同时分析了ComputeScreenPos这个怪异的函数的本质。运行环境:Unity 2019.4.10f1Graphics API: Direct3D11效果图:代码:本文的说明主要与代码相结合,下面的几种方法都亲测可用。// https://blog.csdn.net/coffeecato/.原创 2022-03-04 13:42:36 · 2402 阅读 · 0 评论 -
使用stencil test实现UI上的“迷雾”效果
0x00 需求在UI上实现一种类似战争迷雾的效果。0x01分析需求战争迷雾是来自于RTS游戏,[此处可以插入链接]并经由MOBA游戏发扬广大的一种在地图上增加一种不透明的迷雾,造成信息的不对称从而增加游戏的趣味性。那么第一个想法是寻找战争迷雾插件,导入,使用之。0x02实现方案对比从实现原理上分类,战争迷雾有两种实现方法:屏幕后处理, 遮罩擦除法屏幕后处理中,最成熟的当属Fog Of War,在Unity Asset Store中搜索,第一个跳出的就是这个插件,作者:Aseh原创 2021-10-26 09:59:34 · 1184 阅读 · 0 评论 -
【Unity Shader】实现粒子根据到摄像机的距离渐变
0x00需求特效同学需要一个能随着距离摄像机距离变化,而变化(颜色)的特效需求。0x01分析需求原创 2021-06-15 20:14:11 · 1765 阅读 · 2 评论 -
Unity项目在pc和ios设备上黑屏的原因探究
0x00由于项目上线了windows平台的项目(别问我为什么,咱也不敢说,咱也不敢问),由Unity5.4.6升级到Unity2018的过程中,遇到了各种各样的坑,本文为避坑指南1。本项目没有使用HDR和抗锯齿,由于查这几个问题查到吐血,前后用了3天的时间,本文充满了怨气,行文非常啰嗦,需要快速解决问题的,可以直接拉到最后看结论。0x01 法线贴图项目在unity2018出了新的androi...原创 2019-11-27 09:01:21 · 5911 阅读 · 2 评论 -
利用Animation Curve实现列表的曲线滚动
0x00 需求的诞生 在上一个版本的开发过程中,美术同事提出了按照《悬空城》的活动列表的形式制作列表的滚动。由于UGUI先有的scroll View 并不支持这种形式,只能自己动手了。 左侧的活动列表滚动是沿着曲线滚动的。0x01 问题的分析 难点有两个: 1.如何构造出列表的曲线,其实曲线就是其中的每个元素所在的x坐标不同,从纵向的角度看构成了一条连续的曲线。 2.何时刷新列表原创 2018-01-25 21:12:45 · 3725 阅读 · 8 评论 -
【Unity Shader】NGUI中图标的灰化处理
NGUI图片灰化无法通过自带的功能实现。 UIButton的disable状态如下图: 如果想实现整体的灰化效果,需要改写NGUI自带的shader文件,修改后的效果如图: 修改NGUI原生的Unlit - Transparent Colored.shader文件Shader "Unlit/Transparent Colored"{ Properties {原创 2017-03-16 00:30:29 · 1786 阅读 · 0 评论 -
【NGUI】限制UIDargObject的拖拽区域(技能双摇杆的实现)
引言 最近在开发项目中的双摇杆功能,即利用摇杆释放指向性或者区域性的技能。之前介绍过利用NGUI开发的虚拟摇杆功能Unity3d中利用NGUI实现虚拟摇杆,本次在上文的基础上介绍一下如何限制滑块的移动区域。需求分析 在拖拽滑块的基础上,增加区域限制。拖拽到限制区域边缘时,滑块会有被拉回的动作。先看效果图 黑色区域为panel的区域,可以看到拖拽滑块基本被限制在panel区域内。如何实现原创 2017-03-10 00:43:49 · 1472 阅读 · 0 评论 -
【Unity3d基础】Unity3d自动生成asset bundle name(2)
引言:上一篇文章介绍了,利用System.IO的接口,收集路径下所有文件夹的方式设置asset bundle name,这一次介绍另一种方法。原理:经同事提醒,发现Unity有原生的资源管理器AssetPostprocessor,官方描述:AssetPostprocessor lets you hook into the import pipeline and run scri原创 2016-12-17 19:08:24 · 3152 阅读 · 0 评论 -
【Unity3d基础】Unity3d 中如何旋转一张2D图片到指定角度
引言近日在开发项目中,遇到一个这样的需求:将炮弹旋转至开火方到受击方所成的角度上,简言之就是将一枚炮弹旋转到开或者到敌人的方向上。如何旋转2D贴图?查阅了很多资料,都是关于四元数,欧拉角的问题。有点杀鸡焉用牛刀的意味,于是自己摸索着利用已有的接口用一种简单的方法实现。(注意,我的需求存在于2D场景内)用到的接口Vector3.Angle原创 2016-07-06 23:26:51 · 17938 阅读 · 0 评论 -
【游戏设计】任务系统进化论
引言 近来在新的项目中负责开发任务系统,起初自己做了一份设计,后来经与同事的交流,发现从系统设计上还有诸多可以改善的空间,这里加以记录。 背景&需求 MMORPG游戏中的任务系统远了说从《征途》《传奇》《魔兽世界》开始,一直占据着串联游戏内容,增加游戏粘性,丰富游戏内容等等很多本身功能之外的责任。所以不无可避免的,任务系统会与游戏的中的各种其他模块打交道,从设计的角度上如何避免过度耦合就是一个原创 2017-05-03 08:43:05 · 1375 阅读 · 0 评论 -
【Unity3d基础】Unity换装系统(2)
引言上一篇介绍了替换mesh数据的换装方法。本次继续介绍换装系统,换装系统除了替换外观,通常还要考虑到性能的因素。本篇主要介绍通过CombineMeshes对skinnenMesh进行合并,达到对性能进行优化的目的。CombineMeshes该接口是将不同的mesh合并到同一个mesh中以达到优化性能的目的。其函数原型如下:public void CombineMeshes(C原创 2017-02-11 17:44:20 · 3225 阅读 · 0 评论 -
【Unity3d基础】Unity换装系统(1)
引言最近项目需要开发换装系统,做了一些前期的调研。换装系统主要应用与MMORPG游戏中,除了常规的换衣服,发型,翅膀之类的,现在一些次时代的MMORPG游戏加入了捏脸,改变五官等比较复杂的换装系统。本次介绍通过替换Mesh数据来实现换装的方法。期望效果模型1模型2期望可以在游戏运行时将模型1的外观替换为模型2的外观。实现原理通过收集模型2中对应的mesh信息,替原创 2016-12-23 01:27:44 · 6729 阅读 · 0 评论 -
【Unity3d基础】Unity3d中利用NGUI实现虚拟摇杆
引言最近的项目中需要开发虚拟摇杆功能,由于历史原因对于FingerGesture较为熟悉,故没有采用EasyTouch。NGUI中的UIDragObjectNGUI中有一个UIDragObject.cs组件,添加到GameObject,即可实现简单的拖拽动作。其中的Target需要设置被拖拽的对象,代码注释如下: /// /// Target object that原创 2016-11-30 23:47:15 · 6654 阅读 · 0 评论 -
LUA简明教程
原文地址:LUA简明教程文章来自:酷 壳 – CoolShellcoffeecato写在前面:最近在学习Lua,看了陈浩大侠的文章还是觉得收益良多,重要的知识点都有提炼出来并加以简单的栗子。本文做一份简明的回顾是一篇很好的材料。只可惜对于Javascript不甚了解,陈浩大侠在文中类比Javascript之处无法感同身受。转载 2017-09-14 18:34:34 · 624 阅读 · 0 评论 -
Unity Shader-渲染队列,ZTest,ZWrite,Early-Z
原文地址:Unity Shader-渲染队列,ZTest,ZWrite,Early-Z简介在渲染阶段,引擎所做的工作是把所有场景中的对象按照一定的策略(顺序)进行渲染。最早的是画家算法,顾名思义,就是像画家画画一样,先画后面的物体,如果前面还有物体,那么就用前面的物体把物体覆盖掉,不过这种方式由于排序是针对物体来排序的,而物体之间也可能有重叠,所以效果并不好。所以目前更加常用的方式是z-buffe转载 2017-08-31 23:43:35 · 3451 阅读 · 9 评论 -
Unity中的层级以及渲染顺序
0x00 写在前面 在使用unity3d开发游戏项目时,层级的问题往往伴随着UI的开发,而在引入了3D模型、粒子特效后,层级的问题就变得有些扑朔迷离了,甚至会牵扯到Unity的渲染顺序。本篇主要从UGUI的角度出发,浅析UGUI中影响层级的因素。后续会分析UI与3D对象,UI与粒子特效之间层级的关系。0x01 影响层级的因素 前提条件: - Camera-Clear Flags - Ca原创 2017-10-17 21:51:19 · 17040 阅读 · 0 评论 -
Unity Shadow 如何实现超远的光源阴影
目的:如何实现超远的光源的阴影,最好可以兼顾近景与远景的阴影。(本文仅作为日常工作的调研记录)测试场景(只有一个平行光作为主光源):Shadow Distance = 50时,近景可以看到角色和树下的阴影,远处的山上没有阴影。Shadows的配置如下:查阅了官方资料与其他资料后,提出了两种方案:方法1:可以将近景的阴影与远景的阴影分开处理,通过动态设置Sha...原创 2019-05-29 19:17:01 · 5641 阅读 · 0 评论 -
【Unity Shader】标准光照模型总结
逐顶点与逐像素光照逐顶点光照[per-vertex lighting] [vertex shader]在每个顶点上计算光照,然后会在渲染图元内部进行线性插值,最后输出成像素颜色,由于顶点数目往往远小于像素数目,因此逐顶点光照的计算量往往要小于逐像素光照。逐像素光照[per-pixel lighting][fragment shader]以每个像素为基础,得到它的法线(可以是对顶点法线插值得...原创 2019-05-26 21:46:37 · 6084 阅读 · 0 评论 -
游戏配置文件加密工具(附源码)
引言:这是开发PC游戏《海战世界》时用到的配置文件加密工具,游戏开发难免要用到配置文件,而其中某些数据开发者并不期望用户获知或是修改,通常会对一些配置文件进行加密。一般是用一个批量的加密工具,统一对配置文件进行加密。考虑到加密、解密的效率及对安全性的需求,选择了最常用的XOR算法,以下是加密工具的源代码:(windows环境下基于XOR算法,带有图形界面的文件批量加密工具)源代码:...原创 2014-12-07 18:52:57 · 3261 阅读 · 0 评论 -
windows环境下如何区分单击和双击
引言今天在工作中遇到一个需求:要求按下按键A的时候触发事件1,连续按下两次按键A时触发事件2。(同时不触发事件1)如何实现双击?简单的说,要实现双击,只需设置一个最小间隔事件_IntervalTime,当两次按键的时间间隔小于_IntervalTime时,即触发双击事件。实际的使用中往往包含一些别的检测,例如两次点击区域的偏差应该在一个允许的偏差范围之内。(Windows的鼠标事件响应...原创 2015-09-15 22:03:19 · 2751 阅读 · 0 评论 -
UGUI drawcall 优化实录
写在前面去年参加uwa day 2017时,耳闻ui之于项目的影响,很多项目由于人少事多赶进度,而在开发中有很多粗放之处,ui就常常成为很多项目的性能短板。上个月项目上线,发现很多UI的性能堪忧,抽时间对于优化做了些优化。unity官方及其他很多渠道已经有很多关于ui优化的总结提纲,本文意在成为一本类似check list的手册,记录优化中碰到的实际问题。原理本文是基于UGUI的优化,先搞清楚几个...原创 2018-05-17 00:58:54 · 8524 阅读 · 3 评论 -
同一个Unity项目打开两个Unity Editor实例
coffeecato写在前面: 有时测试功能,需要多开unity3d进行,而unity3d无法同时打开同一个项目,找到了这个解决方案,亲测可用,方便简单,欢迎大家品尝! 在项目开发过程中,经常会遇到一个Unity项目需要打开两个Unity Editor实例的需求。而默认情况下一个项目只能打开一个Unity Editor。而最常见最暴力的方法就是一个项目copy两份,但这种做法对代码更新十转载 2018-04-24 15:42:49 · 10250 阅读 · 15 评论 -
GPU图形绘制管线
图形绘制管线的三个主要阶段##1、应用程序阶段:使用高级编程语言(C、C++、Java)进行开发,主要和CPU、内存打交道。诸如碰撞检测,空间八叉树更新,视锥裁剪等经典算法都在此阶段进行。在该阶段的末端,几何体数据(顶点坐标、法线量、纹理坐标、纹理等)通过数据总线传送到图形硬件。2、几何阶段:主要负责顶点坐标变换、光照、裁剪、投影以及屏幕隐射,该阶段基于GPU进行运算,在该阶段的末端得到了经过变换...转载 2018-03-08 14:37:51 · 663 阅读 · 0 评论 -
理解Unity3D中的四种坐标体系
coffeecato写在前面:本文比较了unity3d中的四种坐标系,在使用unity3d开发的过程中,已经多次被坐标转换之类的问题卡住,这篇文章可以说是系统的对四种坐标系进行了总结,结合实际的使用经验收获良多。转载 2018-01-02 11:11:35 · 4145 阅读 · 1 评论 -
【Unity3d基础】Unity3d中自动生成asset bundle name
引言:在unity3d的实际项目开发中,由于资源的增删改频繁,手动设置asset bundle name是一项繁琐且容易出错的工作,所以衍生出了开发自动化工具的需求。工作原理:以文件夹为目标,设置asset bundle name,在目标文件夹内的文件都会打进同一个asset bundle。实现原理:通过遍历Asset路径下的所有文件夹,收集所有的子文件夹列表,然后顺序设置as原创 2016-12-14 23:05:16 · 3396 阅读 · 0 评论 -
【NGUI源码剖析】深入理解NGUI的drawcall
引言上篇【NGUI源码剖析】NGUI的drawcall简单认识了NGUI中的drawcall。借着近来工作更替的间隙,本文在之前的基础上做一点深入的分析: - UIPanel工作流程图 - 如何生成drawcall - widgets的生成及作用 - drawcall的合并 UIPanel的工作流程 无论是UIDrawCall还是UIWidget的流程,都离不开UIPane原创 2017-07-10 18:33:57 · 4658 阅读 · 0 评论 -
【NGUI】实现半圆形进度条,技能CD效果
半圆形进度条 首先将资源图片打进atlas图集,在场景上创建一个新的sprite。资源是一张半圆形的进度条,如下图。如果要实现进度条的效果,只需实现纵向的遮挡即可。通过UISPRITE的相关属性即可实现。 下面学习一下UISprite的相关属性: Type: Smple:除了显示内容从图集里面获取外,其他都和Texture一样的绘制 Sliced:这个模式支持九宫格拉伸,让四个角落的原创 2017-02-24 00:34:21 · 2550 阅读 · 0 评论 -
【Unity技巧】四元数(Quaternion)和旋转
原文地址:【Unity技巧】四元数(Quaternion)和旋转目录(?)[+]四元数介绍旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转。矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的转载 2016-07-12 20:27:19 · 688 阅读 · 0 评论 -
BloomFilter基本概念和实现原理
写在转帖前面的话:对bloomFilter最简洁的解读:处理大数据,比如hbase中常常会提到bloom filter 的概念。这个精简的数据结构是干嘛的呢? 他的作用就是判断某个元素是否属于这个集合。方法是:对于集合A ,设置一个m位的位数组b。并给定k个hash函数。 for i in 0...k for elem i转载 2015-09-17 11:05:54 · 777 阅读 · 0 评论 -
random函数随想(游戏中的随机数)
写在前面:上周与服务器端的同事讨论到游戏中用到的随机数的问题。他随口问我,你最近玩的手游有没有发现装备的洗练中有没有发现什么规律?(由于是自己公司别的项目的产品,游戏名就不安利了,大概就参考征途,传奇这类游戏开创的武器强化之类的系统)我,你是指哪方面?他,随机生成的数值。我,倒是没有,不过我在上一个公司的项目中时,好像调试游戏的过程中发现随机生成的数值有时会出现数值相同的情况,原创 2015-09-05 23:10:25 · 4347 阅读 · 0 评论 -
AS3事件机制概述
事件机制是AS3的核心功能之一,没有充分掌握事件机制的方方面面,就不能算是精通AS3语言。1. AS3事件机制的主要成员IEventDispatcher:事件派发对象接口,定义了添加、派发、移除、是否监听指定事件、是否触发指定事件接口EventDispatcher:事件派发对象接口的实现者,用户无法撇开EventDispatcher而自行实现IEventDispatcher接口,无转载 2015-06-10 21:34:56 · 1492 阅读 · 0 评论 -
游戏开发中常用的设计模式
设计模式游戏classobjectiterator产品目录(?)[+]使用设计模式来提高程序库的重复利用性是大型程序项目开发必须的。但是在“四人帮”的设计模式概述中提到了23种标准设计模式,不但难以记住,而且有些设计模式更多的适用于应用程序开发,对游戏项目引擎设计并没有很多的利用价值。根据经验,精挑细选后,笃志在这里记录一些自认为有利用价值的设计模式,以便之后自己设计时使用。转载 2015-06-10 18:17:00 · 845 阅读 · 0 评论 -
高精度计时器QueryPerformanceCounter正确的打开方式(windows环境下)
引言游戏程序中有很多需要用到时间的地方,往往会通过windows API来获取时间。先前写过一篇文章是关于时间同步的:网络游戏中的(低精度)时间同步,当需求更高精度的时间同步时,就需要QueryPerformanceCounter这样的API,而QueryPerformanceCounter的使用有一些隐含的陷阱需要注意。原创 2015-03-27 10:12:40 · 17309 阅读 · 7 评论 -
网络游戏中的主循环
引言:网络游戏作为一种复杂度较高的软件,从其设计角度还是有一些共性的,比方说几乎所有的网游都会有一个主循环。由于游戏需要根据输入、游戏内状态的改变来不间断地更新游戏画面,所以游戏的主循环往往看起来像一个“死循环”,那么这个“死循环”是如何工作的?原创 2014-11-06 15:31:00 · 2784 阅读 · 0 评论 -
如何实现程序的重新启动(windows环境下)
背景:在游戏程序的开发中,经常会碰到这样的情况,运行游戏更新程序后需要重新启动更新程序,在游戏内修改视频等相关设置后需要重新启动游戏程序,这样的操作该如何实现呢?解决方案:一种解决方案是通过等待来启动新的程序,但是这样的实现方式在极端情况下会出现问题,假设某游戏程序每次在一个物理机上只允许启动一个进程,如果关闭旧的进程因为一些原因而造成延迟,那么启动新的进程时会失败,试想游戏更原创 2014-10-22 09:39:32 · 8608 阅读 · 1 评论 -
网络游戏中的(低精度)时间同步
对于网络游戏来说,从物体的移动、攻击到最基础的计时等等,都需要客户端与服务器保持时间的相对一致,那么服务器与客户端同步便是一个必须要解决的问题。通常,网络游戏都会利用心跳来进行同步,那么当客户端并不需要如此精度的同步时,有没有其他方法呢?这里主要讨论低精度的时间同步(精确到秒)。工作中接触过3种简单的时间同步方法:首先,定义时间同步类/// 32位操作系统typedef unsi原创 2014-10-16 21:56:17 · 4209 阅读 · 0 评论 -
如何判断两个日期在一周内
由于原有的方法无法处理两个日期在不同月份的情况,现更新LaTaio的方法如下:// 摘要:// 获取此实例所表示的日期为该月中的第几天。//// 返回结果:// 日组成部分,表示为 1 和 31 之间的一个值。public int Day { get; }这个方法可能更直观,直接贴代码,我是从周一开始算这周的第一天的,所以代码如下:bool IsSameWeek(DateTime b...原创 2014-10-01 21:49:04 · 6076 阅读 · 1 评论 -
控制程序的启动数量(限制游戏多开)
引言:在PC端使用软件的过程中,有时开发者会有类似限制程序启动数量的需求,如限制某程序在单一PC端的启动数量,或是为了统计PC端启动的程序数量等,显然需要一种“计数器”来统计程序的运行数量。如何对多个程序进行计数在启动多个程序时,由于程序隶属于不同的进程,常规的计数方法不能使用,那么如何统计程序的启动的数量成为了难题。下面介绍一种常用的方法——使用互斥量:#include "std...原创 2014-11-13 09:50:51 · 7155 阅读 · 4 评论 -
Unity3D占用内存太大的解决方法
该文章来自用户转载 点击阅读原文Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化.Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大。 Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要转载 2016-07-20 11:50:17 · 1156 阅读 · 0 评论