自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

gaming & coding

记录思考、经历与感悟。

  • 博客(55)
  • 资源 (2)
  • 收藏
  • 关注

原创 你为什么做游戏开发?

我的回答是“热情所在”。但热情又是从哪里来的呢?其实是看到行业前辈们走过的路,我才决定踏上这条路的。没错,这篇文章其实是一个推荐“书单”,旨在让未来迷茫的自己记起初心。“书单”内排名不分先后,仅仅以我阅读的先后顺序排列。《DOOM启世录》摘抄豆瓣上一句内容简介:“两个玩家是如何走上游戏之路,如何制作出迄今为止影响力最大的游戏作品–DOOM和Quake”。豆瓣读书 https://book.douban.com/subject/26642310/那些日子那些日子,是一系列的文章。云风回

2021-07-05 09:29:57 582

原创 Pure MVC 架构简述

Pure MVC 架构简述前言游戏UI开发中,常常使用MVC架构(Model数据、View界面、Controller控制)。这个架构方便解耦数据、界面和交互逻辑。一般来说V可以持有M,C可以持有V和M。普通的MVC写法,容易把逻辑都写到C里,导致C无限制膨胀,逻辑也不好复用。Model一个界面,拥有一个Model类型的单例。这个Model是持有了多个Proxy。每个Proxy都对应了一类数据,并且提供了这访问、修改这些数据的方法。可以说Proxy是数据核心逻辑的处理地。同时Proxy可以注册一些消

2021-06-28 21:44:52 632 3

原创 FPS Microgame源码解析:角色控制

FPS Microgame源码解析:角色控制玩家角色的移动、跳跃、下蹲、冲刺等状态,以及各种状态下基础移动速度的调整,相机视角的移动,都是由角色控制逻辑来实现的。对于一些第三人称动作游戏,相机可能在角色的后上方,这就可能发生角色和相机之间有场景遮挡的问题。但对于FPS游戏而言,角色摄像机基本上放置在角色的头部,和角色位置同步。这篇文章主要分析 Unity FPS Microgame 里的角色控制的实现方法。一、移动看 PlayerCharacterController.cs 脚本中的 HandleCh

2021-06-03 12:21:01 1049 4

原创 FPS Microgame源码解析:武器系统

