Unity游戏引擎四篇

2024-05-29

Unity游戏引擎 篇1

从当今游戏行业的发展趋势来看, ACT (Action Game, 动作游戏) 、MOBA (Multiplayer online battle arena, 多人在线战术竞技游戏) 以及FPS (First-person Shooter, 第一人称射击游戏) 等强竞技性的客户端游戏开始进入主流游戏市场;轻度的、休闲的移动游戏逐渐得到主流玩家们的认可;随着移动互联网的发展, 游戏设备也在逐步丰富, 除了PC以外, 平板电脑、智能手机以及电视机等, 均可以成为游戏终端, 这些设备提供的新玩法与新体验, 也对传统网络游戏有效地进行了扩充, 进而推动了中国网络游戏市场规模的增长。

在平台选择方面, 几乎所有的PC端用户均选择Windows系统, 原因是Windows系统拥有着极大的用户基数, 游戏引擎也相对完善。PC端网游具有玩家基数大、相对稳定的特点, 移动端网游则推广速度快, 操作简单。所以兼具PC和移动游戏的网游可以在短时间内迅速发展起来。

Unity跨平台游戏开发引擎, 具有开发速度快、灵活, 跨平台能力强的特点, 可一键将游戏部署在IOS, ANDROID, PC, WEB, PS3, XBOX等各种平台中, 可以用来开发游戏客户及服务器端。目前Unity引擎支持Javascript, C#和Boo等3种编程语言进行开发, 客户端与服务器端的交互使用是通过Socket进行网络传输。玩家的所有需要与服务器端的操作都变为请求, 请求通过后服务器端会给客户端发送请求回调事件, 客户端接收到回调后再进行剩余操作。

1 服务端/客户端系统规划

网络游戏的服务端通常用于游戏逻辑事物的处理、各种数值的计算以及安全性的验证。服务端通过事先设计好的协议接收所有客户端提交的数据, 执行不同的逻辑处理后再将结果通过协议发送给需要接收的客户端。网络游戏的服务端通常用于游戏逻辑事物的处理、各种数值的计算以及安全性的验证。对于网络游戏服务器来说, 单个服务器承载能力有限, 不同的游戏需要不同数量的服务器, 而服务器不仅仅是数量上的增加, 更应该根据功能进行划分。本游戏服务器系统架构如图1所示。其具体划分应遵循如下原则:

(1) 分离游戏中占用系统资源 (CPU, 内存, I/O等) 较多的功能, 独立成服务器。

(2) 以多线程或多进程的编程方式适应多核处理器。

(3) 在同一个服务器架构下, 应尽可能的复用某些服务器 (进程级别的复用, 比如场景服务器) 。

(4) 运行时玩家数据的保存、修改及数据流向应该是设计的焦点, 它同时也决定了服务器应该如何划分。

(5) 服务器的划分应该适度, 在保证清晰的数据流向的前提下, 根据游戏的类型和规模尽量减少服务器或服务器进程的个数, 以减少服务器之间过多的复制数据、锁冲突 (使用共享内存进行通信时) 。

(6) 主要按照场景划分进程, 若需按功能划分, 必须保持整个逻辑足够简单, 并满足以上 (1) , (3) 两点。

游戏服务器分为业务逻辑层、协议解析层以及网络接口层。按照数据包接收处理流程, 首先是玩家接口层接收到数据后, 将数据交给数据解析层, 解析层按照设定好的方式将数据解析出来, 读取数据头应该执行哪一条操作, 将数据继续传给业务逻辑层, 逻辑层负责角色升级、伤害计算、物品获取等操作。

由于游戏在同一时间可能要处理大量的信息, 故在服务器端使用单进程多线程的异步处理操作, 能在很大程度上降低服务器的压力。另外, 对于部分敏感操作和高频操作, 数据解析层解析后需要对玩家进行数据验证, 比如加入时间戳以此保证数据的正确性。

客户端主要有视图层、逻辑层、网络层等三大模块, 如图2所示。其中视图层用来控制物体的显示, 角色的各种动作, 音频文件的播放等;逻辑层范围比较大, 控制了客户端大多数的操作, 包含角色的移动, 伤害的计算, 点击寻路的操作等;网络层负责与服务器交互, 多用于接收服务器端发来的数据, 解析然后交给逻辑层来执行, 或者将逻辑层发来的请求转发给服务器端。

为了开发的方便, 以及出于效率方面的考虑, 需要编写一个Global类来存储或处理全局数据, 该类使用单例模式, 这样降低了内存中栈的开销。比如时间, 网游不能够使用客户端时间进行操作, 也不易在每次使用时都调用服务器端的时间 (这样做也有数据在网络上传递时存在延迟性问题) , 因此在刚进入游戏时, 给服务器发送一个获取时间请求, 该请求包含发送时的客户端时间, 服务器端将根据接收时的时间和客户端发送时的时间重新进行时间差计算, 同样发回给客户端, 客户端进行第二次时间差计算即可获得精确的服务器端时间, 并把该时间保存在Global中的NowTime属性中以方便以后使用。

