游戏相关思考

一、游戏是什么?

游戏的定义是什么?

看一下wiki百科给出的定义:
游戏是指人(思考:如果不局限在人,更广义呢)的一种活动,有目的,有规则,有挑战,有互动。
存在的解释:
或者为应付未来情景所做的练习,或者正常生命活动之外的消遣,或者被压抑之后的发泄
目的:
现在多是为了娱乐,或者身体,心灵,认知的提升,或者模拟得到某种结果
分类:
按使用的道具分类:
人手类:体育类(球类),单纯使用手脚类游戏,真实角色扮演(实时互动)
桌面类:桌游,飞行棋,龙与地下城,棋牌
电子游戏类:需要电子屏幕辅助
按游戏内容分类:
角色扮演:动作类,策略类
益智解谜:动作类,简单类

为什么会出现这些分类?

产生的具体情景不同:
场地大小,参与人数多少,身体耐力,偏向侧重点不同(体智心)。
足球篮球球类运动一般需要大场地,人数要求也多,更多偏向体的喜好。
桌面类要求就低点,更偏向与智。
电子游戏比较特殊,看似需要的场地不大,但是虚拟世界大,参与人数也可以很多,主要偏向智力和心的喜好。

游戏广义上的包含

也就说一切有一定规则的活动,都可以叫做游戏。
人在规则下的活动,动物的规则性活动,万物的规则性活动,都可以称作为游戏。
提取一段活动,制定一个规则。
游戏的演变:
早期的游戏还需要人真实的参与,现在的游戏由于都虚拟化了,更倾向于得到结果,过程的重要性被忽略了。
虚拟化也让游戏类型变得更多,也让游戏规则多样化。
游戏规则不受局限,就可以产生任意玩家想要的游戏,除了虚拟化所带来的局限性。
所以现在游戏更倾向于满足人的需求。
所以了解人非常重要。
还要了解游戏在这个时代的上下文。
而且还要快速相应,制作,部署。

电子游戏上下文的改变

虚拟化带来的重结果不重过程,是游戏上下文的改变。
原本游戏的重过程转变成了重结果,严格意义上来说不是游戏的原意。
游戏重结果导致玩家玩游戏的目的性更强,而且制作者可以轻易修改游戏的结果,不仅仅是简单的输与赢,也可以是死与生,或者某个条件的达到。很轻易的改变了玩家玩游戏的初衷,仅仅变成了为了达成一些无意的目的而去玩游戏。

体验过的游戏

小时候:滚弹珠,丢沙包,跑沙包,橡皮筋,跳山羊,抓石子,砸纸包,打弹弓,滚车轮,不许动,猜猜玩,老鹰捉小鸡,捉迷藏,打灯笼
初中:篮球,乒乓球,足球,羽毛球,其他球类
学业为中心,考试考卷为游戏,满分万岁。
电子游戏:贪吃蛇,打枪,侠盗,流星蝴蝶剑,魔兽,诛仙,卡丁车,地下城,飞飞,dota,英雄联盟,九阴真经,视频(每天看一下热门)

反思:

体育类游戏会锻炼身体
打牌是为了消遣
个人更喜欢为了未来情景而练习的游戏,但是这种游戏需要根据自己的情况制作,为自己定制游戏规则,而且还需要根据熟练程度调整规则

怎么制作游戏?

提取核心体验场景,制定规则,横向扩展故事内容,纵向扩展难易度,更倾向于是个过程。

为什么要制作游戏?

因为你想表达一个主题,一个思想,能够影响玩家。玩游戏过程中的情感体验会使你更容易接受一种思想。
通过视频游戏表现作者的思想,其中包括通过视频表现,通过阅读表现,还有更多的通过互动更深入的表现。
有了主题,再创作故事和元素,围绕着主题表现。
为什么是故事?代入感强?一种情景上下文。

玩家从游戏里面想要获得什么?

体验,一种情景的体验

游戏能给人带来什么?

这里先讨论屏幕类电子游戏,更多是情绪上体会,正面情绪:乐趣,紧张,兴奋,感动,好胜心强的人容易产生负面情绪:失败感,愤怒,这些都是基于代入感产生的,视频类游戏更容易给人代入感的体验。

