关于游戏开发的一点感悟
Posted arthumogan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于游戏开发的一点感悟相关的知识,希望对你有一定的参考价值。
这是我的第一篇随笔,就随意写点什么,那么首先说说为什么要写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的适配。
通过这一个月的学习,通过Unity开发一个3D RPG的Demo,项目的架构有以下模块:
- Core模块(工具类、配置辅助类、数据库连接辅助类、XML文件辅助类)
- Store(StoreManager)、Backpack(ItemManager)、Item类
- Character模块(CharacterManager、Animation动画系统、角色状态类、角色移动类、角色装备类、角色技能类)
- UI模块(UIManager、UIScene、UIWidget)
- AI模块(BaseFSM、FSMState、FSMTrigger)
- Skill模块(SkillManager、SkillDeployer)、Skill类
- Statistics模块
仅仅算摸到Unity开发的皮毛,还需要了解很多的基础知识和工程方法。下一步计划把Unity提供的Demo项目都过一遍,有空就浏览Unity Manual和Script API,然后仿照Ori、Journey开发个2D、3D Demo就去求职。实在不行的话,只有先考虑其他的工作,再慢慢向着目标靠近。
以上是关于关于游戏开发的一点感悟的主要内容,如果未能解决你的问题,请参考以下文章
Cocos2d-x Lua游戏开发Mac环境搭建以及一点点感悟
Unity3d游戏开发unity3D OnTriggerEnter和OnCollisionEnter的一点个人心得(转载)