鉴于游戏面向的多平台特性, 在网络通信协议方面应该兼顾各种平台的特点。可以使用和PC网游相同的协议结构:一是降低了工作量;二是便于多平台的迁移部署。该游戏中的协议格式设计如下:通信协议的头5位为协议号, 用来区分不同的功能, 比如c1002表示登录, c9001表示退出登录, 原则上每个协议号对应游戏的一项功能, 并且为了统一管理和理解, 所有由客户端发给服务端的消息前面加c (Client) , 由服务端发给客户端的消息前面加s (Server) 。第6位和第7位为本条协议的总段数和当前段号, 因为可能某次发送的信息长度过长, 需将协议内容分段发送, 第8位是数据段的长度, 其上限定为1 024 B。

2 关键技术

2.1 登录

玩家进行登录操作, 点击登录按钮后, 客户端程序会将填好的账号和密码信息发送给专门管理Socket的SocketManagement类, 该类将信息转换成byte[]类型, 发送给服务器端。至此, 登录按钮的功能完成。服务器端接收到消息后会连接数据库进行验证, 将验证的结果使用服务器端的SocketManagement类发送回客户端, 客户端接收到消息后进行解析, 根据回调内容进一步显示。

登陆模块协议示例:

2.2 数据同步

3D对战网游对数据同步具有一定的实时性要求, 对战时不像回合制网游那样需要进入特殊战斗场景, 3D对战网游需立即将战斗情况同步给其他玩家, 对数据同步要求性较高。这样才能保证每个玩家在屏幕上看到的东西大体是一致的。解决同步问题最简单的方法就是把每个玩家的动作都向其他玩家广播一遍, 这里存在两个问题:向哪些玩家广播, 广播哪些消息;如果网络延迟怎么办。对于第一个问题可根据具体游戏要求来解决;而对于第二个问题, 可以采用预测拉扯的解决方案, 在预测拉扯中首先要在服务器端的每个玩家连接的类里定义一个属性值代表预测误差。在玩家登陆的时候, 对客户端的时间和服务器的时间进行比较, 得出来的差值保存在TimeModified里。服务器广播消息的时候, 根据要广播对象的TimeModified, 计算出一个客户端的CurrentTime, 然后在消息头里面包含这个CurrentTime, 随后再进行广播。并且同时在玩家A的客户端本地建立一个队列, 保存该条消息, 获得服务器验证后, 从尚未被验证的消息队列里面将该消息删除, 若验证失败, 则返回A的原始状态。玩家控制的角色在释放一个技能时, 首先将“释放技能”的信息发送给服务器端, 同时客户端播放释放技能的动画。服务器端将该消息依次转发给同服务器、同场景下其他玩家, 其他玩家里的相关控制器会将实例化出来的角色发送播放技能动画的消息, 即实现了数据同步的功能。

同步个人信息协议示例:

2.3 移动同步的两种方法

(1) 实时同步

该方法为只要一个玩家发生了位置移动, 甚至没有移动只是转向, 就立刻把这个消息发给服务器, 服务器立即把该玩家的移动信息发送给该场景下所有的其他玩家。该方法具有较高的实时性, 但服务器压力很大, 比较适合3D游戏实时战斗并且一个场景中人数并不是很多的情况, 比如《穿越火线》这样的游戏。

(2) 定时同步

该方法为固定0.5 s或者1 s从服务器端获取一次该场景下所有玩家的位置信息, 然后客户端根据这些位置信息显示其他玩家的位置。这种方法对游戏实时性要求不高, 可以处理多个玩家的场景, 比如《梦幻西游》一个场景中可能就存在1~2万名玩家。

本游戏最终选定使用实时同步的方法来处理其他玩家的位置信息。具体处理步骤如下:

(1) 客户端点击地面触发移动请求。

(2) 本机角色开始移动, 并且将目标位置发送给服务端。

(3) 服务端接收后, 将该玩家的ID、目标位置等相关信息转发给相同场景下的其他所有玩家。

(4) 其他玩家的Socket管理器接收到服务器发来的消息后, 从自身的玩家列表中找到相同的玩家对象, 并给该对象一个移动指令, 移动目标和原玩家目标位置相同。

通过以上处理步骤就实现了实时同步的效果。同样地, 角色动作状态、战斗状态等信息也通过这种方法实现。

2.4 心跳检测

心跳检测是指固定一段时间服务器像客户端或者客户端向服务器端发送一段特殊的Socket信息, 以此来判断客户端与服务器端是否仍在连接状态。其固定的周期性与作用性类似生命的特点故名心跳检测。

心跳检测可以由客户端发送, 也可以由服务器端发送。为了减少服务器的压力, 本游戏使用客户端发送, 服务器端检测的方式来执行心跳检测操作。

首先, 客户端实例化一个Timer定时器, 开启后每隔20 s向服务器发送一个Socket信息, 这里使用“0”, 服务器端接收到客户端发来的消息后, 将对应的客户端实例中的LastSendTime修改为接收时时间。