游戏的表现形式

说到底,电子游戏仍然属于视频的范畴,所以电子游戏在国外的定义叫video game,也就是视频游戏。
电子游戏不仅仅是视频,视频只是媒介,更多的是互动。
互动是游戏在视频表现形式之外的另一个感知方式,更增强了玩家对情景的体验,使玩家更好的进入情景中。
视频:
游戏画面的终极表现,最终能达到现实的效果,物体的真实性,效果的真是性。
为什么不直接用现实拍摄?
简单的游戏可以,复杂的游戏成本太高,有些画面也做不到。
之所以电子游戏主要是视频的表现形式,是受制于传播媒介——屏幕的限制。
屏幕出现的原因是因为眼睛是人的主要感知器官。
人的大脑是眼睛的受体。
视频的目的是影响大脑。
所以游戏的终极目的是大脑。
大脑和游戏中间的传播路径——视频和眼睛和耳朵和手-做决定代表大脑的意识。
人的情绪影响到大脑的工作,不断的影响情绪达到影响大脑的目的。
视频游戏阉割了人的其他的感知器官,例如触觉、嗅觉、味觉、小脑平衡感、疼痛感、温度感知,湿度感知。
下一代游戏机应该会扩展对这些感官的部分支持。
视频包括画面和声音,手用来做决定,画面和声音足以表现当前场景的重要信息,足够到使手代表大脑做决定。
例如VR拳击:
场地:四方矩阵,现实和VR内对应,为了保证玩家安全性,提醒玩家不要越过边界。
设备:身体部位对应器,和VR内骨骼动画对应;痛点部位感受器,玩家之间交互点。

游戏的终极形态对现实世界的影响

有两种表现:
第一种,AR的终极形态,游戏与现实的结合,部分虚拟化游戏世界。
第二种,VR的终极形态,游戏与人体的结合,完全虚拟化游戏世界。
思想方面的影响:
生物的结构性,有序性,对抗宇宙大背景下的熵——无序性,形成两种思想,结构性倾向思想和混乱性倾向的思想。

驱动游戏持续进行的因素

是对现实的映射:为了实现愿景而行动。欲望会让情绪躁动,为了恢复心中的平静,会行动实现欲望,直到再次有欲望,不断循环。
需要动力:目标和成就。目标:解决当前的困难;成就:达成某个事件。

二、游戏制作

现实模仿

基本实现:
计算机图形,模仿现实人物,外表和光照。
外表:几何形状——网格,贴图——纹理。
光照:物体颜色在光照下的改变。亮暗灰度值(法线和光照的算法),光和颜色的反射和折射的不同(说明材质的不同,算法不同),特效:粒子和透明。
位移:复杂移动,有效的移动算法——骨骼动画,将多点集中到主要的支点的推算运算,从主干支到次干支的推算;简单移动;
摄像机:渲染范围大小,模型到屏幕的映射,深度对渲染的影响,渲染效率优化算法中的裁剪。

