<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[gaming & coding]]></title><description><![CDATA[记录思考、经历与感悟。]]></description><link>https://blog.youkuaiyun.com/nikoong</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; nikoong]]></copyright><item><title><![CDATA[你为什么做游戏开发？]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/118481377</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/118481377</guid><author>nikoong</author><pubDate>Mon, 05 Jul 2021 09:29:57 +0800</pubDate><description><![CDATA[我的回答是“热情所在”。但热情又是从哪里来的呢？其实是看到行业前辈们走过的路，我才决定踏上这条路的。没错，这篇文章其实是一个推荐“书单”，旨在让未来迷茫的自己记起初心。“书单”内排名不分先后，仅仅以我阅读的先后顺序排列。
《DOOM启世录》


摘抄豆瓣上一句内容简介：“两个玩家是如何走上游戏之路，如何制作出迄今为止影响力最大的游戏作品–DOOM和Quake”。


豆瓣读书 https://book.douban.com/subject/26642310/


那些日子

那些日子，是一系列的文章。云风回]]></description><category></category></item><item><title><![CDATA[Pure MVC 架构简述]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/118313056</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/118313056</guid><author>nikoong</author><pubDate>Mon, 28 Jun 2021 21:44:52 +0800</pubDate><description><![CDATA[Pure MVC 架构简述

前言
游戏UI开发中，常常使用MVC架构（Model数据、View界面、Controller控制）。这个架构方便解耦数据、界面和交互逻辑。一般来说V可以持有M，C可以持有V和M。普通的MVC写法，容易把逻辑都写到C里，导致C无限制膨胀，逻辑也不好复用。
Model
一个界面，拥有一个Model类型的单例。这个Model是持有了多个Proxy。每个Proxy都对应了一类数据，并且提供了这访问、修改这些数据的方法。可以说Proxy是数据核心逻辑的处理地。同时Proxy可以注册一些消]]></description><category></category></item><item><title><![CDATA[FPS Microgame源码解析：角色控制]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/117517319</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/117517319</guid><author>nikoong</author><pubDate>Thu, 03 Jun 2021 12:21:01 +0800</pubDate><description><![CDATA[FPS Microgame源码解析：角色控制
玩家角色的移动、跳跃、下蹲、冲刺等状态，以及各种状态下基础移动速度的调整，相机视角的移动，都是由角色控制逻辑来实现的。对于一些第三人称动作游戏，相机可能在角色的后上方，这就可能发生角色和相机之间有场景遮挡的问题。但对于FPS游戏而言，角色摄像机基本上放置在角色的头部，和角色位置同步。这篇文章主要分析 Unity FPS Microgame 里的角色控制的实现方法。
一、移动
看 PlayerCharacterController.cs 脚本中的 HandleCh]]></description><category></category></item><item><title><![CDATA[FPS Microgame源码解析：武器系统]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/116592111</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/116592111</guid><author>nikoong</author><pubDate>Mon, 10 May 2021 12:12:40 +0800</pubDate><description><![CDATA[FPSMicroGame 武器系统
射击

散射

散射的计算WeaponController.cs脚本里。在GetShotDirectionWithinSpread函数里，主要是通过Vector3.Slerp，将 枪口的前向向量 和 一个随机的从球心到球面的单位向量，做插值。插值比例就是BulletSpreadAngle / 180f。可以想象一下， 两个三维向量角度之差最多是180°，所以BulletSpreadAngle 是最大散射角。
 void HandleShoot()
 {      
   ]]></description><category></category></item><item><title><![CDATA[回调函数与C#委托机制]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/116195872</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/116195872</guid><author>nikoong</author><pubDate>Tue, 27 Apr 2021 11:14:06 +0800</pubDate><description><![CDATA[回调函数
回调函数是一种有用的编程机制，就是通过函数指针调用的函数。C#里通过委托来提供回调函数的机制。不同于C/C++，委托确保回调方法是类型安全的，支持静态方法和类实例的成员方法，还允许顺序调用多个方法。
委托的内部构造
编译器实际上会为委托定义一个完整的类。类包含：

４个方法：一个构造器、Invoke函数、BeginInvoke和EndInvoke。
三个主要的字段  _target、 _methodPtr、 _invocationList





字段
类型
说明




_target
Sys]]></description><category></category></item><item><title><![CDATA[Ｃ#托管堆和GC]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/116173705</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/116173705</guid><author>nikoong</author><pubDate>Mon, 26 Apr 2021 21:22:11 +0800</pubDate><description><![CDATA[为什么要自动GC
程序员手动管理内存，看似简单，但可能导致大量的编程错误。忘记释放不再需要的内存而造成内存泄露。试图使用已经释放的内存，然后由于内存被破坏而造成程序错误。而且这种bug往往一般无法预测它们的后果或发生的时间。所以C#提供一个托管堆，自动地处理资源清理。当程序员需要手动清理时，也可以调用类中的Dispose方法。
托管堆和GC是什么
CLR划出一个地址空间区域作为托管堆，同时维护了一个指针NextObjPtr，指向下一个对象在堆中的分配位置。当一个区域被非垃圾对象填满后，CLR会分配更多区域。]]></description><category></category></item><item><title><![CDATA[Ｃ#反射机制原理]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/116171193</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/116171193</guid><author>nikoong</author><pubDate>Mon, 26 Apr 2021 20:20:35 +0800</pubDate><description><![CDATA[反射的概念
审查元数据并收集关于它的类型信息的能力。元数据（编译以后的最基本数据单元）就是一大堆的表，当编译程序集或者模块时，编译器会创建一个类定义表，一个字段定义表，和一个方法定义表等。System.reflection命名空间包含的一些个类，提供了方法，允许你反射（解析）这些元数据表的代码 。
为什么要反射
因为需要在运行时取得一些编译期不存在的类型的信息，创建实例，或者调用方法。
反射的性能

反射造成编译时无法保证类型的安全性。由于反射严重依赖字符串，所以会丧失编译时的类型安全性。
反射速度慢。使用]]></description><category></category></item><item><title><![CDATA[C#、.NET Framework、CLR区别与联系]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/116170777</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/116170777</guid><author>nikoong</author><pubDate>Mon, 26 Apr 2021 20:11:52 +0800</pubDate><description><![CDATA[很多人没有将C#、.NET Framework（.NET框架）、CLR（Common Language Runtime，公共语言运行库）这三者之间的关系区分清楚，认为其版本号是一一对应的。其实不然，.NET框架是一个独立发布的软件包，其包含了CLR、类库以及相关的语言编辑器等工具。C#代码经过编译之后在CLR环境中运行。由于.NET框架3.0/3.5其实是.NET2.0的扩展（只是增加了一些新的程序集），所以.N...]]></description><category></category></item><item><title><![CDATA[Unity Shader 透明效果]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115164645</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115164645</guid><author>nikoong</author><pubDate>Wed, 24 Mar 2021 10:30:56 +0800</pubDate><description><![CDATA[透明效果
导言
每个片元除了颜色值和深度值之外，它还有一个透明度属性。当透明度为1时，表示该像素是完全不透明的，而当其为0时，则该像素完全不会显示。
一、基本方法
Unity实现透明效果，通常有两种方法：

透明度测试，它的机制是简单粗暴的。只要一个片元的透明度不满足条件（通常指小于某个阈值），那么它对应的片元就不会再进行任何处理，也不会对颜色缓存产生影响。否则，就会按照普通的不透明物体的处理方式来处理它。这种方式无法得到半透明效果。
透明度混合，这种方法可以得到半透明的效果。它使用当前片元的透明度作为混合]]></description><category></category></item><item><title><![CDATA[Unity 基础纹理]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115164500</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115164500</guid><author>nikoong</author><pubDate>Wed, 24 Mar 2021 10:28:43 +0800</pubDate><description><![CDATA[第七章 基础纹理
导言
在OpenGL里，纹理空间的原点位于左下角，而在DirectX中，原点位于左上角。Unity中使用的纹理空间是符合OpenGL的传统的，位于纹理左下角。
一、单张纹理
通常使用一张纹理来代替物体的漫反射颜色。
纹理导入面板

Filter Mode ，代表纹理拉伸时的滤波模式，支持3种模式： Point、Bilinear、Trilinear；效果依次增加。
纹理缩小时，多个像素将会对应一个目标像素。我们往往需要处理抗锯齿问题。一个最常用的方法是使用多级渐远纹理（mipmapping）]]></description><category></category></item><item><title><![CDATA[Unity 基础光照]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115164300</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115164300</guid><author>nikoong</author><pubDate>Wed, 24 Mar 2021 10:27:07 +0800</pubDate><description><![CDATA[Unity 里的基础光照
一、基础概念


高光反射：表示物体表面是如何反射光线的；


漫反射：表示光线会被折射、吸收和散射出表面；


着色：根据材质属性，光源信息，使用一个等式去计算沿某个观察方向的出射度过程。这个等式也称为光照模型；


BRDF（Bidirectional Reflectance Distribution Function）：双向反射分布函数，是一类定义光线在不透明表面反射的四元函数。给定一个光线入射方向，得到出射光线分布。


标准光照模型：只关心直接光照。将进入到摄像机内的光线]]></description><category></category></item><item><title><![CDATA[开始 Unity Shader 学习之旅]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115164266</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115164266</guid><author>nikoong</author><pubDate>Wed, 24 Mar 2021 10:23:58 +0800</pubDate><description><![CDATA[第五章 开始 Unity Shader 学习之旅
一、最简单的顶点/片元着色器
语义：一个赋给shader输入和输出的字符串，这个字符串表达了这个参数的含义。通俗地讲，这些语义可以让shader知道从哪里读取数据，并把数据输出到哪里。
二、调试方法

假彩色图像。把需要调试的变量映射到 [0, 1] 之间，把它们作为图像输出到屏幕上，通过屏幕显示的像素判断值是否正确
Visual Studio的 Graphics Debugger ：可以单步调试
Frame Debugger：可以查看渲染该帧时进行的各种渲]]></description><category></category></item><item><title><![CDATA[Unity Shader基础]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115164223</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115164223</guid><author>nikoong</author><pubDate>Wed, 24 Mar 2021 10:23:32 +0800</pubDate><description><![CDATA[第三章 Unity Shader基础
一对好兄弟：材质和Unity Shader
在Unity中需要配合材质和 Unity Shader 才能达到需要的效果。Unity Shader定义了渲染所需的各种代码（如顶点着色器和片元着色器）、属性和指令，而材质则允许我们调节这些属性，并将其最终赋给相应的模型。为什么会有材质呢？对于美术人员来说，材质是他们十分熟悉的一种事物。Unity的材质和许多建模软件如（Cinema 4D、 Maya等）中提供的材质功能类似，它们都提供了一个面板来调整材质的各个参数。
Unit]]></description><category></category></item><item><title><![CDATA[什么是渲染流水线]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115163946</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115163946</guid><author>nikoong</author><pubDate>Wed, 24 Mar 2021 10:20:42 +0800</pubDate><description><![CDATA[第二章 什么是渲染流水线
一、渲染流水线的三个概念阶段
我们对渲染流水线进行基本的功能划分，可以将流水线分成三个阶段。注意这里的阶段只是单纯的概念，不是实际硬件实现方式。

应用阶段

本阶段由我们的应用主导，因此通常是由CPU负责实现。开发者具有这个阶段的绝对控制权。
主要有三个任务：

准备好场景数据，例如摄像机的位置、视锥体、场景中包含了哪些模型、使用了哪些光源等等；
为了提高渲染性能，我们往往需要做一个粗粒度剔除（culling）工作，把不可见的物体剔除出去。不需要移交给下一阶段处理；
需要设置好每]]></description><category></category></item><item><title><![CDATA[游戏物理技术简介]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115145323</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115145323</guid><author>nikoong</author><pubDate>Wed, 24 Mar 2021 09:14:11 +0800</pubDate><description><![CDATA[游戏物理
物理引擎


PhysX：NVIDIA旗下。前身：Nonodex

AGEIA：PPU（类似GPU、Physics processing Unit）；GPU适合做和效果相关的物理效果



Bullet：AMD旗下，开源；


havok：INTEL旗下、3A游戏应用最为广泛；


简单几何体：Sphere、OBB、Capsule、Convex


复杂：TriangleMesh


复杂几何体：heightfield


碰撞检测流程


场景剔除：八叉树


粗略阶段：轴投影，判断一定不会相交]]></description><category></category></item><item><title><![CDATA[游戏动画简介]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115145303</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115145303</guid><author>nikoong</author><pubDate>Tue, 23 Mar 2021 21:29:08 +0800</pubDate><description><![CDATA[游戏动画
动画技术类型
逐帧动画

像素时代美术逐帧画。现代主流三渲二：部落冲突、乱世王者。不采用直接3D是为了性能。
优缺点总结

优点：计算消耗小、表现逼真；
缺点：内存占用大、美术工作量巨大（非三渲二下）、缺乏灵活性；


3D逐帧动画；逐帧网格动画（quake2）。每帧存储的是整个模型的网格，采样网格数据来渲染。现已被骨骼动画所取代。
Morph动画（顶点变形动画）：一般用于人物表情。存储模型变化部分的顶点，通过目标顶点插值得到。所以morph动画还可以用在不同形状的物体形变。

关键帧动画
刚性阶]]></description><category></category></item><item><title><![CDATA[Unity 中 Prefab 与 meta 文件阅读]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115145059</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115145059</guid><author>nikoong</author><pubDate>Tue, 23 Mar 2021 21:26:24 +0800</pubDate><description><![CDATA[Unity 中 Prefab 与 meta 文件阅读
前言
Prefab是记录物体各个组件的变量和项目内资源引用关系的文件。当编辑器的Asset Serialization Mode设置为Force Text时，可以用任意文本编辑器打开prefab文件。而meta文件记录了一个文件的唯一id。

设置方法：左上角Edit - Project Settings - Editor - Asset Serialization，将Mode改为Force Text；

举个例子


在场景内创建一个game Obje]]></description><category></category></item><item><title><![CDATA[Unity动画触发方法总结]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115144938</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115144938</guid><author>nikoong</author><pubDate>Tue, 23 Mar 2021 21:24:00 +0800</pubDate><description><![CDATA[Unity动画触发方法总结
需求
UI动画希望玩家点击一次就播放一次
一、SetActive
这种情况需要在动画播放完毕后，将animator所在 gameobject设置为 inactive；或者在每次点击时先将gameObject设置为inactive，再timer（0.01s）设置为active；
二、Animator类方法

Animator.settrigger： 这种方法需要在animator里自己添加状态转移参数
Animator.Play(“StateName”); 这个函数要注意它的参数默]]></description><category></category></item><item><title><![CDATA[处理继承关系]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115111297</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115111297</guid><author>nikoong</author><pubDate>Tue, 23 Mar 2021 10:18:05 +0800</pubDate><description><![CDATA[处理继承关系
函数上移

顾名思义，将子类逻辑重复的函数，移动到父类里。

字段上移

也是顾名思义的，要注意新字段需要对所有子类可见。

构造函数本体上移

将子类构造函数共有的行为上移至超类。需要考虑到超类和子类的构造函数调用顺序。

函数下移

如果超类中的某个函数只与一个（或少数几个）子类有关，那么最好将其从超类中挪走，放到真正关心它的子类中。

字段下移

同上

以子类取代类型码

构造函数中使用类型码，来实现不同逻辑。有些时候可以再多往前一步，引入子类。这里有两种处理方法：

让不同的类型称为]]></description><category></category></item><item><title><![CDATA[重构API]]></title><link>https://blog.youkuaiyun.com/nikoong/article/details/115111286</link><guid>https://blog.youkuaiyun.com/nikoong/article/details/115111286</guid><author>nikoong</author><pubDate>Tue, 23 Mar 2021 10:17:31 +0800</pubDate><description><![CDATA[第11章 重构API
将查询函数和修改函数分离

如果函数只是提供一个值，没有任何看得到的副作用，那么这是一个很有价值的东西。可以在任意地方调用该函数，需要操心的事情少多了。（命令和查询分离原则）
举例说明“看得到的副作用”，一种常用的优化方法是，将查询多得结果缓存于某个字段中，这样一来后续的重复查询就可以大大加快速度。虽然查询时改变了对象的缓存，因为不论如何查询，总是获得相同的结果，所以这一修改时察觉不到的。

函数参数化

如果两个函数逻辑非常相似，只有一些字面量值不同，可以将其合并成一个函数，以参数的]]></description><category></category></item></channel></rss>