在服务器端, 也实例化一个Timer定时器, 间隔触发操作的时间与客户端相同, 当触发操作时, 遍历所有已经连接服务器的客户端实例, 检测他们当中的LastSendTime是否大于1 min (根据游戏需要也可以改小此值) , 若大于1 min则说明3次心跳检测都没有发过来, 则判定为已经断开连接, 此时服务端执行Socket.Shutdown (SocketShutdown.Both) ;操作断开连接, 并从客户端实例链表中移除该实例。

2.5 序列化与反序列化

序列化是指在TCP/IP协议中, 客户端通过Socket将详细信息发送给服务端, 而在发送之前需要将数据转化成byte[]类型, 这样就丢失了原有数据类型, 通过一定的方法将数据转成byte[], 在服务端接收后又能成功转换回来的技术叫做序列化与反序列化。

一般序列化与反序列化的转换有三种方法:二进制序列化, SOAP序列化, XML序列化。

二进制格式和SOAP格式可序列化一个类型的所有可序列化字段, 不管它是公共字段还是私有字段。XML格式仅能序列化公共字段或拥有公共属性的私有字段, 未通过属性公开的私有字段将被忽略。使用二进制格式序列化时, 它不仅是将对象的字段数据进行持久化, 也持久化每个类型的完全限定名称和定义程序集的完整名称 (包括包称、版本、公钥标记、区域性) , 这些数据使得在进行二进制格式反序列化时亦会进行类型检查。SOAP格式序列化通过使用XML命名空间来持久化原始程序集信息。而XML格式序列化不会保存完整的类型名称或程序集信息, 使XML数据表现形式更有终端开放性。如果希望尽可能延伸对象的使用范围时, SOAP格式和XML格式是理想选择。

综合本游戏特点, 发现这三种方式都或多或少有些不足之处。最终, 在本游戏中使用了一个自定义的序列化和反序列化方式。不同的数据内容之间用“|”分隔开来, 数据头仍是5位的如“c1001”这种形式, 一条完整的数据包可能是“c2002|amdin|123456”。然后将整个数据信息转为byte[]类型进行发送, 接收端收到信息后首先转换为string类型, 再用string里split () 方法取出数据进行反序列化, 然后解析数据包头是哪一个, 根据不同的数据包头来确定不同的操作。这样就避免了前面几种方式的不足之处。

3 服务器测试

多数游戏在逻辑流程方面要远复杂于一般的软件, 所以需要更为严谨的测试流程。本游戏测试主要有以下几个方面:游戏平衡测试、游戏压力测试、服务器测试。服务器开启后界面如图3所示。

继续选择服务器界面, 服务器信息由客户端发出请求, 服务端返回所有服务器信息, 客户端收到返回并解析, 动态生成服务器按钮。测试结果显示服务器及客户端数据操作正常。

4 结语

针对3D对战游戏基于Unity引擎开发过程中所面临的网络设计问题, 本文采用了在服务器端和客户端不同的系统规划来满足其设计要求, 将预测拉扯结合心跳检测机制确保网游中较高的实时性, 并通过选择特殊的序列化方式实现网游中的信息传输需求。

参考文献

[1]优美缔软件有限公司.Unity4.x从入门到精通[M].北京:中国铁道出版社, 2013.

[2]MENARD M, WAGSTAFF B.Game development with unity[M].[S.l.]:Cengage Learning Custom Publishing, 2014.

[3]WATSON K, HAMMER J V, REID J, et al.Beginning Visual C#2012 programming[M].Birmingham:Wrox Press, 2012.

[4]陈明.计算机网络协议教程[M].2版.北京:清华大学出版社, 2008.

[5]詹成, 张伟.基于数据流前端检测的快速协议识别[J].现代电子技术, 2014, 37 (23) :58-61.

Unity游戏引擎 篇2

关键词:Unity,NPC,碰撞检测,人工智能

Unity3D这款游戏引擎具有很强大的跨平台性, 同时也具有强大的兼容性, 比较容易入门, 也比较适合水平不太高的手机游戏开发人员。并且, 该引擎的相关文档和教程都十分丰富, 而且, Unity3D的技术架构具有特殊性, 能够实时生成查看功能, 适用性强, 使开发的流程简单化, 能够方便广大用户的使用。

如今, 市场上的关于射击类的游戏, 其中有60%以上是通过Unity3D游戏引擎开发的。由此可见, Unity3D是射击类游戏的最基本使用最广泛的游戏引擎。这篇文章针对第一人称射击类游戏的开发过程中的相关技术问题展开了详细的说明, 对Unity3D的运用中的关键技术进行了详细的阐述, 对于其他用户灵活的使用Unity3D游戏引擎有着十分重要的意义。

1 相关工作

这篇文章是以Unity3D为开发平台, 对碰撞检测技术人工智能技术进行研究。

碰撞检测技术的主要目的有三个:检测模型之间是否发生了碰撞, 反馈出发生或即将发生碰撞的部位, 动态的查询模型之间的距离。进而针对碰撞后的反馈进行针对性的动作。碰撞检测技术广泛应用于各种系统中, 比如时下比较流行的游戏英雄联盟和守望先锋, 都离不开碰撞检测算法。

