关于游戏开发的一点感悟

这是我的第一篇随笔,就随意写点什么,那么首先说说为什么要写Blog。在年前的时候,我去参加了几场面试。在面试的过程中,当面试官询问我某些问题时,尽管了解原理,但很难组织良好的语言进行表述,回答的不清晰。所以我希望通过写 Blog 来提升我的口语表达的能力。其次写些技术Blog总结知识点来加深印象,通过Blog与其他小伙伴进行交流。当然写 Blog 最直接的一个好处就是提高了自己的写作能力。因此在博客园新开了一个Blog,记录自己的人生感悟或者技术文章。

我的软件开发生涯是从2017年2月开始的,报了一个Java Web开发的培训班。为什么选择Java Web开发,报名前提供咨询的老师建议我选择Web前端,可能觉得自己偏爱静态强类型语言,Java Web开发好找工作。经过大概五六个月的培训,对Java Web开发有了一个大概的了解,之后顺利入职一家公司。可惜干了一年多离职了,记得去年匆匆做了离职的决定是相当不理智的,也是不负责任的体现。不过那时候的精神状态很低落,想着休息段时间再求职,基于这个原因才有了离职的打算。等着两三个月再次应聘,发现找工作已变得很困难了,在找不到工作后,又自学了Web前端开发,依然没有任何改变。经过总结,我认为有以下原因:其一自己所掌握的技能有限,满足不了中高级职位的要求,只能退而求其次的寻求中低级开发的职位;其二个迫于自己年龄同其他应聘者已有劣势;其三面试过程表现不佳。或许该考虑考虑另外的方向。

在报培训班的时候,我曾考虑过游戏开发行业,担心过于冷门,不好就业,选择稳妥的Web开发。所以说我个人的主观能动性不强,从参加工作至今都是随波逐流的状态,没有自己遵从内心的想法,在进行选择的时候都优先考虑其他因素。自己从小就爱玩游戏,也希望加入这个行业,开发让其他玩家也热爱的游戏,可是从来就没有付诸过实际行动。俗话说“三十而立”,30岁反而没有工作更是一件难以启齿的事情。可能现在已经太迟了,在找工作也会面临以上种种困难,至少对游戏开发是充满热情的,亦步亦趋的朝着目标前进。

从上个月开始自学Unity,通过看网上的视频教程,读游戏开发的相关书籍,别人写的Demo。了解Game Programmer需要掌握的知识分为以下几个方面:

游戏脚本(语言、算法与数据结构、设计模式)

游戏脚本通俗来说是程序员编写的一段代码与游戏引擎进行交互。Unity使用的是C#,Unreal使用的是C++。我所学的Unity,因此对C#更了解。由于我有Java的基础,C#学起来还算轻松,语法大致相同,语言特性比Java丰富,比如委托、事件。

C#的类库也很庞大,封装了大量的集合类,如Dictionary、List、Set。算法是我的弱项,也不多说什么了。

设计模式包括单例,工厂,抽象工厂(生成复合对象),生成器(Builder)模式;门面设计(子系统对外的门面),适配器(Adapter),桥接(Bridge),组合(Composite),装饰(Decorator),代理(Proxy)模式;模板方法,状态,策略,观察者模式。我觉得在接触过大量工程实践后,自然而然地对设计模式有深刻理解。设计模式中不得不提设计模式原则,想起有场面试提出了这个问题,当时就回答个类的单一职责,然后就没然后了,觉得自己的学习方法有问题。在面向对象中,首先一个类只负责自己的功能,对内部属性和方法进行封装,对外只暴露出公共部分,这就是类的单一职责原则。在此之上,一个类继承另一个类,应该扩展另一个类的方法,而不是修改另一个类的方法,那么继承的类可以用其他的类替换,这就是里氏替换原则。接下来,类在调用另一个类的方法时,不应该直接依赖该类的实现,而是依赖接口或者抽象类,这就是依赖倒置原则。接口应该尽可能的保留更少的方法,而不应该搞一个大的接口,这就是接口隔离原则。迪米特法则是说一个对象要尽可能的减少对其他对象的了解。如果以上原则都做到了,那么就满足开闭原则(对扩展开放,对修改关闭),如此理解的话脉络更清晰。

