我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>应用>技术动态>技术应用

游戏开发的过程是怎样的

文章来源:sohu 作者:Frank 发布时间:2013年02月27日 点击数: 字号:

首先,要知道,游戏开发可绝对不仅仅是写代码而已。像游戏的场景、人物模型都是在如 Autodesk 3DS max 、Autodesk Maya、Blender 等三维模型软件制作出来的。模型表面的贴图也是要通过 PS 画出来或者通过照片加工而得到的。

然后再说说游戏到底是一个什么样的程序。游戏要时时刻刻接收用户反馈,根据用户反馈来改变某些状态,如物体的位置等。因此,电子游戏的最大特点就是实时反馈,离开这点就不叫游戏了,而是 CG 动画。所以,我们可以说,游戏就是维护一个实时变化数据系统的程序。

现在说说问题中的,怎么让一个角色行走:人物的行走基本就是位置的变化加上播放行走的动画。

位置的变化,如果角色是要靠人的操作的话,那么就要在每个特定的时间间隔(通常是每画一帧后)内扫描键盘、摇杆按键等,如果按下了相关按键,则产生位移。根据高中物理,位移 = 速度 x 速度的方向 x 时间差。写成代码(Unity3D 游戏引擎的 JavaScript 代码,且暂不考虑用户输入)就是

transform. translate(speed * speedDirection3D * Time.deltaTime)

这个代码每画一帧执行一次。注意,speedDirection3D 是三维向量类型;Time.deltaTime 距离上一帧的间隔。这样,人物就可以动起来了。如果加上用户按键反馈,那也很简单,改成类似这样的代码就可以了:

transform.translate(speed * Vector3( inputLeftRight, 0, inputForwardBack ) * Time.deltaTime)

这里,inputLeftRight 和 inputForwardBack 就是根据每帧扫描键盘得到的数值,比如按下左箭头后, inputLeft 的值设置成 1.0,右箭头则是 -1.0。就这样,用户就可以使用键盘操控人物的行走了。不过实际上对于用户按键输入的处理要比这一行代码复杂一些,因为用类似上面这个代码的话,人物在按下按键后就立刻按照预设的速度行走,松开按键后就立刻停住,与现实世界感觉相差很大,因此要对输入的结果再处理一下,确保人物在各个运动状态之间能够平滑过渡。

再说说播放动画。这里的动画是指人物三维模型的诸多动作,而不是我们在电视上看到的那种动画。动画一般都是由动画师在如 Maya、Blender 通过骨骼绑定、关键帧插值等一系列办法一点一点地调出来的。除了由动画师调出动画,现在有一种更先进更方便的方法是依靠动作捕捉设备,让一个真人带上这个设备做出各种动作,然后这个设备就可以记录下来供游戏中的虚拟角色使用。这个东西差不多就像这样:


让真人带着设备,被记录下来

当前动作捕捉技术已经非常成熟了,甚至连人物的面部表情都能精确地捕捉到。

捕捉到的游戏动画一般都保存在三维模型中,如图:


捕捉到的游戏动画保存在三维模型中

游戏里这个角色带有这些动画,需要时就播放相应的动画即可。还有,在切换运动状态时,通常动画是混合播放的,这样来使角色动作更自然。

除了人物位置的变化以及播放动画外,人物动作还有一个重要的元素是碰撞检测。就是检测和场景的碰撞,避免走着走着直接从墙里穿过去,或干脆从地板直接穿过去。通常,碰撞检测是基于一个比较简单的几何体进行的,如图:


碰撞检测

在这里,我们用一个胶囊形状的几何体代替人物角色模型来进行碰撞检测。为什么不直接用人物模型呢?原因很简单,用简单的几何体会大大加快碰撞检测计算的效率。游戏开发的另一个很重要的意识就是,要时时刻刻考虑硬件性能。比如贴图占用空间要尽量小,三维模型不能过于复杂,决定表面材质的着色器使用时也要考虑性能问题。硬件性能问题在如 iPhone 等移动设备上尤其要注意。

碰撞检测的另一个作用,就是用在游戏逻辑中,如人物吃血瓶就可以抽象为人物碰撞检测几何体与血瓶几何体的碰撞,检测到这一事件后处理一些逻辑,如人物血量增加等。诸如这种用途的还有如火箭弹爆炸、飞机坠毁等。

>>相关产品

  • Unity3D PRO 虚拟现实、跨平台应用程序开发引擎
  • 动作捕捉系统
    • 暂无资料
    • 暂无资料
    • 暂无资料
    • 暂无资料
    • 暂无资料