人工智能技术是最近几年兴起的一项技术, 简称为AI, 使计算机具有动物或人类的某种智力, 这有助于我们作出特别的决定执行什么一些程序。另计算机只是能接受数据、执行逻辑的电子设备.和高速运算, 输出结果。

因此, 人工智能 (AI) 本质上是使计算机能够思考并且像活的有机体那样决定执行特定的操作。人工智能只是一个通用术语;它的实现和应用是不同的, 实现不同的目的, 解决不同的问题。

2 前期准备工作

从游戏的可玩性角度来说, 射击类游戏是一款十分容易获取用户粘度的游戏类型, 近些年来在市场上的一些列的射击类游戏都取得了不错的成绩。我们的这个游戏是模范市场已经有的射击类游戏的模式进行开发和研究的, 在一些具体的细节方面进行了调整和优化处理。

首先, 是运用3DMax搭建了一个完善的游戏界面和游戏场景, 增强用户的沉浸感;其次, 我们在用户与计算机的交互上运用了人工智能技术, 使得游戏中的AI角色更加具有真实感;最后, 游戏的盈利模式则是通过与其他游戏的广告商合作收取广告商的加盟费和游戏的道具费用等。

3 游戏UI设计

游戏玩家对游戏的评价主要有两个方面, 一个是主要的也就是游戏的模式和操作, 而另一个十分重要的因素也就是游戏的美工。好的游戏离不开精良的美术内容。这里说的游戏美术就是游戏中出现的可视化内容, 包括游戏UI界面, 游戏场景及角色等, 游戏美术决定游戏的界面风格, 是游戏设计与开发过程中不可或缺的重要组成部分。具体来说本款作品的游戏美术需要完成UI界面的设计、游戏场景和道具的设计与制作、人物角色和NPC形象的设计和建模以及动画的制作等。

4 核心技术要求

上文介绍了美术制作的部分内容, 现在介绍一下程序设计部分。程序需求是一个游戏的核心, 是实现预期效果的必要保证。即用一些脚本和代码将美工设计的好的各种素材联系起来并进行交互。程序需求在游戏设计开发过程中十分重要, 决定着一个游戏现在运行过程中是否能完美还原策划的预期效果和运行时是否流畅。

这款手机版的FPS射击游戏中涉及到多种人工智能技术, NPC, 主角, 场景中障碍物, 道具等一些列对象, 需要通过脚本来控制个对象之间的关系以及互动。当前介绍碰撞检测技术, 人工智能实现技术。

4.1 人工智能实现技术

4.1.1 内部需求

在三维射击游戏中。我们所设置的AI角色即NPC需要了解他们自身所处的周围环境, 他们所处的世界的相互作用, 以便于他们按照程序做出相应的决定, 执行特定的操作。

这些信息主要包括以下几个方面:

1) 玩家位置:NPC与玩家的相对位置信息主要作用是用于NPC决定是否执行击, 或追逐等操作。

2) 玩家的健康状况和自身的健康状况:这里主要指的是射击游戏中玩家所操控的角色的血量和NPC自身的血量, 主要是为了让NPC做出正确的判断, 是执行继续前进或者撤退。

3) 在游戏地图中的资源位置:在射击游戏中主要是需要玩家占领的地域资源, 当玩家操作的角色倾占了该地形资源的时候, NPC就会发出相应的攻击和追逐的动作与玩家进行实时的互懂。

4) 其他单位:除了以上的游戏中的对象, 所有其他的单位, 也必须要获取他们的位置以及性能等其他信息, 比如, 场景中的障碍物和建筑, NPC不能够穿越他们, 而是需要躲避。

4.1.2 基本的感官系统

人工智能系统会模拟感官, 比如视觉, 声音, 甚至气味追踪和识别目标。这就使得NPC会有自己的感觉, 如感知, 嗅觉, 视觉和触觉等。这些感觉将寻找特定的操作来使NPC完成相对应的执行任务从而达到与用户进行交互的效果。比如, 当玩家控制的角色与进入NPC的事业范围之内, NPC会执行攻击任务, 对玩家进行攻击, 并在攻击的同时执行移动操作, 向着玩家操控的角色靠近。或者, 当玩家控制的角色对NPC进行攻击NPC会根据自身的健康状况和玩家操纵角色的健康状况以及周围的环境等综合因素做出判断, 对玩家进行攻击还是撤退。

4.1.3 射击游戏中的AI角色

一款游戏若是缺少交互就无法生存, 所以射击游戏中的AI角色是射击游戏的核心部分, AI角色的人工智能程度也就决定着一个射击类游戏的趣味性和可玩性。