组件(middleware)包括

  • 渲染引擎=三维引擎=图像引擎:

    • 底层图形库:设置底层图形库独立接口,和opengl和dx进行隔离,类似SDL库。
    • 框架有OGRE、OSG、VTK、lrrlicht、RealmForge。
  • 人物模型 :人模型制作,MakeHuman(开源),制作rig 和skin;Blender

  • 遮挡剔除库(occlusion culling):Umbra,unity中使用。

  • SpeedTree:加速渲染树叶的库,unity和unreal使用

  • 脚本引擎:

    • unity底层用c++实现,再在各个语言里暴露一层接口。c#调用c++,c++中设置方法__declspec(dllexport),c#中DllImport; c++调用c#,两种方法,第一种动态调用,反射;第二种,c++中添加using namespace、#using “dll” 类名^ tmp = gcnew 类名()。
  • 物理引擎:PhysX(unity)和 Havok(unreal)

  • 碰撞检测系统:

  • 音效:FMOD声音处理库,unity和unreal使用;Wwise,游戏大厂使用的Audio库;

  • 视频:bin2

  • 人工智能:Serpent.AI ,unity中的ML-Agents

  • 网络引擎:Photon,UNET,Raknet

  • 场景管理:

  • 现存的游戏引擎:unity、虚幻系列引擎(免费抽成)、Frostbite Engine(专有)、CryENGINE(可下载)、Gamebryo(商业)、Doom3引擎(可下载)、

  • unity的分析:

    • 编辑器用到什么图形库?因为要实现跨平台,很有可能使用了Mono的图形库。自带的GTK#?
    • Inspector上的组件属性和代码相连,很有可能使用的是c#反射的特性,拿到变量名,再映射到面板。
    • 脚本拖动到物体上,怎么将脚本和物体连接?组件怎么相连?
      • 思考一下,如果让你来设计组件的思想,该怎么设计能够更好的面向图像编程。
      • 看一下框架:
        • 脚本的引用怎么方便获得:
          • 分析:
            Script——>MonoBehavior——>Behavior——>Componet(GameObject)——>Object
            GameObject(Componet)——>Object; GameObject包括了所有的Componet;
            最终查找到该游戏对象gameObject。
          • 如果是近层级查找,推荐Transform只能查找父子上下两层节点,也不能重名,第三层节点找不到。
            Transform.Find()查找子节点的Transform,然后Transform.gameObject获得游戏对象,再 gameObject.GetComponet()。
          • 如果是全层级查找,推荐GameObject可以全局搜索,但是找不到未激活的游戏对象,而且不能重名。
            GameObject.Find()。
        • 游戏对象之间互通消息:
          • 解耦和方式通信: 消息管理器,消息队列,注册消息,删除消息,发送消息,消息执行:判空执行。
            • 消息执行的过程:脚本实例存在游戏对象中,游戏对象销毁,脚本实例也被销毁,所以要注意存在实例的消息才会执行。
          • Componet.BroadcastMessage(methodName),向所有MonoBehavior中发送methodName消息。注意多个脚本methodName名称要一样,可向多个游戏对象广播。
      • unity editor下所有的文件都有一个对应的.meta文件,记录文件相关信息。每个文件都有唯一的Instance Id。 editor导入文件时生成的有关该文件它需要的信息。或者分散,或者统一放在一个文件夹。编辑器的做法都是这样。当需要用到该文件什么信息时,直接去取。

怎么制作游戏:
unity工具的制作分析,是为了做游戏引擎编辑器准备的,但现在的重点是在怎么使用这个引擎。
这两个方面的语意不一样,一个是为了制作游戏引擎的语意,一个是为了制作游戏的语意。
now现在我应该以什么语意开始?
当然是为了做游戏,但是先了解游戏的语意,再了解引擎制作的语意不是更好么,这两个应该同时进行,但是总体应该是从制作游戏的语意开始。
其实制作游戏的语意一开始就应景分析的很清楚了,但是现在不知道怎么开始制作游戏,所以一直在引擎制作这里徘徊。
现在是想每个引擎组件做个demo示例,是分散的,但是现在看来应该做一个完整的demo示例。
那就从做一个简单的联机格斗游戏开始。
demo设计:
格斗游戏,
人物,人物动作,技能,技能动作,场景,声音:背景音乐,人声,特效声音
两种网络:第一种,端户端型服务器;第二种,真实服务器。
格斗隔离:人物模型,人物动作,脸部动作,人物碰撞体,文物声音,技能模型,技能动作,技能碰撞体,技能声音,场景,可达到随意切换的目的。
群魔猎杀:生存模式,杀小怪,小怪追杀的AI算法。
积分榜
执行:
先去找模型。
模型:文件格式有.fbx .obj .max .ma .blend 。
unity中先将文件转换为.fbx 或者.obj :可以直接将.max .ma .blend 导入unity中,unity再去搜寻相关软件工具,该文件必须与工具相关联,然后unity会将文件转换成.fbx,再导入unity中。
.fbx只是网格数据,不包含贴图,所以另外需要贴图文件,所以正常的模型显示,需要.fbx和图片。
模型的概念:绑定,模型的骨骼;贴图,模型的纹理;材质:模型的光照显示;动画:模型的动作。
unity中的模型参数设置:Model,导入模型时的参数设置;Rig,绑定,Gneric,humanoid;Animation:单独拆分成.fbx文件;Material:查找贴图和外部材质的方式。
将model.prefab 加载到层级里时,会自动添加Animator组件。
控制模型动画的是Animator.Controller属性。
需要新建个AnimatorController文件,是一个状态机,添加Animation,形成动画切换的状态机。
model的动画是.fbx文件,这些文件包含了rig没法操作的部位的动画,预览这些动画时,预览窗口只显示部分部位动画,可以将model拖进预览窗口,查看完整动画。
是现在简单的转向,行走动画。