FPSMicroGame 武器系统射击散射散射的计算WeaponController.cs脚本里。在GetShotDirectionWithinSpread函数里,主要是通过Vector3.Slerp,将 枪口的前向向量 和 一个随机的从球心到球面的单位向量,做插值。插值比例就是BulletSpreadAngle / 180f。可以想象一下, 两个三维向量角度之差最多是180°,所以BulletSpreadAngle 是最大散射角。 void HandleShoot() {

2021-05-10 12:12:40 1329 3

原创 回调函数与C#委托机制

回调函数回调函数是一种有用的编程机制,就是通过函数指针调用的函数。C#里通过委托来提供回调函数的机制。不同于C/C++,委托确保回调方法是类型安全的,支持静态方法和类实例的成员方法,还允许顺序调用多个方法。委托的内部构造编译器实际上会为委托定义一个完整的类。类包含:4个方法:一个构造器、Invoke函数、BeginInvoke和EndInvoke。三个主要的字段 _target、 _methodPtr、 _invocationList字段类型说明_targetSys

2021-04-27 11:14:06 726

原创 C#托管堆和GC

为什么要自动GC程序员手动管理内存,看似简单,但可能导致大量的编程错误。忘记释放不再需要的内存而造成内存泄露。试图使用已经释放的内存,然后由于内存被破坏而造成程序错误。而且这种bug往往一般无法预测它们的后果或发生的时间。所以C#提供一个托管堆,自动地处理资源清理。当程序员需要手动清理时,也可以调用类中的Dispose方法。托管堆和GC是什么CLR划出一个地址空间区域作为托管堆,同时维护了一个指针NextObjPtr,指向下一个对象在堆中的分配位置。当一个区域被非垃圾对象填满后,CLR会分配更多区域。

2021-04-26 21:22:11 297

原创 C#反射机制原理

反射的概念审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。System.reflection命名空间包含的一些个类,提供了方法,允许你反射(解析)这些元数据表的代码 。为什么要反射因为需要在运行时取得一些编译期不存在的类型的信息,创建实例,或者调用方法。反射的性能反射造成编译时无法保证类型的安全性。由于反射严重依赖字符串,所以会丧失编译时的类型安全性。反射速度慢。使用

2021-04-26 20:20:35 397

转载 C#、.NET Framework、CLR区别与联系

很多人没有将C#、.NET Framework(.NET框架)、CLR(Common Language Runtime,公共语言运行库)这三者之间的关系区分清楚,认为其版本号是一一对应的。其实不然,.NET框架是一个独立发布的软件包,其包含了CLR、类库以及相关的语言编辑器等工具。C#代码经过编译之后在CLR环境中运行。由于.NET框架3.0/3.5其实是.NET2.0的扩展(只是增加了一些新的程序集),所以.N...

2021-04-26 20:11:52 1094

原创 Unity Shader 透明效果

透明效果导言每个片元除了颜色值和深度值之外,它还有一个透明度属性。当透明度为1时,表示该像素是完全不透明的,而当其为0时,则该像素完全不会显示。一、基本方法Unity实现透明效果,通常有两种方法:透明度测试,它的机制是简单粗暴的。只要一个片元的透明度不满足条件(通常指小于某个阈值),那么它对应的片元就不会再进行任何处理,也不会对颜色缓存产生影响。否则,就会按照普通的不透明物体的处理方式来处理它。这种方式无法得到半透明效果。透明度混合,这种方法可以得到半透明的效果。它使用当前片元的透明度作为混合

2021-03-24 10:30:56 351

原创 Unity 基础纹理

第七章 基础纹理导言在OpenGL里,纹理空间的原点位于左下角,而在DirectX中,原点位于左上角。Unity中使用的纹理空间是符合OpenGL的传统的,位于纹理左下角。一、单张纹理通常使用一张纹理来代替物体的漫反射颜色。纹理导入面板Filter Mode ,代表纹理拉伸时的滤波模式,支持3种模式: Point、Bilinear、Trilinear;效果依次增加。纹理缩小时,多个像素将会对应一个目标像素。我们往往需要处理抗锯齿问题。一个最常用的方法是使用多级渐远纹理(mipmapping)

2021-03-24 10:28:43 1605

原创 Unity 基础光照

Unity 里的基础光照一、基础概念高光反射:表示物体表面是如何反射光线的;漫反射:表示光线会被折射、吸收和散射出表面;着色:根据材质属性,光源信息,使用一个等式去计算沿某个观察方向的出射度过程。这个等式也称为光照模型;BRDF(Bidirectional Reflectance Distribution Function):双向反射分布函数,是一类定义光线在不透明表面反射的四元函数。给定一个光线入射方向,得到出射光线分布。标准光照模型:只关心直接光照。将进入到摄像机内的光线

2021-03-24 10:27:07 169

原创 开始 Unity Shader 学习之旅

第五章 开始 Unity Shader 学习之旅一、最简单的顶点/片元着色器语义:一个赋给shader输入和输出的字符串,这个字符串表达了这个参数的含义。通俗地讲,这些语义可以让shader知道从哪里读取数据,并把数据输出到哪里。二、调试方法假彩色图像。把需要调试的变量映射到 [0, 1] 之间,把它们作为图像输出到屏幕上,通过屏幕显示的像素判断值是否正确Visual Studio的 Graphics Debugger :可以单步调试Frame Debugger:可以查看渲染该帧时进行的各种渲

2021-03-24 10:23:58 65

原创 Unity Shader基础

第三章 Unity Shader基础一对好兄弟:材质和Unity Shader在Unity中需要配合材质和 Unity Shader 才能达到需要的效果。Unity Shader定义了渲染所需的各种代码(如顶点着色器和片元着色器)、属性和指令,而材质则允许我们调节这些属性,并将其最终赋给相应的模型。为什么会有材质呢?对于美术人员来说,材质是他们十分熟悉的一种事物。Unity的材质和许多建模软件如(Cinema 4D、 Maya等)中提供的材质功能类似,它们都提供了一个面板来调整材质的各个参数。Unit

2021-03-24 10:23:32 153

原创 什么是渲染流水线

第二章 什么是渲染流水线一、渲染流水线的三个概念阶段我们对渲染流水线进行基本的功能划分,可以将流水线分成三个阶段。注意这里的阶段只是单纯的概念,不是实际硬件实现方式。应用阶段本阶段由我们的应用主导,因此通常是由CPU负责实现。开发者具有这个阶段的绝对控制权。主要有三个任务:准备好场景数据,例如摄像机的位置、视锥体、场景中包含了哪些模型、使用了哪些光源等等;为了提高渲染性能,我们往往需要做一个粗粒度剔除(culling)工作,把不可见的物体剔除出去。不需要移交给下一阶段处理;需要设置好每

2021-03-24 10:20:42 365

原创 游戏物理技术简介

游戏物理物理引擎PhysX:NVIDIA旗下。前身:NonodexAGEIA:PPU(类似GPU、Physics processing Unit);GPU适合做和效果相关的物理效果Bullet:AMD旗下,开源;havok:INTEL旗下、3A游戏应用最为广泛;简单几何体:Sphere、OBB、Capsule、Convex复杂:TriangleMesh复杂几何体:heightfield碰撞检测流程场景剔除:八叉树粗略阶段:轴投影,判断一定不会相交

2021-03-24 09:14:11 184

原创 游戏动画简介

游戏动画动画技术类型逐帧动画像素时代美术逐帧画。现代主流三渲二:部落冲突、乱世王者。不采用直接3D是为了性能。优缺点总结优点:计算消耗小、表现逼真;缺点:内存占用大、美术工作量巨大(非三渲二下)、缺乏灵活性;3D逐帧动画;逐帧网格动画(quake2)。每帧存储的是整个模型的网格,采样网格数据来渲染。现已被骨骼动画所取代。Morph动画(顶点变形动画):一般用于人物表情。存储模型变化部分的顶点,通过目标顶点插值得到。所以morph动画还可以用在不同形状的物体形变。关键帧动画刚性阶

2021-03-23 21:29:08 374

原创 Unity 中 Prefab 与 meta 文件阅读

Unity 中 Prefab 与 meta 文件阅读前言Prefab是记录物体各个组件的变量和项目内资源引用关系的文件。当编辑器的Asset Serialization Mode设置为Force Text时,可以用任意文本编辑器打开prefab文件。而meta文件记录了一个文件的唯一id。设置方法:左上角Edit - Project Settings - Editor - Asset Serialization,将Mode改为Force Text;举个例子在场景内创建一个game Obje

2021-03-23 21:26:24 2027

原创 Unity动画触发方法总结

Unity动画触发方法总结需求UI动画希望玩家点击一次就播放一次一、SetActive这种情况需要在动画播放完毕后,将animator所在 gameobject设置为 inactive;或者在每次点击时先将gameObject设置为inactive,再timer(0.01s)设置为active;二、Animator类方法Animator.settrigger: 这种方法需要在animator里自己添加状态转移参数Animator.Play(“StateName”); 这个函数要注意它的参数默

2021-03-23 21:24:00 7804 2

原创 处理继承关系

处理继承关系函数上移顾名思义,将子类逻辑重复的函数,移动到父类里。字段上移也是顾名思义的,要注意新字段需要对所有子类可见。构造函数本体上移将子类构造函数共有的行为上移至超类。需要考虑到超类和子类的构造函数调用顺序。函数下移如果超类中的某个函数只与一个(或少数几个)子类有关,那么最好将其从超类中挪走,放到真正关心它的子类中。字段下移同上以子类取代类型码构造函数中使用类型码,来实现不同逻辑。有些时候可以再多往前一步,引入子类。这里有两种处理方法:让不同的类型称为

2021-03-23 10:18:05 211

原创 重构API

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

2021-03-23 10:17:31 200

原创 简化条件表达式

第10章 简化条件表达式分解条件表达式将每个分支条件和分支执行分解成新函数。这个手法可以突出条件逻辑,更清楚地表明每个分支的作用,并且突出每个分支的原因。本重构手法其实只是提炼函数的一个应用场景,因为价值很大,所以特地强调。合并条件表达式检查条件各不相同,最终行为一致,这种情况下,就应该用“逻辑或”和“逻辑与”将它们合并为一个条件表达式。但如果这些检查的确彼此独立,的确不应该被视为同一次检查,我就不会使用本项重构。执行本手法的时候要注意,确定这些条件表达式都没有副作用。以卫语句取代嵌套条

2021-03-23 10:16:22 221

原创 重新组织数据

第9章 重新组织数据拆分变量除了循环变量和结果收集变量,一个变量只应该被赋值一次。同一个变量承担两件不同的事,会令代码阅读者糊涂。字段改名数据结构中的字段命名很重要。修改一个类中的字段,有四个地方需留意:取值函数、设值函数、够着函数和内部数据结构以查询取代派生变量有些变量其实可以很容易地随时计算出来,可以去掉这些变量,将可变数据的作用域限制在最小的范围。计算常能更清晰地表达数据的含义,而且也避免了“源数据修改时忘了更新派生变量”的错误。如果源数据不可变,那么保留或者不保留派生变量都

2021-03-23 10:15:54 107

原创 搬移特性

第8章 搬移特性搬移函数目的:模块化。将相互关联的软件要素都集中到一块,并确保块与块之间的联系易于查找、直观易懂。原因搬移函数最直接的一个动机是,它频繁地引用其他上下文中的元素,对自身上下文中的元素关心甚少。如果在整理代码时,发现需要频繁调用一个别处的函数,我也会考虑搬移这个函数。内部的辅助函数,若其他地方也需要用到,可以搬移到更通用的地方。主要使用在嵌套函数的搬移,和类中函数的搬移。原文中Account类中的函数,搬移到 AccountTypel类中。搬移字段目的:优化程序中的

2021-03-23 10:15:18 142

原创 封装

封装一、封装记录(记录封装成类)记录型结构可以有两种类型:第一种需要声明合法的字段名字比如{start: 1, end: 5},C#中没有这种特性。第二种是语言库本身实现的,比如hash、map、dictionary等。使用这种记录的缺陷在于,一条记录持有什么字段往往不够直观,只能查看它的创建点和使用点。这条建议是对于可变数据,对于不可变数据可以将它保留为记录。重点在于将更新函数放在类中。读取操作的处理把所有对数据的读取提炼成函数,并将它们搬移到类中。优点提供了清晰的API列

2021-03-23 10:14:40 116

原创 第一组重构

第6章 第一组重构提炼函数何时应该把代码放进独立的函数,一个合理的观点是“将意图与实现分开”。当变量按值传递给提炼部分又在提炼部分被赋值,就必须多加小心。如果只有一个这样的变量,我会尝试将提炼出的新函数变成一个查询(query),用其返回值给该变量赋值。但有时在提炼部分被赋值的局部变量太多,这时最好是先放弃提炼,考虑其他重构手法,拆分变量或者以查询取代临时变量。内联函数略提炼变量表达式有可能非常复杂而难以阅读,这种情况下,局部变量可以帮助我们将表达式分解为比较容易管理的形式。注意

2021-03-23 10:14:14 72

原创 重构的原则

重构的原则重构与性能三种编写快速软件的方法时间预算法持续关注法利用统计数据专门优化测试系统确保测试不该通过时真的会失败。频繁地运行测试。对于你正在处理的代码,与其对应的测试至少每隔几分钟就要运行一次,每天至少运行一次所有的测试。警惕共享测试夹具。如果一个函数会修改测试夹具中的变量,就会影响到后面的测试。考虑可能出错的边界条件,把测试的火力集中在那里。虽然在LeetCode上刷题就已经知晓的道理了,但是再强调也没问题。不要因为测试无法捕捉所有的bug就不写测试,因为测试的确可

2021-03-22 21:46:52 37

原创 对象池

对象池1. 使用情景当需要频繁地创建和销毁对象时;对象的大小一致时;在堆上进行对象内存分配十分缓慢或者会导致内存碎片;每个对象都封装了像数据库或者网络连接这样很昂贵又可以重用的资源,如数据库、网络的连接;2.注意点可能在闲置对象上浪费内存;同时激活的对象数量是固定的,如果超出容量有几种做法:在固定场景下调整对象池的大小,完全阻止这一点;不创建对象强行清理现存对象增加对象池的大小;如果这么做了,当这些额外空间不再被占用时,必须考虑是否恢复到原容量。每个对象的内存大小是固定

2021-03-22 21:42:57 136

原创 服务定位器模式

服务定位器模式这就是服务定位模式的简短介绍——它将一个服务“是什么”(具体实现类型)和“在什么地方”(我们如何得到它的实例)与需要使用这个服务的代码解耦了。依赖注入:假设你有一个类依赖另一个类。通常,这个定位器应该负责为自己构建这个实例。依赖注入却说外部代码应该扶着为这个对象注入它所需要的这个依赖实例。服务定位实现方案的选型外部代码注册优点:方便快捷、手动控制提供器如何被构建、可以在运行时更换服务提供器;缺点:定位器依赖外部代码;编译时绑定优点:速度快,所有实际工作在编译期完成;

2021-03-22 21:42:08 206

原创 空间分区

空间分区目的与常用方法常常需要解决的问题:对象的附近存在哪些其它对象?两两比较对象的位置的蛮力算法,复杂度是O(n^2);用链表储存同格子对象。同一个格子的对象储存在同一个链表中;遍历周围格子:每一个格子只需要遍历其 上方、左上、左侧、左下 四个格子即可;空间划分分区不依赖于对象:将空间均等地分割为若干个分区。其优点有:a. 对象可以逐步添加;b. 内存的使用量恒定。新增对象不会新增分区;c. 可以在对象可以快速移动;分区自适应于对象:二叉空间分割(BSPs)和 k-d

2021-03-22 21:41:16 283

原创 类型对象

类型对象类型对象模式定义一个类型对象类和一个持有类型对象类。每个类型对象的实例表示一个不同的逻辑类型。每个持有类型对象类的实例引用一个描述其类型的类型对象。实例数据被存储在持有里类型对象的实例中,而所有同概念类型所共享的数据和行为被存储在类型对象中。引用同一个类型对象的对象之间能表现出“同类”的性状。如何理解:类型对象模式其实就是手动实现继承,C++中虚函数表其实就是我们的类型对象类,C++是类型对象模式在C上的应用,由编译器自动处理。使用场合当需要定意思一系列不同种类的东西,但是不希望把种

2021-03-22 21:40:33 247

原创 数据局部性

数据局部性数据局部性:现代计算机的多级缓存机制导致了一个特点;在缓存线中能使用的数据越多,程序就跑得越快。因此优化的目标就是让需要处理的数据在内存中两两相邻;CPU分支预测:当代CPU中,单条指令被处理成流水线模型,以便多条指令能并行处理。当if else等语句出现时,CPU必须进行分支预测,并在流水线中载入预测的命令。预测错误,会导致清理流水线,造成性能损耗。关键代码中避开控制流语句。优化例子:连续数组:假设有一个GameEntity数组,储存了若干实体,每一个实体有物理组件、AI组件、渲染组

2021-03-22 21:39:43 618

原创 脏标记模式

脏标记模式常用做法和使用情景一组原始数据随时间变化,其衍生数据经过一些代价昂贵的操作由原始数据确定。维护一些脏标记,在原始数据被改变时,标记为脏;当需要使用衍生数据时,再计算并清除脏标记。使用情景原始数据的修改次数比衍生数据的使用次数多;递增地更新数据十分困难,因而需要脏标记来按需更新衍生数据;注意事项延时太长会有代价:当真正需要衍生数据时,可能会卡顿;必须保证每次原始数据改动时,都设置脏标记;必须在内存中保存上次的衍生数据:因为在张标记没有被设置时,是直接读取上次的衍生数据;

2021-03-22 21:38:34 407

原创 子类沙盒

子类沙盒沙盒模式基类定义了一个抽象的沙箱方法和预定义的提供集合。通过将它们设置为protected的状态,以确保它们仅供子类使用。每个派生出的沙盒子类用父类提供的操作实现了沙箱方法。使用场合你有一个能派生很多子类的基类。基类可以提供子类需要的所有操作。在子类中有行为重复,你想要更容易的重用代码。你想要最小化子类和工程中其他部分的耦合。将耦合都放在了基类里,子类只和基类耦合。大类瘦身:当基类变得庞大时,可以将同模块的功能分流到辅助类或组件类中,好处是能够减少基类的函数数量,辅助类中的代码更

2021-03-22 21:37:17 98

原创 组件模式

组件模式谈一谈继承与组合当面向对象语言第一次接触这个场景时,继承是它箱子里最闪耀的工具。 它被认为是代码无限重用之锤,编程者常常挥舞着它。 然而我们痛苦地学到,事实上它是一把重锤。 继承有它的用处,但对简单的代码重用来说太过复杂。相反,在今日软件设计的趋势是尽可能使用组件代替继承。 不是让两个类继承同一类来分享代码,而是让它们拥有同一个类的实例。使用场景组件通常在定义游戏实体的核心部分中使用,但它们在其他地方也有用。 这个模式应用在在如下情况中:有一个涉及了多个领域的类,而你想保持这些领域互相

2021-03-22 21:36:18 1078

转载 Git常用命令

Git常用命令创建 | CREATE$ git clone ssh://[email protected]/xx.git 克隆远程仓库$ git init 初始化本地 git 仓库(新建仓库)本地更改 | LOCAL CHANGES$ git status 查看当前版本状态(是否修改)$ git diff 显示所有未添加至 index 的变更$ git diff HEAD 查看已缓存的与未缓存的所有改动$ git add <path> 将该文件添加到缓存$ git commi

2020-06-16 22:07:37 205

原创 游戏开发中单例模式的优缺点

单例模式优点在编译期确保一个类只有一个实例;提供一个全局访问的入口;在例子fileSystem中,甚至可以通过继承来实现不同游戏平台的逻辑封装缺点它是一个全局变量使代码晦涩、促进了耦合、对并发不友好;它必须同时解决两个问题(全局访问、一个实例)如果只想解决一个问题时,另一个功能就是枷锁;延迟初始化剥离了控制替换方案将类限定为单一实例断言...

2020-04-10 10:00:08 396

原创 Unity中 Animator Controller Transition 一些属性的含义

Unity中 Animator Controller Transition 一些属性的含义Has Exit Time该属性有两个作用如果勾选了该项,在动画转换时会等待当前动画播放到Exit Time时间,再转换到下一个状态。如果我们需要当前的动画播放完毕后自动转换到箭头所指的下一个状态(没有其他跳转条件),此时必须勾选该选项,否则动画播放完毕后就会卡在最后一帧;如果是循环动画就会...

2019-09-05 22:45:31 2826

原创 ECS设计模式笔记

思想组合优于继承数据驱动编程ECS的产生是基于这样的假设:在现代游戏架构中,简化game loop比其他任何事情都重要。​Entity-Component-System 实体-组件-系统组件仅仅包含代表其特性的数据(即没有方法。Singleton Component:在上下文中只有一个实例的组件。实体是游戏内的基本单元。每个实体由一个或多个组件构成。在程序中...

2019-03-11 11:57:03 1048

原创 Unity中的逆向动力学

前向动力学是通过父关节点的移动来计算子关节点的位置,这样一步步确定骨骼链上所有关节的位置。而逆向动力学(Inverse Kinematics,后文简称IK):通过子关节的位置,反求推导出所在骨骼链上n级父关节点的位置。逆向动力学的优缺点:优点:工作效率高,不需要手动控制的关节数目。缺点:解方程需要耗费较多的计算机资源。比如在射击游戏中,我们要设置一个角色左手右手的持枪姿势,同时目光看向...

2018-12-06 15:49:13 2469

原创 参加2018年完美世界GameJam的体会

  6月1号-3号参加了完美世界举办的上海站GameJam。本场的规则是在48小时内,做出一款主题为“萌”的游戏,最后所有队伍分别演示。我们团队一共6人,我名义上是队长,实则后勤部长(笑)。队伍成员都没有实际游戏项目经验,也基本上是第一次参加GameJam。而我更是一个接触游戏引擎才一个月的新新手。我们大都抱着见见世面、膜拜大佬的心态参赛的。最后作品居然很幸运地获得了上海站前三的成绩,难以置信。...

2018-06-07 15:39:21 2795

游戏人工智能编程案例精粹源码

游戏人工智能编程案例精粹源码

2017-06-02

空空如也

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

TA关注的人

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