AI角色具有两种感觉, 视觉与触觉。透视感即视觉将检查是否玩家角色是在一套可见的范围和距离内以决定AI角色是否要采取相关反射行为。触觉将检测如果敌人的侧面撞上了方块对撞机, 很快就要环绕我们的AI角色了。正如我们以前看到的, 我们的玩家角色将会发现敌人信息。所以, 当AI角色的这些感官被触发时, 他们发 (下转第18页) (上接第11页) 现玩家角色并作出程序里写入的相应动作与玩家进行交互。在我们这款射击类游戏中, 僵尸的视觉系统看到了玩家的角色, 僵尸将会按照一定的线路追逐玩家并在一定的距离范围内对玩家进行攻击;玩家的子弹如果与僵尸发生碰撞, 僵尸的触觉系统将会让僵尸的血量发生减少的变化, 当血量降低为0时, 僵尸死亡;玩家掷出的手雷发生爆炸, 触碰到僵尸的触觉系统, 僵尸将会被弹飞并死亡。这些都是AI角色的人工智能技术的实现, 即玩家实施的每一步操作, AI角色都会做出对应的操作予以回应从而到达与玩家进行交互的效果。

4.2 碰撞检测技术

碰撞检测技术有各种不同的算法, 优秀的碰撞检测的算法可以很好地增强游戏中对象之间进行碰撞的的真实性而且能够减少CPU在计算碰撞检测相关数据的时候的内部计算时间。

这款射击类游戏在Unity3D中用如下Java Script脚本进行碰撞检测:

将如上的碰撞检测的On Collision Enter函数绑定到对象obj上, 当这个物体被其他物体碰撞时函数被调用。

碰撞检测技术几乎是任何游戏中都必须要用到的技术, 玩家与游戏场景中的各个对象和游戏中AI角色之间的交互动作都是在碰撞检测技术的基础上来实现的。碰撞检测的算法根据使用的对象和实际的情况会分为很多种, 其中有距离预测算法、时间预测算法等等。距离计算算法是一种计算量比较大碰撞检测算法, 但是这种方法的计算的精确度高, 更具有真实性。这款射击类游戏采用的就是距离计算的算法。当物体之间发生碰撞以后, 会出现什么样的效果和做出什么反应都是调用上面提及的函数来进行进行碰撞检测的计算。

5 总结

随着计算机技术的日益发展, Unity3D游戏引擎越来越平民化, 人工智能技术也渐渐的被人们熟知并加以运用到计算机技术中。这篇文章在对Unity3D游戏引擎精心研究的基础上结合FPS射击类游戏的特点, 通过3D建模技术和次世代贴图技术, 运用碰撞检测和人工智能交互技术进行设计与开发。总结出射击类游戏相关场景的设置以及AI角色的设置的一些简单的方法。同时, 这款游戏的故事情节也略显不足, 人物角色单一, 游戏模式也不够多元化, 还需要进一步的改进与深化研究。

参考文献

[1] (美) 罗素.殷建平译.人工智能:一种现代的方法 (第3版) .清华大学出版社, 2013-11-01.

[2]伍传敏, 张帅, 邱锦明.基于Unity3D的FPS游戏设计与开发[J].三明学院学报, 2012, 29 (2) :35-40.

Unity游戏引擎 篇3

关键词:Unity3D;Andoird;游戏开发

一、引言

Unity3D是由Unity Technologies开发的一个让开发者创建三维游戏、建筑可视化、实时三维动画等类型互动内容的跨平台的游戏开发工具,是一个整合度很高的专业游戏引擎。Unity可运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone和Android平台,支持Mac 和Windows的网页浏览。由于Unity3D的跨平台和易用性等特性被越来越多的游戏开发公司所重视,并逐渐成为3D游戏开发的首先工具。

二、Unity3D界面介绍

Unity3D的基本界面层次清晰,几个窗口实现了全部的编辑功能。主界面如图1所示:

场景面板:该面板为Unity3D的编辑面板或者说是工作区;开发者可以将所有的模型、灯光、以及其他材质对象拖放到当前场景中,构建游戏中所能呈现的景象。

动画面板:该面板可以呈现完整的动画效果。显示的内容取决于场景摄像机的设置。当游戏在场景面板中编辑好后,点击运行按钮,即可在动画面板中查看游戏的实际运行效果。

项目面板:该面板主要功能是显示该项目文件中的所有资源列表。除了模型、材质、字体等,还包括该项目的各个场景文件。开发者可以将游戏中使用到的所有资源导入到该面板中,使用时只要用鼠标拖动到场景面板即可。

层次面板:该面板主要功能是显示放在场景面板中的所有的物体对象。该面板可以清楚查看在场景面板中出现的所有对象,很方便对场景中的对象进行管理。

对象属性栏:又叫检视面板,该面板栏会呈现出任何对象的属性和组件,包括三维坐标、旋转量、缩放大小、脚本的变量和对象等。

场景调整工具:可以改变在编辑过程中的场景视角、物体世界坐标和本地坐标的更换、物体的法线中心的位置,以及物体在场景中的坐标位置、缩放大小等。

三、接鸡蛋游戏的制作流程