先让模型走:

怎么获得玩家按键的值:
unity editor打开Edit–>ProjectSetting–>InputManager–>增加按键,调大size的值,会在最后面增加,修改按键的name和positive button。
脚本中获取值:Input.GetAxisRaw(按键name) ,返回-1,0,1;Input.GetButton(按键name) ,返回bool;Input.GetTouch(按键name) ,返回Touch,触摸屏;

Animator:
制作动作的状态机,行走的动画效果。
新建AnimatorController文件;拖动动画文件.animation或者.fbx到Animator状态机编辑窗口里,新建一个状态;右击Transtion一个连接到另一个状态;点击连接线编辑设置转换条件变量。
遇到的问题:在使unity Animator 来控制角色动画切换的时候,动画不立即切换到指定动画,而是播放完当前动画在进行切换,是因为在动画状态的Transition中勾选了Has Exit Time 选项。

Transform方向旋转相关计算:
transform.quaternion 和 tansform.eulerAngles 不相等,需要转换:四元数和欧拉角,Quaternion.eulerAngles转换成欧拉角,欧拉角是指在x,y,z轴上的旋转角度。

求某个坐标点的欧拉角:Quaternion.LookLookRotation(坐标向量).eulerAngles。
旋转角度的运算,最好都换算成eulerAngles的运算。

Transform的local属性和Transform.Translate和Transform.Rotate的区别:
RectTransform 继承自Transform:position 和localPosition 世界坐标和相对于父节点的坐标。
transform.Rotate(Vector3,Space.Self/Space.World)这个Space.Self和local的概念不一样,是自我坐标系,默认是自我坐标系;
transform.Translate(Vector3,Space.Self/Space.World)默认是自我坐标系;
这两者都在transform的属性的基础上累加操作。
transform.positon += transform.forward
等价
transform.Translate(transform.forward)

移动的两种算法:
上帝世界移动:玩家在移动的坐标系是世界坐标系,transform.position;输入的向量坐标,转换为玩家在plane上的移动方向;先旋转到这个向量,然后在transform.forward
第一人称视角:滑屏,改变玩家自身旋转方向或者改变相机的方向;触屏大小,决定transform.Rotate(eularAngles)的大小;左滑右滑正反方向;移动是,先旋转再forward。
w,s,a,d:转动的方向,先旋转再forward移动:先transform.rotation再transform.forward。

向上跳跃位置的实现:
物理引擎和自己计算transform,实现三种方案:
利用物理引擎,x,y,z三个方向上分别计算值。
上跳时禁用物理引擎,上跳是transform打开IsKenematic,下跳时关闭IsKenematic;
直接设置位置transform,x,y,z,三个方向上分别计算;
注意在Update()里,关联上系数Time.deltaTime。

对于动作的理解:
所谓的状态机,意思是在一个时间点,只会呈现一种状态。
反应在控制器上,一个时间点,只会触发一次控制。
所以应该独立出来状态的属性,按键的触发反应到属性值上,还应该有个默认值。

Animation的用法:
自定义改变数值,分两种,线性改变和断点改变:
线性改变是curves面板,曲线取值:线性是相对的值,根据本地坐标改变,勾选Animator组件里的ApplyRootMotion属性,点击Animation的Inpect里的GenerateRootMotionCurves;
断点改变是dopesheet面板,序列帧取值:取消上面线性的勾选。
animation中的Events属性,可以设置动作执行中调用的方法,动作开始前所做的处理,动作期间所做的处理,动作结束时所做的处理,都可以在这个属性下设置,非常方便,动作中的任意时刻都可执行某些操作。
人物的animation需要第三方软件制作:MakeHuman(开源),Poser,Mixamo;独立制作,3D软件制作rig和skin,skin需要绑定到rig上做调整;然后动画单独存储,统一命名“模型名称@动作名称.fbx;或者存储在一个animaiton里面,再截取。