3D数学

向量是3D数学中最基础的部分,加减乘除基本运算应该了解。三角函数运算Sin、Cos、Tan及其反函数要了解。接下来是点积的运算,其几何意义可以用来计算两个向量之间的夹角;叉积的几何意义是生成的向量是法向量。

欧拉角使用三个角度保存方位,X轴与Z轴沿自身坐标旋转,Y轴沿世界坐标旋转。

四元数在3D图形学中代表旋转,由一个三维向量和一个标量组成。

欧拉角和四元数的转换。世界坐标和自身坐标(Pivot)的转换。

对我而言是弱中之弱,幸好Unity提供了很多的辅助类帮助完成转换。

Unity编辑器(Unity组件)

Unity是面向对象的基于组件开发的,功能的实现是组件完成的。

Transform是每个GameObject都有的组件,表示GO的坐标、角度、大小。

Mesh包含Mesh Filter和Mesh Render,Mesh Filter从一个资源中获取网格信息,通过Mesh Renderer渲染出来。

Rendering包含Camera、Skybox(天空盒)、Light、遮挡剔除、LOD等。

Physics、Physics 2D包含各类Collider(碰撞体)、Cloth(布料)和Joint(关节)组件。

UI、Layout包含UGUI下的Button、Input Field、Toggle、Slider、Scrollbar组件和布局组件。这里多说一句,Unity中UI主要有两种方案,一个UGUI,一个NGUI,功能上NGUI比UGUI丰富,但UGUI原生的,执行效率高。需要懂得UI事件触发原理,Canvas的Graphic Raycaster组件发射射线,Image和Text等组件通过Collider接收Raycast Target检测,EventSystem的Event System组件分发注册的事件,通过继承接口来响应对应的事件。

Navigation包含导航功能,NavMeshAgent提供导航代理,NavMeshObstacle提供动态导航阻挡,NavMeshLink。

Video、Audio、Effects(Particle System)、Event还有其他的一些Unity内置组件,就没怎么了解。

Unity脚本API

Unity脚本API给予了访问内置组件的属性方法,还有一些辅助工具类。

其中Componet类,Transform类,GameObject类,Object类,Time类是常用的一些类。Vector3类,Quaternion类等静态方法。

Unity坐标中World Space、Local Space、Screen Space、Viewport Space的相互转换。

Coroutine(协程)、File System和IO。

游戏引擎

Unity脚本的生命周期,需要了解物理帧和渲染帧的不同。

计算机图形学

大概明白了渲染管线的工作流程,初略了解shaderlab编写的shader。

物理引擎和动画

Unity中刚体、碰撞器、触发器的概念,Unity中射线的应用。

了解3ds Max的简单的操作,可以通过3ds Max捏一个简单的几何物体并上色,制作一段骨骼动画。

Unity的Mecanim动画系统。

游戏AI

了解最基本的FSM。

Perception和Steering无了解。

网络开发

无了解

资源与性能优化

美术规范包含单位比例、建模规范、材质贴图规范。

Unity中资源的读取,场景的加载。

设备适配与项目发布

SDK的适配。

iOS和Android平台的发布。

通过这一个月的学习,通过Unity开发一个3D RPG的Demo,项目的架构有以下模块:

  1. Core模块(工具类、配置辅助类、数据库连接辅助类、XML文件辅助类)
  2. Store(StoreManager)、Backpack(ItemManager)、Item类
  3. Character模块(CharacterManager、Animation动画系统、角色状态类、角色移动类、角色装备类、角色技能类)
  4. UI模块(UIManager、UIScene、UIWidget)
  5. AI模块(BaseFSM、FSMState、FSMTrigger)
  6. Skill模块(SkillManager、SkillDeployer)、Skill类
  7. Statistics模块

仅仅算摸到Unity开发的皮毛,还需要了解很多的基础知识和工程方法。下一步计划把Unity提供的Demo项目都过一遍,有空就浏览Unity Manual和Script API,然后仿照Ori、Journey开发个2D、3D Demo就去求职。实在不行的话,只有先考虑其他的工作,再慢慢向着目标靠近。

猜你喜欢

转载自www.cnblogs.com/arthumogan/p/12445053.html