一款手机游戏的开发大致经历立项、制定策划大纲、制作游戏、检测调试等过程。本文以接鸡蛋这个小游戏为例,描述Unity3D开发Andoird游戏的基本流程。

游戏的基本玩法是鸡蛋从屏幕上方落下,通过左右移动屏幕下方的木桶接住从上方落下的鸡蛋,鸡蛋落到木桶中及得分。游戏开发的基本步骤如下:

1.新建工程和场景

一个游戏就是一个项目,一个关卡就是一个场景,在Unity3D的文件菜单中选择新建项目,为新项目命名,如图2所示,新建项目的同时会新建第一个场景,保存新场景。

2.导入资源

游戏使用到的资源主要包括游戏对象模型、材质、贴图、声音等,模型可以在Maya,3DMax等3D建模工具中做好,导出为FBX格式的文件,然后在Unity3D的项目面板中选择导入资源菜单导入游戏资源。接鸡蛋主要模型资源有木桶、鸡蛋、草地、白云等模型。

3.搭建游戏场景

将游戏资源从项目面板拖入到场景面板中进行游戏场景的搭建,通过移动、缩放、旋转等工具将游戏资源对象按照一定的空间顺序进行搭建,最终效果如图3所示:

4.编写游戏脚本

(1)桶移动:PlayerScript.cs

木桶的左右移动是通过PlayerScript.cs来控制的,Unity3D的输入系统定义了水平方向的移动,并将X方向的数值限定在-2.5到2.5之间,这样避免木桶超出屏幕范围,代码的主要部分如下:

void Update () {

float moveInput = Input.GetAxis("Horizontal") * Time.deltaTime * 3; // 木桶在水平方向移动

transform.position += new Vector3(moveInput, 0, 0);

if (transform.position.x <= -2.5f || transform.position.x >= 2.5f){ // 限制木桶的移动范围

float xPos = Mathf.Clamp(transform.position.x, -2.5f, 2.5f); // 木桶在-2.5和2.5之间移动

transform.position = new Vector3(xPos, transform.position.y, transform.position.z);

}}

将PlayerScript.cs拖至木桶对象上,使得其成为木桶对象的脚本组件。

(2)鸡蛋落下:EggScript.cs

鸡蛋落下由EggScript.cs来控制,当鸡蛋落至屏幕下方足够低的地方的时候,鸡蛋自动销毁,以免占有资源,代码主要部分如下:

void Update () {

float fallSpeed = 2 * Time.deltaTime;

transform.position -= new Vector3(0, fallSpeed, 0);

if (transform.position.y < -1 || transform.position.y >= 20) // 位置足够低的时候销毁对象

{Destroy(gameObject);}}

同样将EggScript.cs拖至鸡蛋对象上,使得其成为鸡蛋对象的脚本组件之一。

(3)生成鸡蛋:SpawnerScript.cs

鸡蛋源源不断的从屏幕上方落下,即是通过SpawnerScript.cs脚本来生成鸡蛋,并且每隔0.3秒,鸡蛋的生成速度会不断的增加,主要代码如下:

void Update () {

if (nextEggTime < Time.time)

{

SpawnEgg();

nextEggTime = Time.time + spawnRate;

spawnRate *= 0.98f; // 生成速度逐渐加快

spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);

}}

void SpawnEgg()

{

float addXPos = Random.Range(-1.6f, 1.6f); // 水平位置由随机函数产生的数值来生成

Vector3 spawnPos = transform.position + new Vector3(addXPos,0,0);

Instantiate(eggPrefab, spawnPos, Quaternion.identity); // 初始化鸡蛋

}

同样将EggScript.cs拖至鸡蛋对象上,也使得其成为鸡蛋对象的脚本组件之一。

(4)碰撞检测,计分:EggCollider.cs

在木桶底部有一个球体对象,设置为碰撞器,来检测鸡蛋是否与其发生碰撞,或者说来判断木桶是否接到了鸡蛋,如果碰撞到则进行计分,代码主要部分如下:void Awake()

void OnTriggerEnter(Collider theCollision) // 碰撞检测

{

GameObject collisionGO = theCollision.gameObject;

Destroy(collisionGO);

myPlayerScript.theScore++;// 本游戏中碰撞的物体只可能是鸡蛋,检测到即销毁鸡蛋对象,同时计分

}

将EggCollider.cs拖至球体碰撞器对象上,也使得其成为碰撞器对象的脚本组件。

5.发布游戏

游戏代码完成,测试无错后就可以发布成Android应用程序了,选择文件菜单>构建设置,在弹出的对话框中可以看见我们的游戏可以发布到多个平台上,这里我们选择Android,如图4所示:

在发布设置中,设置游戏名称、默认图标、Android版本等基本信息,最后点击构建按钮即可生成最终的Andoid打包文件,导入手机中就可以运行了。

四、结束语

本文通过一个小游戏的制作过程,描述了Unity3D的基本界面、基本操作和使用Unity3D开发游戏的基本流程。Unity3D不但可以开发3D游戏还可以开发2D游戏和其他大型网络在线游戏,同样是画面绚丽,效果出众。