人物动作的原语:状态和位置。
状态是模型现在显示的形态。
位置是模型所在的坐标。

untiy动作制作流程:
1.准备材料:人物模型,要有绑定;人物动画;.fbx格式;
2.在主场景创建Plane
3.拖动模型到场景中,会自动添加AnimatorComponent,缺少controller控制动画。
4.新建AnimatorController,拖到AnimatorComponent的Controller属性
5.编辑AnimatorController,拖动animation到状态机,右击新建transition,点击transition连接线,设置是否HasExitTime,切换动作时是否要执行完当前动作之后再切换。
6.设置切换条件Condition属性,左边点击Parameters,新建Condition值。代码通过设置Condition值切换动作,在Condition添加Condition值,最好和动作状态名称一样;
7.AnimatorController中默认的状态:Entry,初始状态,右击SetDefaultState设置默认状态;Any State,任意状态,非常有用;Exit,会切换到Entry状态;
8.使用:定义一个状态属性_state字符串,,一般默认状态为“Idle”,记录状态的名称,在update里根据按键更新_state的值,最后根据_state的值设置最终显示的状态,Animator.SetBool(_state值,bool);位置根据状态的值变化。

AnimatorController制作的问题:
AnyState ->其他状态只执行一次,怎么实现:
状态机编辑时,状态太多,会导致连接线错综复杂。有个AnyState可以从任何状态连接到目标状态,但是目标状态也属于AnyState,接着会连接到目标状态,形成一个死循环,所以需要在目标状态执行完时,加一个AnimaionEvent关闭目标状态。并且连接目标状态到Exit状态,这样会自动连接到初始状态。这样就可以得到目标状态只执行一次的结果。
可设置多个Transition连接线到一个状态,这些连接线是或者关系。
Transition连接线和状态和Condition值的对应关系:
一对一对一:单一Condition值控制单一状态。
一对多对一:控制一系列状态,例如组合动作,挑起和落地的组合动作,用一个变量控制。
一对一对多:当多个Condition值全都满足时,才能改变状态,并且的关系。
多对一对一:多个Condition值只要有一个满足,就可以改变状态,或者的关系。
Animator最终优美形态:
Entry——>Idle待机状态;
AnyState——>其他状态;
脚本Update()中不断设置状态为”Idle”待机状态。
这种制作方法有一个问题,就是动作的切换速度不好修改。有些动作状态需要完成后再切换,有些需要立刻切换。
一般的做法是再创建transition线,对属性是否HasExitTime做选择。但是会让原先简单的状态机变得很复杂。
目前找到一个好的解决方案是,调用Animator.Play(“状态的名称“),可以立马切换动作状态。状态机保持都选择,是HasExitTime

物体之间的碰撞:
前面看了一下碰撞,碰撞体的位置应该按照rig具体部位的位置。
碰撞方法:
Collision.OnCollisionEnter,Collsion.OnCollisionStay,Collision.OnCollisionExit
Collision.OnTriggerEnter,Collision.OnTriggerStay,Collision.OnTriggerExit
Rigidbody与Collider碰撞后滑动的原因:
设置了PhysicMaterial物理材质,其中有friction摩擦属性,为0时物体表面没有摩擦,像光滑的冰面一样。
其中包括DynamicFriction运动时摩擦和StaticFriction静态摩擦系数,值为0~1。
Bounciness回弹系数,0~1。0不回弹;1是能量无损失回弹。
Rigidbody与Collider碰撞后旋转的原因:
Rigidbody的Drag是刚体遇到的空气阻力。
Rigdbody的AngleDrag是刚体旋转阻力。0是没有阻力,infinity是无限大阻力。
设置IsKinematic,勾选则表示不受物理系统设置,也不会碰撞collider时弹开。
独立开关包括:
或者设置f’reeze rotation: x,y,z。
或者设置freeze position:x,y,z。

触发Collider.OnCollisionXxx的条件:至少一方有Rigidbody,双方都有Collider。
触发Collider.OnTriggerXxx的条件:至少一方有Rigidbody,双方都有Collider,一方勾选IsTrigger。

模型的root节点加了Rigidbody,在模型的某个部位加Collider和Rigidbody,当执行Animation时,无法触发碰撞事件的问题:
需要子部位上的Rigidbody需要勾选IsKenematic属性(为什么),collider 勾选IsTrigger,触发Trigger实现,collision不能触发。
不要在子节点随便加Rigidbody,正确的做法是放在根节点实现,或者调用子节点的设置的另外的碰撞的方法。

碰撞检测和物理引擎是什么关系?
碰撞是一种物理表现,原意属于物理引擎的范畴,物理引擎包含了碰撞检测的实现。

Collision包含了所有的碰撞体双方的信息:Collision.ContactPoint是碰撞点涉及到的双方所有的相关信息。

一个小怪,和各种特效,是组合关系。

智能路径导航:
a.人物模型加Rigidbody,特别注意选择IsKenematic,原因:人物的位移控制,除了改变transform外,自动控制有三种,1)Rigidbody下UseGravity受物理引擎的重力控制,2)两个Rigidbody会产生碰撞弹开位移,3)PhysicsMaterial会影响表面摩擦位移的速度和弹开的程度大小。

游戏架构:
ECS架构:实体组件系统。
E:Entity实体,由组件组成;C:Componet组件,只有数据,没有方法行为;S:System系统,只有行为,没有数据。
一个实体有多个组件,一个系统识别实体里的特定组件执行数据操作。
游戏World遍历系统里的update更新执行,系统更新组件里的数据。
一个System配有一个System单列,保存一些状态数据。
延迟操作,复杂的行为单独提取出来操作。
System之间共用的行为放在Utility。
Zenject框架


功能实现

  • 故事系统:

    • 声音和画面。业务需求:人物动作、声音、镜头切换。
    • 声音包括动作产生的声音,对话和有意义的信息更多用文字静态画展示:原因1)配音工作量大(人工智能,合成音)2)方便保存和重复查看3)占用内存小(声音可以实时下载)
    • 画面包括静态画和动画。静态画包括文字信息和图片信息的展示;动画需要人体骨骼动画和摄像机镜头转换和时间轴。
  • 动作系统:

    • 骨骼动作制作。使用骨骼的算法制作模型人物动作。
    • 编辑动画,时间轴上特定时间点上的模型状态。
    • 时间和模型形态的对应关系。
    • 时间轴编辑器和模型骨骼形态编辑器。
    • 模型骨骼形态之间的平滑过渡算法,一般是差值算法。

粒子系统:
粒子是很微小的颗粒。像雾,雨,火花等
计算机很难模仿现实中的粒子特效,因为特效用到的粒子数量多,加上光照计算等,运算量大,所以需要做优化算法。
可编辑属性:粒子的形态,数量,形状,总体持续时间,单个粒子的存在时间,单个粒子移动速度。

信息系统:
玩家信息:为了展示数据,组成元素:文字,按钮,图片,滑动面板。
游戏相关总体设置:音乐开关、画面表现程度等。
游戏启动环境参数设置:全屏或者窗口等。

核心玩法系统:
1)规则和剧情是一个意思,剧情是规则的具体体现的一种表现方式,达到剧情也就是达到一定规则。
规则:打斗游戏是杀死对方;获胜条件判断。规则是判定单独提取,获胜和失败的接口可以单独提取出来。
2)游戏物体智能算法
自动寻路导航
3)NPC:任务列表配置

主线支线剧情奖赏({[物品ID,数量]…})
1这里是第一条!
这里是第二条!
{ [1,2],[2,3]…]
1这里是第一条!
这里是第二条!
{ [1,2],[2,3]…]