做为一个成熟的游戏引擎和开发工具,Unity3D其开发能力毋庸置疑,随着iOS,Android手机的大量普及和3D网页游戏的兴起,Unity3D因其强大的功能、良好的可移植性和易用性在手机游戏和网页游戏平台上必将得到了广泛的使用和传播。

参考文献:

[1]Ryan Henson Creighton.Unity 3D Game Development by[J].Example Beginners Guide,2010(9).

[2]金玺曾.Unity 3D手机游戏开发[M].北京:清华大学出版社,2013.

if (transform.position.y < -1 || transform.position.y >= 20) // 位置足够低的时候销毁对象

{Destroy(gameObject);}}

同样将EggScript.cs拖至鸡蛋对象上,使得其成为鸡蛋对象的脚本组件之一。

(3)生成鸡蛋:SpawnerScript.cs

鸡蛋源源不断的从屏幕上方落下,即是通过SpawnerScript.cs脚本来生成鸡蛋,并且每隔0.3秒,鸡蛋的生成速度会不断的增加,主要代码如下:

void Update () {

if (nextEggTime < Time.time)

{

SpawnEgg();

nextEggTime = Time.time + spawnRate;

spawnRate *= 0.98f; // 生成速度逐渐加快

spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);

}}

void SpawnEgg()

{

float addXPos = Random.Range(-1.6f, 1.6f); // 水平位置由随机函数产生的数值来生成

Vector3 spawnPos = transform.position + new Vector3(addXPos,0,0);

Instantiate(eggPrefab, spawnPos, Quaternion.identity); // 初始化鸡蛋

}

同样将EggScript.cs拖至鸡蛋对象上,也使得其成为鸡蛋对象的脚本组件之一。

(4)碰撞检测,计分:EggCollider.cs

在木桶底部有一个球体对象,设置为碰撞器,来检测鸡蛋是否与其发生碰撞,或者说来判断木桶是否接到了鸡蛋,如果碰撞到则进行计分,代码主要部分如下:void Awake()

void OnTriggerEnter(Collider theCollision) // 碰撞检测

{

GameObject collisionGO = theCollision.gameObject;

Destroy(collisionGO);

myPlayerScript.theScore++;// 本游戏中碰撞的物体只可能是鸡蛋,检测到即销毁鸡蛋对象,同时计分

}

将EggCollider.cs拖至球体碰撞器对象上,也使得其成为碰撞器对象的脚本组件。

5.发布游戏

游戏代码完成,测试无错后就可以发布成Android应用程序了,选择文件菜单>构建设置,在弹出的对话框中可以看见我们的游戏可以发布到多个平台上,这里我们选择Android,如图4所示:

在发布设置中,设置游戏名称、默认图标、Android版本等基本信息,最后点击构建按钮即可生成最终的Andoid打包文件,导入手机中就可以运行了。

四、结束语

本文通过一个小游戏的制作过程,描述了Unity3D的基本界面、基本操作和使用Unity3D开发游戏的基本流程。Unity3D不但可以开发3D游戏还可以开发2D游戏和其他大型网络在线游戏,同样是画面绚丽,效果出众。

做为一个成熟的游戏引擎和开发工具,Unity3D其开发能力毋庸置疑,随着iOS,Android手机的大量普及和3D网页游戏的兴起,Unity3D因其强大的功能、良好的可移植性和易用性在手机游戏和网页游戏平台上必将得到了广泛的使用和传播。

参考文献:

[1]Ryan Henson Creighton.Unity 3D Game Development by[J].Example Beginners Guide,2010(9).

[2]金玺曾.Unity 3D手机游戏开发[M].北京:清华大学出版社,2013.

if (transform.position.y < -1 || transform.position.y >= 20) // 位置足够低的时候销毁对象

{Destroy(gameObject);}}

同样将EggScript.cs拖至鸡蛋对象上,使得其成为鸡蛋对象的脚本组件之一。

(3)生成鸡蛋:SpawnerScript.cs

鸡蛋源源不断的从屏幕上方落下,即是通过SpawnerScript.cs脚本来生成鸡蛋,并且每隔0.3秒,鸡蛋的生成速度会不断的增加,主要代码如下:

void Update () {

if (nextEggTime < Time.time)

{

SpawnEgg();

nextEggTime = Time.time + spawnRate;

spawnRate *= 0.98f; // 生成速度逐渐加快

spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);

}}

void SpawnEgg()

{

float addXPos = Random.Range(-1.6f, 1.6f); // 水平位置由随机函数产生的数值来生成

Vector3 spawnPos = transform.position + new Vector3(addXPos,0,0);

Instantiate(eggPrefab, spawnPos, Quaternion.identity); // 初始化鸡蛋

}

同样将EggScript.cs拖至鸡蛋对象上,也使得其成为鸡蛋对象的脚本组件之一。

(4)碰撞检测,计分:EggCollider.cs

在木桶底部有一个球体对象,设置为碰撞器,来检测鸡蛋是否与其发生碰撞,或者说来判断木桶是否接到了鸡蛋,如果碰撞到则进行计分,代码主要部分如下:void Awake()