数据配置表
玩家——NPC 的交易
交易是以物换物,给我你的数据,给你想要的东西。
任务节点数据结构
策划制作剧情工具:需要制定游戏编辑器工具么,还是使用现有通用的工具。
最好的策划工具什么样子?直接在游戏里面编辑,使用前期示意图,编写剧情。
问题是到底需不需要放在游戏里面,放在游戏里面如果能直接运行,并看到结果,这不是更好么
是的,这种是最好的,放在游戏里面的目的是为了看到直接运行结果,如果看不到,就不需要放在游戏里面。
4)技能和装备:
技能和装备性质相同。技能提供形态改变、伤害、防护,会对双方的形态产生影响。装备也会提供形态改变、伤害、防护,会对双方的形态产生影响。
技能形态效果有范围性和单一性,范围性是指范围内所有人都有效果,技能效果也是单独的物体。
技能的消失时间是和被攻击者有关系。
施放技能的全过程:
涉及到的对象有技能图标,鼠标,施术对象,被施术对象,技能形态,技能在被施术对象上的形态。
其中涉及到六个对象。
封装好各自表现,有技能图标的点击事件执行整个过程。
数值计算值单独接口提取原数据配置表,计算公式也是单独提取原数据配置表。
技能数据配置表。

人机交互系统:
人与机器交互控制的方式:目前常用控制器和遥感,其他还有距离和运动感受器。
怎么将控制器接口和人物连接?提取单独的控制接口,人物都可以连接控制器,控制器连接具体物理设备的接口也是单独的,两头独立接口,连接人物和设备。

网络在游戏中怎么实现:
两种实现方式:
第一种:a和b对打,a发技能,a这边播放技能动画,a发送通信到服务器,服务器发送到b这边,b这边播放a的技能动画;
第二种:a和b对打,a发技能,a发送通信到服务器,服务器收到后同时推送给a和b这边,a和b同时播放a的技能动画;
人物移动也是发送消息到服务器,服务器再同步到相关有联系的客户端。
a和b怎么确定有联系?
游戏中是根据地理位置来确定,如果a这边能看到的所有人应该都算作有联系,只要b在a的视野之内,就算做有联系。
a应该有屏幕地图标识,如果其他玩家的这个属性和a相同,那么他们需要收到a的外形改变消息,服务器也应该发送使外形表现一致的消息。如果a和b正在进行交互,则发送的消息会不同。
也就说现在的客户端在联网的状态下,仅仅是个解释器而已,不断的接收服务器发来的消息并进行解释执行。

游戏服务器的实现:
账号表,验证登录服务。
思考:是应该所有数据都放在一张表上,还是每个业务单独分离出一张表?
都放在一张表,优点:所有数据都可以查询到,缺点:表大,数据查询慢,容易出错,鲁棒性底,业务之间互相影响。
放在不同的表,有点:查询块,鲁棒性强,此表损坏不会影响其他的业务数据,缺点:数据共享访问慢,跨表查询也慢。
服务器逻辑和数据库查询逻辑应该互相独立,为了切换数据库方案方便。
服务器逻辑提供下游接口,对数据库查询的接口。
a和b实时数据缓存。因为a和b数据变化频率大,采用缓存更好,需要注意的是缓存里的重要数据需要实时存储。
a——网络——缓存——(重要的数据)数据库
                                                                            |
b——网络———|

账号支付系统:
支付宝支付系统。微信支付系统。Apple支付系统。其它第三方支付SDK。
设置独立的支付接口,方便接入第三方支付SDK。

账号登录系统:
设置独立的接口,方便接入各种第三方账号SDK。接入的SDK同时放置在一个类里,加上开关控制启动。

游戏发布到市场:
上架到第三方应用市场。
设置独立接入应用市场接口,方便接入第三方应用市场SDK。

游戏下载:
cdn(内容分发网络)提供商提供并发网络,使玩家更快速的下载。网络更新包,也放在cdn上,一切想要玩家快速更新的数据,都应该放在cdn上。

游戏热更新:
手游:1)ILRuntime ,此库可以直接更新c#代码。2)toLua+LuaFramework,更新lua文件。
补丁包,游戏更新的机制。
DLC游戏扩展包:游戏资源下载

游戏优化需要做到什么程度

优化本身的意义就是表现的更好。表现在游戏上主要是指视频。视频的播放原理是最少每秒30帧静态图片连续切换,人眼能够辨识的最低帧率。如果屏幕播放视频少于这个帧率,就会出现卡顿的现象。所以这就是优化的最低限度。如果再优化达到更高的帧数,人眼能够
当然性能占有率越低越好,但是只要没有出现明显的卡顿,就不需要优化。这是后话,只是在所有的工作完成后,根据游戏的表现对局部进行优化。一般需要优化的问题包括cpu,gpu,内存占有率高的问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值