void OnTriggerEnter(Collider theCollision) // 碰撞检测

{

GameObject collisionGO = theCollision.gameObject;

Destroy(collisionGO);

myPlayerScript.theScore++;// 本游戏中碰撞的物体只可能是鸡蛋,检测到即销毁鸡蛋对象,同时计分

}

将EggCollider.cs拖至球体碰撞器对象上,也使得其成为碰撞器对象的脚本组件。

5.发布游戏

游戏代码完成,测试无错后就可以发布成Android应用程序了,选择文件菜单>构建设置,在弹出的对话框中可以看见我们的游戏可以发布到多个平台上,这里我们选择Android,如图4所示:

在发布设置中,设置游戏名称、默认图标、Android版本等基本信息,最后点击构建按钮即可生成最终的Andoid打包文件,导入手机中就可以运行了。

四、结束语

本文通过一个小游戏的制作过程,描述了Unity3D的基本界面、基本操作和使用Unity3D开发游戏的基本流程。Unity3D不但可以开发3D游戏还可以开发2D游戏和其他大型网络在线游戏,同样是画面绚丽,效果出众。

做为一个成熟的游戏引擎和开发工具,Unity3D其开发能力毋庸置疑,随着iOS,Android手机的大量普及和3D网页游戏的兴起,Unity3D因其强大的功能、良好的可移植性和易用性在手机游戏和网页游戏平台上必将得到了广泛的使用和传播。

参考文献:

[1]Ryan Henson Creighton.Unity 3D Game Development by[J].Example Beginners Guide,2010(9).

unity开发游戏的优缺点 篇4

1、跨平台,平台相关的功能Unity都已经帮你实现好了。即便有些Unity没有实现,也有插件帮你实现。

2、基于Unity的酷炫的粒子光效编辑。Unity本身就是一个功能强大的粒子编辑器。之前我还认为cocos2d-x的粒子系统的功能足够了,但是跟专业的编辑器比起来,远远不够。粒子系统要跟粒子特效编辑器配合起来,其功能远远不是之配置一个粒子系统的几个参数就可以的。cocos2d-x本身的粒子系统是很鸡肋的功能,只能拿来做一些简单的光效,不可能用来做复杂的技能特效。

3、由于框架和架构的优势,Unity的游戏可以极大程度避免崩溃和闪退。由于代码都是c#写的,并且是组件结构,所以即便出了错误也只是个异常而已,而不会影响到系统流程。

4、强大的性能分析工具,可以轻易的找到内存和cpu的瓶颈。支持Android和iOS的真机运行分析。

5、编辑器可以方便的进行扩展,不需要像传统游戏公司一样,有一个专门写编辑器的部门。无论是场景编辑器还是技能编辑器都可以轻松搞定。如果想玩高科技的话,还可以把技能编辑器做成可拖拽的模块化结构,策划可以像搭积木一样来编辑技能。最重要的是,这些都是所见即所得的。

6、方便的资源管理系统。使用Unity,你不用特意维护几份资源(比如原始资源、打包后的资源、iOS版本资源、Android版本资源等等),只要一份资源,然后Unity里面可以设置它的具体参数,比如使用纹理压缩、最大限制在512x512大小等等。Unity发布游戏的时候会自动根据平台相关的导出选项导出正确的资源。

7、丰富的插件。有大量的功能我无论拿cocos2d-x还是Unity都不知道怎么实现。比如一些shader特效、物件碎裂的特效、场景破坏和变形的特效等等,这些在Unity插件中都可以找到对应的实现。而且很多Unity的游戏都可以反编译,无形中又可以学到很多东西。

8、熟悉之后确实感觉Unity很简单。很多功能都是成体系的自然而然的。比如物理、碰撞检测、导航寻路、场景管理、场景烘焙。这些无论拿哪个出来都是相当有技术的功能,但是在Unity中几个按钮、几步操作就可以实现对应的功能。

至于缺点也有一些:

1、最主要的,无论是Unity还是插件都是要收费的。(破解版,等赚钱了再考虑回馈)

2、由于iOS平台的一些限制,Unity很难做动态代码更新。而cocos2d-x有lua这个比较成熟的方案。(如果程序稳定了,需要频繁更新代码的机会不多,更多的是更新配置和资源)

3、可能有些人不熟悉Unity,从而选择了开源的cocos2d-x。适应Unity的框架、工作方式需要一定的时间。(相信我,不会很长,要知道一个8岁的孩子都能拿Unity来做游戏,并且上架,如果有程序员说搞不定Unity,那干脆转行卖烧饼吧)

4、对应上面的第6点,由于Unity中资源对应的配置有很大的重要性,所以一个Unity功能就是资源+代码的整合,你很难分出一个资源包。这样你的Unity项目可能很大。(使用AssetsBundle打包后可能避免这个问题,但是项目初期资源变动大,经常打包很不方便)

上一篇:步态仿真下一篇:CT引导下经皮穿刺