• 工作总结
  • 工作计划
  • 心得体会
  • 述职报告
  • 事迹材料
  • 申请书
  • 作文大全
  • 读后感
  • 调查报告
  • 励志歌曲
  • 请假条
  • 创先争优
  • 毕业实习
  • 财神节
  • 高中主题
  • 小学一年
  • 名人名言
  • 财务工作
  • 小说/有
  • 承揽合同
  • 寒假计划
  • 外贸信函
  • 励志电影
  • 个人写作
  • 其它相关
  • 生活常识
  • 安全稳定
  • 心情短语
  • 爱情短信
  • 工会工作
  • 小学五年
  • 金融类工
  • 搞笑短信
  • 医务工作
  • 党团工作
  • 党校学习
  • 学习体会
  • 下半年工
  • 买卖合同
  • qq空间
  • 食品广告
  • 办公室工
  • 保险合同
  • 儿童英语
  • 软件下载
  • 广告合同
  • 服装广告
  • 学生会工
  • 文明礼仪
  • 农村工作
  • 人大政协
  • 创意广告
  • 您现在的位置:六七范文网 > 作文大全 > 正文

    游戏设计与开发详细课程设计文档

    来源:六七范文网 时间:2021-11-17 15:03:41 点击:

    XX大学计算机学院 级本科生课程报告 课程名称 游戏设计与开发 报告时间 学生姓名 学 号 专 业 计科 任课教师 任课教师评语 任课教师评语(①对课程基础理论的掌握;
    ②对课程知识应用能力的评价;
    ③对课程报告相关实验、作品、软件等成果的评价;
    ④课程学习态度和上课纪律;
    ⑤课程成果和报告工作量;
    ⑥总体评价和成绩;
    ⑦存在问题等):
    成 绩:
    任课教师签字:
    年 月 日 摘要 为了学习Unity3D游戏引擎,为了进一步了解并熟悉该款引擎,本文描述了如何制作了一个三维的RPG类游戏项目,这个游戏的背景来源于一部叫做《草原历险记》的电影。通过对该项目的制作和学习,来了解用Unity3D开发游戏的利与弊,以及这款游戏引擎未来的优势。本文所述的游戏项目开发所用的开发工具是Unity3D自带的开发工具,叫做MonoBehaviour,选择的开发语言是JavaScript。该游戏项目是一个小型的3D游戏制作,开发周期短,实现所涉及的技术也是学习Unity3D必备的一些知识,但是也是一些重要的基础知识,很多其他的Unity3D游戏制作,也是通过把Unity3D的各个功能模块一点点组织拼接起来而成的。

    关键词:Unity3D;
    游戏引擎;
    语言开发环境;
    RPG游戏。

    Abstract In order to know and learn more about Unity 3D game engine, this papers describes how I develop a parkour game project whose background comes from a movie called Frozen. Through the study of this game project, we will get to know the pros and cons to use the game engine and it’s advantage of the future. We did this game project using it’s own development tool named MonoBehaviour. We used JavaScript as its development language. This is a small 3D game with short development period and some basic techniques which are important knowledge Many other Unity 3D games are the union of some Unity 3D function parts. Keywords: Unity 3D;game engine; language development environment; RPG game. 目 录 1 概述 1 1.1游戏类型 1 1.2内容概述 1 1.3核心概念 1 1.4目标人群 1 1.5收费设定 1 1.6主要特点 1 1.7玩家的追求点 2 1.8游戏竞争分析 2 1.9独特卖点 2 1.10游戏的主要玩法 2 1.11游戏背景与代入感 2 1.12游戏的后期开发 3 1.13文档目的 3 2 主要玩法 3 2.1剧情副本 3 2.1.1设计原则 3 2.1.2游戏定位 3 2.1.3收费点 3 2.1.4主要特点 4 2.2日常副本 4 2.2.1设计原则 4 2.2.2收费点 4 2.2.3主要特点 4 3 游戏结构 4 3.1核心游戏玩法 4 3.2游戏方式 4 3.2.1攻击阶段 4 3.2.2奖励阶段 5 4 游戏过程描述 5 4.1游戏开始阶段 5 4.1.1说明模式 5 4.1.2游戏模式 5 4.1.3提示框 5 4.2游戏要素 5 4.2.1玩家 5 4.2.2其他人物 5 5 主要系统 6 5.1设计原则 6 5.2主要特点 6 5.3角色设计 6 5.4.角色成长 6 6 游戏世界 7 7 游戏世界区域分解及剧情设计 7 7.1森林 7 7.2平原 7 7.3农场 8 7.4风车山 8 7.5城市 8 7.6护卫室 8 7.7驿站 9 8 玩家界面 9 8.1说明/高分界面 9 8.2游戏控制 9 8.3基本的战斗 9 9 多媒体素材 9 9.1美术 9 9.2音乐音效 10 9.2.1整体目标 10 9.2.2音效 10 9.2.3音乐 10 10 玩家的体验流程 10 10.1新手引导 10 10.1.1引导内容 10 10.1.2引导方式 11 11 开发环境(Unity3D)介绍 11 11.1Unity3D简介 11 11.2Unity3D语言开发环境及开发工具 12 11.3Unity3D应用 12 11.4需要解决的问题 12 11.4.1游戏项目中要解决的问题 12 11.4.2碰撞检测问题 12 11.4.3粒子系统 13 11.4.4函数 13 11.5JavaScript语言 14 12 创建环境:导入基本的定制资源 15 12.1先设计,后创建 15 12.2导入贴图 15 12.2.1制作游戏的地图 15 12.3导入基本网格 15 12.4设置简单的着色器和材质 16 12.4.1Unity提供的着色器 16 12.4.2凹凸贴图、高光贴图、立方环境贴图和细节贴图 16 12.4.3指定着色器和材质 16 12.4.4创建一种定制的天空盒材质 17 12.4.5添加水体 17 13 创建角色 17 13.1导入角色以及其它非静态网格 17 14 编写角色和状态控制脚本 18 14.1计划和设计 18 14.2一个简单的第三人称控制器 18 14.2.1控制器变量 18 14.2.2FixedUpdate:让角色移动 19 14.3设置Unity的输入管理器 19 14.4连接摄像机 20 14.5装配状态控制器 20 15 连接动画 20 15.1Unity中的动画 20 15.2动画API 21 15.3创建动画状态管理器 21 16 使用触发器并创建环境交互 21 16.1触发器和碰撞 21 16.2设置一个简单的触发器对象 21 16.2.1背囊管理 22 17 创建探险和AI 22 17.1设置一个简单的敌人 22 17.1.1AI控制器 22 17.1.2为一只简单的小兔子编写简单的状态控制管理器 23 17.2产生和优化 23 18 创建光影 23 18.1灯光的类型 23 18.2照亮游戏世界 24 18.2.1光照贴图 24 18.2.2准备场景并烘焙光照贴图 24 18.2.3调整烘焙设置 24 19 使用粒子系统 25 19.1拾取物品 25 19.2检查点激活 25 20 项目总结 26 20.1总结的目的 26 20.2关键性问题总结 26 20.3游戏开发周期 26 20.4实验体会 27 1 概述 1.1游戏类型 偏向动作的冒险类游戏(RPG)
    1.2内容概述 这款游戏是一个简单的3d动作游戏,角色控制一个小机器人。为了克服前行道路上的障碍,他使用他的能力来改造和重新设计自己。

    1.3核心概念 这款游戏的核心概念类似于当前流行的动作冒险游戏,集逃亡、寻宝、打斗为一体,并在形式上有所创新。游戏只有一个机器人主角,玩家可控制该机器人穿过森林、山丘、平原等险恶环境,并在前行的过程中同其他机器人作斗争,通过克服险恶环境和打败敌人来提升自己的力量,还可通过找到补给站的方式不断补充能量和生命值,并最终胜利到达目的地。

    1.4目标人群 以青少年为主,不要求具备丰富的游戏经验。

    1.5收费设定 设计原则:让玩家的消费能得到实际的好处,感觉“赚了”而不是“亏了”。

    消费引导:分级消费+消费前置。

    分级消费:对于缺乏消费能力的玩家,如果一开始就看到太多超出自身能力的消费,便会因门槛太高而放弃游戏,但如果收费的额度根据玩家的 VIP 等级来设定,以层层递进的方式引导消费,玩家就会更容易接受。

    消费前置:将欲取之必先与之,对于付费带来的好处,可以让玩家先有所体验,以此来促进消费,比如赠与有时限的 VIP、赠与紫色套装的部件等。

    1.6主要特点 单机化倾向和策略性。

    单机化倾向:页游玩家的时间较为零散,难以在短时间建立牢固的合作关系,为了降低交互门槛,游戏内大多玩法都采用 SNS 游戏异步交互的形式,且前期以体验剧情为主,但人与人之间的关系往往是让玩家留在游戏的重要原因,故游戏后期会加入大量以帮派为单位的活动。

    策略性:首先,玩家的选择是多样的,对于机器人的形式可以有多种选择,每一个小的关卡都有多种通关策略;
    其次,冒险类游戏对战术的制定与执行都有很高要求,只要操作得当便可战胜强过自己的对手。

    1.7玩家的追求点 核心追求:玩家对于探险冒险的追求。

    长期追求:拓展剧情、通过精英关卡、竞技场名次、副本进度。

    短期追求:装备等级、冒险等级、通过关卡等级。

    1.8游戏竞争分析 采用3D画面,制作精良、逼真。易于上手,能够抓住玩家的心理,激起玩家对于胜利的渴望,促使玩家继续玩下去。针对当前市场3D游戏大多过于复杂,操作不太方便,本款游戏风格简洁,清新自然,各种游戏元素引人入胜,音响效果出色。另一个亮点就是增加了环境陷阱,玩家在对付敌人的同时还得注意周围的环境。

    1.9独特卖点 第三人称视角,视野辽阔,让你仿佛置身于游戏场景中,与角色融为一体,角色的成长就是你的成长,角色的情感就是你的情感,角色的胜利就是你的胜利! 1.10游戏的主要玩法 多人副本:
    形式:参考《魔兽世界》的副本设计,每一个 boss 都会有个性化的技能,玩家需要根据其特点来选择不同的应对策略。

    目的:难度较高,对玩家间的配合要求较高。

    作用:高级装备的主要来源。

    1.11游戏背景与代入感 游戏背景:
    我们的主角正坐在一条运输船上,心情很复杂。他自己的国家被叛军围困了,国王命令他前往邻国搬救兵。不幸的事情发生了,船体由于受到激流的影响撞到了暗礁,船沉没了,他游到了下游的森林的岸边。由于刚才事故的影响,他发现自己的一些零件已经受到了损害,他必须找到地方对自己进行维修。他不知道他现在在什么地方,但他可以看到远处的摩天大楼的轮廓。他知道这就是他的目的地。为了完成自己的使命,他艰难地踏上了行程。

    很快,他遇到一个老路标站,这似乎是破旧的,已经坏了。这些旧站用于提供旅行机器人燃料和提供维修服务,但由于近年来航空旅行变得更加普遍,他们已经不再使用。为了克服前行道路上的障碍,他准备使用其服务,他开始寻找一种方法来修复自己。

    1.12游戏的后期开发 用多种表现方式来延长数值区间,虽表现形式多样,但都是对数值的不断提升。针对数值的加成,设计相应的表现途径。

    1.13文档目的 综合考虑到游戏的各个环节,使各零散系统相辅相成,关联成统一的整体,尽量避免开发后期对重要模块的修改。在设计初期考虑收费点、玩家追求、新手引导等重要环节,避免游戏成型后再生硬的加 入这些设计。

    2 主要玩法 2.1剧情副本 2.1.1设计原则 平滑:副本间坡度平缓且副本数量多,玩家每一次能力的提升都会在剧情副本中得到及时的展现。

    2.1.2游戏定位 1、承载游戏世界观。

    2、提供原始的装备积累(健康点和能量点等)。

    3、提供不同形式的武器 。

    2.1.3收费点 能量点和健康点的购买,增加副本的次数。

    2.1.4主要特点 NPC 参与:NPC 会参与作战,一方面是为了更好的推动剧情,另一方面是在副本难度较高时帮助玩家顺利通过。

    难度分级:普通关卡只有一个难度,BOSS 关卡会有普通和精英两个难度。

    副本评分:根据通过副本的回合数、剩余 HP 等因素对副本进行评分。

    2.2日常副本 2.2.1设计原则 基于冒险类游戏的特点,上手容易但策略性强,满足付费玩家和高端玩家的需求。

    2.2.2收费点 增加每日副本的次数。

    2.2.3主要特点 随着玩家能力的提升,可通过的关卡也会提升,主要由玩家的输出能力决定 体现人民币玩家的优势。

    3 游戏结构 3.1核心游戏玩法 游戏的玩法实际上就是玩家在不同的地图中一路前进,途中遇到不同的敌人,都需要将其一一打败,最终在关卡处玩家要打败多个Boss才能通关。

    3.2游戏方式 3.2.1攻击阶段 游戏的玩法非常简单。玩家可以沿着地图一直向前行进,玩家的攻击招数包括拳击,腿部攻击,兵器攻击。最后,游戏中的四个boss都有各自的绝招。玩家的生命也是有限的。

    3.2.2奖励阶段 奖励阶段出现在攻击阶段之间,玩家在生存下来之后,获得一段短暂的休息时间作为奖励,当玩家受到的伤害玩家可以通过休息恢复一些生命。

    4 游戏过程描述 游戏开始-->说明-->游戏-->提示框 4.1游戏开始阶段 游戏开始时,应该有一段开场白,由电影或小动画构成。

    4.1.1说明模式 当游戏未开始游戏时,《神龟闯关》会进入说明模式。在这个模式下,屏幕显示一些指示说明和高分,按下任意键开始游戏。

    4.1.2游戏模式 这是游戏的主要娱乐模式。

    4.1.3提示框 玩家在游戏的过程中将获得不同的提示,包括游戏的技巧,游戏的操作方法,以及游戏的打斗技巧,玩家需要根据不同的提示做出相应的操作。

    4.2游戏要素 4.2.1玩家 玩家控制一个机器人,扮演游戏的主角。

    4.2.2其他人物 反派人物包括一些小喽啰,小兵,以及最终的Boss。它会上下左右在没有玩家的地方游动。

    5 主要系统 5.1设计原则 连贯、简单、智能。

    连贯:节奏连贯,两回合之间不会专门留下等待操作的时间,需要玩家在回合内完成操作。

    简单:玩家参与战斗,可以什么都不做,系统会自动释放技能;
    可以只选择技能,系统会帮助玩家选择最合适的对象;
    也可以既选择技能又选择技能对象。

    智能:系统会根据 boss 的特点合理的选择技能与技能对象,使玩家重战术而轻操作。

    5.2主要特点 回合制的战斗方式 5.3角色设计 机器人开始的时候能够使用一个简单的泰瑟枪攻击——一个短距离范围效果攻击, 可以给任何周围的机器人造成少量伤害。他还可以使用泰瑟枪来重启任何机器人的驿站来补充泰瑟枪的能量。

    一旦他开始同该地区以外的城市的机器人战斗,他可以收集敌人掉落的零件,诸如齿轮零件,螺丝和其他更大的块。如果他集齐足够多的零件,他就可以为自己建立一个新的形式,玩家可以自由切换。不论机器人以何种形式存在,他总是保留加速和跳跃的能力。

    机器人的既有健康点和能源点是他的两个主要统计数据。如果他的健康状况下降为零,在受到敌人攻击或环境损害之前,他必须到达最近的中转站来重启自己。他利用能源来提高速度和在不同形式之间进行转换。进入中转站之后他的能源点和健康点又能够恢复正常。

    5.4.角色成长 机器人在该游戏中有四种形式 泰瑟枪形式:小部件的基本形式,他的特殊能力需要的形状,可以对周围任何事物造成少量伤害,它也可以用来启动破碎的机器人。

    防卫形式:当机器人获得一定的能量和积分后,可以自动生成一个盾牌来抵挡攻击者的攻击,主要用于防御。当时机合适时,机器人可以通过抛出盾牌来给敌人以一定的攻击。

    格斗形式:在这种形式下,机器人的身体会自动生成一个爪钩。机器人可以用爪钩可以射杀敌人,还可以利用爪钩让自己悬挂在悬崖上,让自己摇摆到另外的一个环境中。

    翼形式:在这种形式下机器人身体长出金属翅膀,让他从一个平台到另一个滑翔(但不是飞——他需要立刻解决或找到其他方法来真正提升自己)。翅膀也给他一个大范围效果(面积效应)攻击,翅膀周围形成能量漩涡,能够对严周围的任何东西造成严重的损害(比泰瑟枪的伤害能力更大)。这种攻击而更具破坏性,需要更长的时间来发动技能。

    一旦机器人获得一种新形式,一个按钮将出现在界面接口上,允许玩家切换可用的形式,当然得提供相应的能量。

    6 游戏世界 这里的世界布局包括五个不同的地区,每一个组成一个完整区域(某些地区可能会分成多个区域,这取决于其大小和复杂性)。玩家开始处在森林的区域,在一个小空地残骸包围圈中。起伏的平原森林中点缀着零零星星的树。小的道路蜿蜒穿过平原,最终结束在一座别墅的前面。

    穿过别墅,一个新的路径继续通过肥沃的牧场和农田。这里海拔开始逐渐升高,玩家的跳跃和追逐变得越来越困难。

    通过梯田农田后,机器人到达了荒凉的岩石区,这里非常陡峭,到处都有峡谷和风车。风车被电线和远方的城市连接起来,不断地输送着电能。在这里机器人为了在陡峭的悬崖上行走需要学习使用爪钩。

    在悬崖的顶部上,现在可以清晰地看到这个城市坐落在山谷中。这时机器人使用他的新滑翔能力,可以机动的路上,避开障碍物和其他飞行机器人。

    在悬崖底部,一个巨大的哨兵机器人守卫着城市的入口。这时机器人别无选择,为了完成自己的任务,他必须战胜这个大机器人。

    7 游戏世界区域分解及剧情设计 7.1森林 机器人开始在森林地区,游戏开发者可以设计一个小地方作为安全区域,在这里玩家可以学习基本控制操作。练习结束后玩家遇到一个破旧的中转站,在这里得到他的第一个武器—泰瑟枪。

    当机器人进入恢复好的中转站后,通知机器人各种部件的使用方法,告诉他要小心。机器人必须用最后的能量来分解路径以顺利地通过废墟。

    7.2平原 这个地区覆盖广泛,点缀着零零星星的树和花。小的道路蜿蜒穿行其中,在这里要提醒玩家应该往哪个方向前行,但是他也可以探索其它的地方。

    兔子形状的小型野生机器人和其他啮齿动物漫步在平原中。这些可怜的老机器人被先进的城市无情地抛弃,它们盲目攻击任何十字架状的东西。

    道路的尽头是一个漂亮的别墅,进入院子,机器人享受到了补充能量的服务。在补充完能量之后,机器人需要打败一个boss来获得进入下一个区域的权限。

    7.3农场 机器人然后开始探索不断攀升的农场和牧场。机器人需要使用他的新形式以抵御新机器人的攻击,他们中的许多人拍小炮弹或扔石头。玩家还需要变得更善于跳跃,因为农场的地形是跌宕起伏的。

    顶部的农场在一个大的露台上,这里有另一个mini-boss——愤怒的拖拉机机器人。他不喜欢机器人在他的作物上滚,因为这样破坏了作物。他想要把机器人撕成碎片。拖拉机机器人不可战胜,玩家必须转移或避免。这时玩家要把机器人变换成防卫形式。成功躲避拖拉机机器人的攻击后,机器人到达一个可以塑造临时爪钩的中转站。

    7.4风车山 之后下面的区域急剧上升,裸露的悬崖和岩石露出。在这更贫瘠的区域上覆盖着风车。利用他的新爪钩,机器人可以利用岩石峭壁把自己推到新的高度。聪明的玩家将使用风车上的爪钩,这样可以把机器人扔到很远的区域隐藏起来。

    在悬崖的顶部,风车机器人在等待着机器人。这个风车的移动速度非常快,它使用风车叶片的旋转剑,降低他们来攻击地上的机器人。机器人这时可以变换出他所有的形式,还可以使用爪钩扔石头。风车机器人在空中飞行着对机器人发动攻击,因为他的速度非常快,所以机器人必须和他保持着安全距离。

    7.5城市 机器人的下一个到达地区是山谷城市所在地,这时他必须使用新的滑翔能力。这感觉更像一个滚动的赛车,球员需要控制机器的方向和攻击任何靠得太近的事物。这个区域没有boss,玩家可以节省在到达最后的中转站之前的能量。

    7.6护卫室 现在机器人终于来到了这座城市,他必须战胜守卫在门口的哨兵机器人。这个boss使用近战和防御姿态,玩家必须切换不同形式来应对boss的一举一动。

    击败了boss后,玩家终于进入这座城市,完成了他的任务。

    7.7驿站 驿站分散在世界各地用于多种目的,他们给机器人提供免费的健康点和能源点,并拥有修复机器人存储的能力。

    商店总是允许机器人卖回他多余的物品,如额外的螺丝,齿轮和修理工具。并且,如果机器人有一定的组合项目的库存,他可以通过交易来获取一种新形式。

    8 玩家界面 8.1说明/高分界面 在图示上有一些简单的说明,以及得分列表。高分会被保存下来。并且,在此点击任意键开始游戏。

    8.2游戏控制 机器人是由键盘控制,用箭头或WASD键控制运动和特殊分配键映射到增强能力,逃避和跳跃功能。使用鼠标选择界面上的按钮, 如果玩家喜欢,也可以映射到特定的键。

    8.3基本的战斗 1、右击攻击。每个转换都有自己的攻击动画。

    2、敌人遵循两种基本模式。

    3、当玩家敲击GotHit动画,把玩家推离敌人。

    4、如果击败敌人,敌人就消失了,在设定的时间后重生。

    5、如果机器人被打败了,需要重生,当然需要付出能量值。

    9 多媒体素材 9.1美术 主要有游戏的地图设计,包括森林、平原、农场地图以及城市地图。

    9.2音乐音效 9.2.1整体目标 该款游戏的音乐应该带有武侠的风格。格斗的声音会经常发出,音乐应该制造紧张感和兴奋感。

    9.2.2音效 5~10种不同的打斗音效 多个人物的特色音效。

    9.2.3音乐 游戏开始时的音乐 攻击阶段的音乐 新游戏/狂暴模式的音乐 每一关结束的音乐 高分的音乐。

    10 玩家的体验流程 10.1新手引导 10.1.1引导内容 一些操作是玩家必须掌握后才能进行游戏的,新手引导着重对这类操作进行指引。其次是对游戏的亮点进行展示,比如一些特色的系统、深刻的剧情或优美的场景。再次是对一些攻略性的内容进行指引,使玩家能够快速的理解游戏模式。

    1、剧情副本 让玩家了解游戏背景,学会如何进入剧情副本 剧情副本从画卷中展开,画卷为地图关卡,首先出现简单癿文字介绍历史,之后大陆被切割成几块,玩家点击进入。

    2、接交任务 让玩家在不知做什么癿时候形成查看任务癿习惯 引导玩家查看当前任务,在任务完成时提交。

    3、使用技能 让玩家学会如何使用技能 战斗中引导玩家点击技能栏图标使用技能 。

    4、使用装备 让玩家学会如何使用装备 打开道具栏,双击装备。

    5、进入家园 让玩家学会如何进入家园 点击主菜单进入家园。

    6.、恢复 PP 让玩家学会如何恢复 PP 。

    7.、强化装备 让玩家学会如何强化装备 8.、消费指引 进行付费癿挃引 增加训练位置,让玩家更好癿 10.1.2引导方式 操作流程:每步引导都是一个任务,让玩家形成习惯,从任务中查看下一步做什么。每步引导都有“下一步”的按钮,且位置不变,玩家可以不移动鼠标点击“下一步”来。

    通过引导:如果玩家长时间未操作,引导会自动进行。

    指引方式:
    将玩家的短期目标罗列出来,让玩家明白当前操作的目的。当玩家完成一些任务步骤后会有成就提示,一些高额奖励也会突出显示。

    NPC 贯穿新手指引,他会和玩家并肩作战、也会帮助玩家完成强化、训练等操作 功能随着等级的提升而开放,对于玩家暂时无法体验的功能将屏蔽入口。

    在新手阶段之后,引导方式变为条件触发,当玩家有需求时才进行引导 。

    11 开发环境(Unity3D)介绍 11.1Unity3D简介 Unity3D是由Unity Technologies开发的一个游戏引擎,操作界面如下图1.1所示,它集快速性交互性于一体,带有强大的渲染引擎,对DirectX、OpenGL拥有高度优化的图形渲染管道,能够允许开发者能够高效直观的开发出2D或者3D游戏,是一个全面整合的游戏引擎。并且,Unity3D游戏引擎能够十分方便的将开发出 的游戏发布到各个平台,如iPhone、Android等平台。

    此外,还可以用Unity Web Player插件将作品发布成网页游戏,玩 家只需下载这个很小的插件就能轻轻松松的玩Unity网页版游戏。Unity3D游戏引擎通过使用植被系统Unitree,提供了大量的Shader供开发者使用,这些Shader完全足以满足开发者的需求,使得即使在低端硬件设备下也 能 够运行广阔茂盛的植被景观。打开地形编辑器,从左到右依次是:地形拉升降低、准确的绘制地形高度、地形圆滑、地形文理绘制、地形植被绘制树木、地形植被绘制-草及小物体、地形参数设置。另外,它支持所有主要 的文件格式,并能和其他应用程序协同工作。它还用了PhysX的物理引擎,使得开发者能够轻松的实现各种物理效果。Unity游戏引擎提供了柔和阴影与烘焙的高度完善的光影渲染系统,它的着色器整合了易用性、灵活性和高性能的特点。

    目前,Unity3D游戏引擎最新版本是Unity4.0,它能将你的作品发布到MAC、Windows、安卓等十个以上当今盛行的平台。此外,购买功能更加强大的正版Unity3D游戏引擎,经授权之后可以安装在2个不同的系统,如一个Windows,一个Mac,官方网址是unity3d.com。

    Unity3D游戏引擎研讨会正在茁壮发展。第一次Unity3D游戏引擎研讨会是在2010年5月,举办地点是在韩国,引发了许许多多的商家投资并签订了引擎预定协议。亚洲作为Unity3D游戏引擎公司的一个重要战略地,2013 年在上海举办了研讨会。不久Unity3D游戏引擎公司又宣布取消支持对Flash的支持。

    11.2Unity3D语言开发环境及开发工具 Unity3D是一款综合型的游戏开发引擎。其中MonoBehaviour是该公司自己开发的一个编译工具,自然跟Unity3D是十分兼容的,比如调试等就十分方便。当然,也可以选择自己的编译工具,如Visual Studio 2010,只需要在菜单里面设置一下默认编译工具就行,这样在你创建并打开代码文档时就默认打开了你所设置的编译工具。目前,Unity3D只允许3种编程语言:C#、javascript、Mobo。其中C#运用较为广泛,因为它的兼容性比较好,便于更好的发布到各个平台。

    11.3Unity3D应用 目前,用Unity3D游戏设计引擎开发手机游戏的比较多,如勇者之心、神庙逃亡系列、愤怒的小鸟等;
    也有用来开发单机游戏的,如轩辕剑六、捣蛋猪等;
    网页游戏诸如新仙剑Online、QQ乐团等。在虚拟现实方面,只需要将在Maya或者Max等其他三维软件里面做出的模型导出为fbx格式,然后导入Unity3D,设置摄像机代 码、UI、Build。

    11.4需要解决的问题 11.4.1游戏项目中要解决的问题 游戏项目要解决的问题很多,所以最关键的是先要管理好资源文件,分类明确有条理。在项目文件的预设目录下,共创建了8个文件夹,分别存放动画文件、材质文件、模型文件、Prefab文件、场景文件、代码文件、音效文件和纹理文件. 11.4.2碰撞检测问题 Unity3D中实现碰撞检测的方式有两种:碰撞器和触发器。碰撞器有很多的种类,如盒子碰撞器、球形碰撞器、胶囊碰撞器等,要使用这些碰撞器都必须把该碰撞器组件添加到一个游戏对象上面。如果在检视面板中勾选了IsTrigger,那么就成了触发器。下面介绍MonoBehaviour类里面两个函数:
    1、MonoBehaviour.OnTriggerEnter(Collider collider)进入触发器。

    2、MonoBehaviour.OnCollisionEnter(Collision collision)进入碰撞器。

    本游戏项目所涉及到的碰撞检测都是进入时的检测,即刚发生碰撞,没有退出和逗留时的碰撞检测,所以另外四个接口函数就不在赘述,添加碰撞检测组件碰撞检测器。

    添加方法:
    Component->Physics->Collider;
    Component->Physics->Rigidbody;

    Is Trigger属性在勾选状态下,那么该对象就是触发器。下面其它参数则是设置碰撞体的大小、半径。

    Mass是质量,Drag是阻力,Angular Drag是角阻力。Use Gravity是否使用重力,如果勾选物体将相对向下做自由落体运动。Is Kinematic是否相对地面静止,如果勾选物体将相对地面静止。Constraints属性块是设置物体的位置和旋转是否静止,例如勾选了Freeze Position Z那么物体在Z轴方向不能移动,用脚本也不能让它移动;
    这是很必要的,比如你做的是一个2D游戏,自然不希望它在Z轴发生移动而影响碰撞检测。

    11.4.3粒子系统 Unity3D自带的粒子系统完全足以满足开发者各种这方面的需求,比如在制作烟雾、云雨、爆炸、火焰、天气等。在创建好游戏对象并添加粒子系统组件之后,正如你所见的,会出现很多属性。

    参数设置在运行后出现的效果是一个下雪的效果。具体各个参数的意思,在这就不赘述了,举几个常用的参数。Looping是否循环,比如此下雪的粒子效果,当然要他循环,再如爆炸之类的就不需要循环。Start Speed初始速度,可以设置一个参数,也可以设置两个,即在这两个参数之间随机产生一个参数,这个比较常用,Start Scale用法与Start Speed类似 11.4.4函数 不管用什么编程语言,创建的脚本都必须继承MonoBehaviour类,他包括了许许多多的函数,诸如上述的碰撞检测函数。如果在检视器里面修改了脚本文件的名称,一定要记得在编译器里面修改类名,不然就会出现异常的错误。这里介绍几个常用的函数。

    1、 MonoBehaviour.OnGUI()接口有许多的属性,如GUI.Label用于绘制列表,它有6个接口:
    像游戏分数统计等,又如GUI.TextArea用于绘制文本区域,它有4个借口,这里不再赘述。最常用的是GUI.Button,设置各种按钮。所有的GUI属性都可以在检视器里面创建一个GUISkin,来设置个性化的按钮、图片背景等。

    其中mySkin用来接收在检视器窗口创建的GUISkin游戏对象,在游戏对象里面你可以指定个性化的按钮图片,可以是两张,一张是正常情况下的大小,指定在Custom Styles的Normal和On Normal属性上面,一张是鼠标移动上去的大小,指定在Custom Styles的Hover和On Hover属性上面,这样就会达到鼠标移动上去按钮变大的效果。

    2、MonoBehaviour.Start和MonoBehaviour.Update函数。

    MonoBehaviour.Start函数就是对游戏的一些预设,并且在游戏执行的整个周期中,此函数只调用一次。比如隐藏光标:
    voidStart() { Screen.showCursor=false;//隐藏光标 Screen.showCursor=true;//显示光标 } 通过这样的设置,我们就可以编写响应的代码来实现个性化的光标了。MonoBehaviour.Update函数功能就是在执行完MonoBehaviour.Start函数之后,游戏的每一帧都会执行该函数,来绘制每帧的画面,这是非常重要的,否则游戏将无法运行。精灵动画的函数就必须放在这里面。

    11.5JavaScript语言 Javascript是一种由Netscape的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。当时服务端需要对数据进行验证,由于网络速度相当缓慢,只有28.8kbps,验证步骤浪费的时间太多。于是Netscape的浏览器Navigator加入了Javascript,提供了数据验证的基本功能。

    JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。它最初由网景公司的Brendan Eich设计,是一种动态、弱类型、基于原型的语言,内置支持类。JavaScript是Sun公司的注册商标。Ecma国际以JavaScript为基础制定了ECMAScript标准。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型,字节顺序记号。

    Netscape公司在最初将其脚本语言命名为LiveScript来Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”,因此语法上有类似之处,一些名称和命名规范也借自Java。但JavaScript的主要设计原则源自Self和Scheme。JavaScript与Java名称上的近似,是当时网景为了营销考虑与Sun公司达成协议的结果。

    为了取得技术优势,微软推出了JScript来迎战JavaScript的脚本语言。为了互用性,Ecma国际(前身为欧洲计算机制造商协会)创建了ECMA-262(ECMAScript)。现在两者都属于ECMAScript的实现。尽管JavaScript作为给非程序人员的脚本语言,而非作为给程序人员的编程语言来推广和宣传,但是JavaScript具有非常丰富的特性。

    12 创建环境:导入基本的定制资源 12.1先设计,后创建 在开始创建环境之前,先在纸上或是使用图元对象在引擎中为此建立一个模型,这叫做灰盒法。

    当在绘制地图时,首先为各种需要创建的物品做标注,即创建自己的资源列表。在开始时就创建一个这样的资源列表,这可以确保不会在稍后的开发中遗忘任何东西。在Assets文件夹中加入下列文件夹:
    Audio(音频)
    Charactrers(角色)
    GUI(图形用户界面)
    Editor(编辑器)
    Particles(粒子)
    Props(道具)
    Scenes(场景( Scrips(脚本)
    Skybox(天空盒)
    Terrain(地形)
    12.2导入贴图 打开Unity并创建一个新的场景文件。将贴图资源文件拖曳到项目中的Assets文件夹里。

    12.2.1制作游戏的地图 1、 在新场景里,创建一个有向光源并且对其进行旋转,以使得它不是直接指向下方。

    2、 在Project视图中展开Standard Assets文件夹,并且打开Prefabs文件夹。把First Person Controller预制模型拖曳到Scene视图或是Hierarchy视图中。在Hierarchy视图中选择默认的Main Camera,然后按Delete键以将其删除。这个控制器预制模型带有一个附加的游戏摄像机。

    3、 创建一个新地形,并且把它的分辨率设置为200米长、200米宽。

    4、 重命名地形。

    5、 使用Inspector视图中的Terrain工具加入一张地表贴图。将X和Y平铺大小修改为200*200,也就是这个地形的分辨率。

    6、 为地形绘制高度。

    7、 把可玩区域变得大约两米高—这样就可以在一个略低的高度建立道路和河流。

    8、 使用Target Height工具来绘制平缓过渡的高原,并且使用一个不透明度比较低的选项来渐渐地建立区域。

    12.3导入基本网格 Unity内置地支持Maya、Cinema4D、3dx Max、Cheetah3D和Blender的场景文件,将这些文件保存到Asserts文件夹中。

    在地形上四处放置一些树木以及其它对象。单击Apply按钮来完成对该资源进行的任何改变,并让Unity重新导入它。

    当导入一个网格时,Unity会试图随之导入所有的贴图和材质,这可以避免在导入之后还需要重新对此进行设置。

    12.4设置简单的着色器和材质 12.4.1Unity提供的着色器 Unity带有一个很大的、预先创建的着色器库,绝大部分着色器都按照种类来划分:Normal(普通)、Transparent(透明)、Nature(自然)、Self-ILLuminated(自发光)、Reflective(反射)以及Lightmapped(光照图)。

    12.4.2凹凸贴图、高光贴图、立方环境贴图和细节贴图 1、 凹凸贴图 凹凸贴图是用来定义对象高度或深度的灰度图像。该贴图上比较暗的区域看上去好像缩在对象里面,贴图上较亮的区域标记了该对象应该抬高或是突出的部位。

    在导入一张将要用作凹凸贴图的贴图时,在导入设置上选择Generate BumMap(生成凹凸贴图)复选框实际上会让Unity为贴图创建一张法线贴图。法线贴图是使用RGB而不是灰度来编码的图像,它使用颜色数据来定义对象上的凹凸和褶皱。根据创建法线贴图的方法,它们通常可以使得结果比使用普通的灰度凹凸贴图更好看。在生成一张法线贴图时,尝试改变凹凸度滑块来增加其效果。

    2、 高光和发光贴图 高光贴图定义了对象上哪些部分是有光泽的而哪些部分不是。高光信息通常作为灰度图像保存在贴图的alpha通道里,而不是像凹凸贴图一样是一张独立的贴图。

    3、 立方环境贴图 立方环境贴图是另一种特殊类型的贴图,事实上它是由6张独立的贴图组成的,它们分别和一个虚拟立方体的6个面相对应。天空盒就是一种特殊的立方环境贴图。

    4、 细节贴图 细节贴图是另一种特殊贴图,它们仅仅由Diffuse Detail(散射细节)着色器所使用。细节贴图就好像是一张反转的mip map,因为当你靠近一个对象时,这个特别的着色器才会开始作用。细节贴图通常是灰度的,并且必须是在各个方向都完全是平铺的,否则会看到缝隙。

    12.4.3指定着色器和材质 关闭Shadertest项目,并且重新打开该项目。在Protect视图中右击并选择Create—Material。这会在项目层次中的当前文件夹中放置一个新的材质对象。

    默认情况下,新材质是空的并且赋予了基本的散射着色器。此时,为这种材质选择一种颜色。将tree2游戏对象从Protect视图中拖曳到Scene试图中,以将它加入到游戏中。这会创建该对象的一个实例。

    单击并把新材质从Project视图拖曳到tree2的两个部分上:树叶和树干。在Scene视图中,查看树以看看新材质的效果 12.4.4创建一种定制的天空盒材质 Standard Assets包中的天空盒和游戏的艺术方向不符合,因此需要创建一种定制的天空盒。

    天空盒需要使用6张独立的贴图来创建,每张贴图都对应于立方体6个面中的一个。这个虚拟的立方体会在游戏场景的周围和后面渲染,这可以造成在远处有一片很大的天空的假象。创建6张无缝的、相互连接的贴图,并且让Unity生成一张立方环境贴图。

    12.4.5添加水体 这幅地图的场景中最后需要添加的一个重要部分就是水体。

    1、 创建一个新的游戏对象plane,并且把它放置在(100,0.2, 100),使得它位于地图的中心并且略高于地面。在每条轴上把它放大21倍,使得它可以覆盖整张地图 2、 创建一种新材质,把它命名为Water,并且在Shader下拉菜单中选择Water,为其指定Water着色器。把这种新材质放在Material文件夹中,并且把它赋给Plane对象。

    3、 将WaterSimple脚本拖曳到Plane对象上。

    4、 将水面贴图放到Waves Bumpmap和Wave Speed贴图框中。

    5、 在Project视图中选择Water-DIFF贴图,并把其Generate Cumbmap的导入选项修改为Spheremap(球体贴图)。单击Apply按钮使得Unity重新导入这张贴图,并为其创建立方环境贴图。

    6、 把这张新建的立方环境贴图应用到水体的反射颜色贴图上,对Horizon和Wave scale滑块进行修改,得到想要的效果。

    13 创建角色 13.1导入角色以及其它非静态网格 该游戏的角色身体分为两个带有蒙皮的部分,分别名为“Body”和“Wheels”。该动画剪辑使用一个独立的属性来显示其采用率,以及该文件是不是已经压缩了。这些带有蒙皮的网格部分,显示了为它们每一部分所创建的默认材质以及该部分的带有贴图的预览。如果只是单击Mesh部分,该部分会只使用线框来显示。

    选择“Widget”层次的根部,以在Inspector视图中显示其所有导入属性。启用Generate Colliders功能,并让Unity为每张贴图生成一种材质。随后选择Animations子菜单。

    在Split Animations表中,选择”+”号来创建一段新的剪辑。默认情况下,Unity会使用一个名为“idle”的示例剪辑以及一些随机的数字来填充这些字段。单击Apply按钮保存。新创建的剪辑会加入到Project视图的层次中。

    从Project视图中把该项目的动画剪辑中的某一段拖曳到Animation域中。在Scene视图中把视野居中,然后按下“播放”按钮来观看动画。

    现在角色已经就绪了,可以将其导入到游戏中的任何场景文件中。

    14 编写角色和状态控制脚本 14.1计划和设计 该角色的控制器需要能够以某种方式处理下列基本功能:
    1、 WASD键移动控制。角色必须随着D键和A键旋转并且随着W键和S键向前或向后移动。

    2、 Widget需要能够跳跃、滚动(消耗能量的高速滚动)和匍匐。在匍匐时,其物理碰撞体应该变小。

    3、 控制器必须为其移动和旋转速度提供可编辑的变量,并且需要提供一些变量来记它是否是可控制的(如果它在冒险中死了,在其被屠杀的过程中,玩家不应该还能控制它)。

    4、 脚本还需要在接受移动输入时确保角色在地面上,这样它就不会意外地悬浮或是飞行—这个机器人绝对是只能在地面上移动的。

    5、 把一些摄像机设置成能够平滑的跟随角色。

    14.2一个简单的第三人称控制器 要让角色移动,需要把前面这个列表转化为可用的代码。在Assets文件夹中的Scripts目录中创建一个新的JavaScript文件,并把它命名为Widget Controller。

    14.2.1控制器变量 定义已经知道会在脚本文件中需要的变量,并为它们赋一些基本的值。在选择的编辑器中打开角色的控制器,加入成员变量,例如roll Speed、fastRollSpeed、jumpSpeed、gravity、rotateSpeed、duckSpeed等。

    这些定义为成员便利变量,并且可以在Inspector视图中编辑。这些变量可以控制角色在其任何一个动作中多快地移动。需要角色的重力(gravity)变量,在每一帧中它作用于角色之上,以使得它会在地面上,将其值设置为20。其他的变量控制角色可以多快地在游戏世界中进行滚动、移动以及旋转。

    也需要一些私有变量来记录角色的当前移动方向、它是否在地面上以及它在匍匐时的当前高度。将下面这些变量声明为private类型。moveDirection、grounded、moveHorz、normalHeight、duckHeight、rotateDirection。旋转和移动方向定义为一个3D变量,这使得可以在需要的时候同时在三个平面上对移动进行计算。MoveHorz变量决定了玩家在旋转中的方向,grounded布尔值保存了角色当前是否在地面上。

    14.2.2FixedUpdate:让角色移动 第三人称控制器脚本会遵循以下的基本逻辑:
    1、 如果这个角色是可控制的,允许玩家的移动输入。

    2、 如果这个角色在地面上,允许玩家在地面上常规的移动输入 3、 获取玩家的输入并且对其进行变换,使得它适用于世界坐标系 4、 把任何特殊的玩家控制应用到移动上,例如,跳跃、匍匐或者加速。

    5、 施加游戏世界重力的影响,使得角色可以自然地下落和跳跃。

    这里介绍一下Unity脚本编程中的一个重要的类—time。time类允许访问一些很有用的只读数据,例如,这个游戏运行了多久了或是当前关卡载入多久了。DeltaTime是另一个只读数据,它描述了完成上一帧所花的时间,其单位为秒。通常把重力常量乘以完成帧所花费的时间,实际上就计算了每秒重力对角色的影响。在任何时候,如果想要每秒都做些什么,把它乘以Time.deltaTime。

    14.3设置Unity的输入管理器 要在Unity中设置定制的控制方式,只需要单击几次按钮就可以很方便地在编辑器内部完成了。Unity支持从键盘、鼠标、游戏手柄和摇杆的输入,并且可以在一个游戏中把任意多个这样的输入设备混合起来,这使得玩家可以选用自己喜欢的控制方式。每个新项目默认可以定义17个输入轴(input axis),包含了标准的键盘和鼠标控制。一条轴就是任何预先定义的移动或是按下按钮动作,例如,Jump(跳跃)、Run(奔跑)、Strafe(扫射)或是Left Mouse Click(左击)。设置输入管理器的步骤如下:
    1、 把Size字段修改为6,以删除不需要的轴。角色的控制非常简单,不需要默认的选项。

    2、 保持Horizontal和Vertical不变—这两条轴已经映射为同时使用WASD键和方向键。

    3、 展开Fire1并把它重命名为Attack。保持默认赋值的左Ctrl和mouse0,。

    4、 把Fire2轴、Fire3轴分别重命名为Boost和Duck。让Boost使用左Shift键,Duck使用Caps Lock键。

    5、 保持Jump轴不变。

    14.4连接摄像机 现在角色的功能已经完整并且可以控制了,还需要某些方法来保持摄像机总是跟随者它,否则玩家会很容易就跑出摄像机的视野。要做到这点,需要创建一个平滑跟随脚本,以控制摄像机的移动和旋转。

    希望定制摄像机可以做如下一些基本的事情:
    1、 总是以一个预先设置的、特定的距离跟随角色。

    2、 在跟随速度上有一个小小的延迟,这样摄像机的移动就不会抖动—想要让它可以随着玩家四处移动而平缓地改变方向和更新设置。

    3、 总是会更新其当前的旋转角度,以便它查看角色。否则一个跳跃动作就会让角色飞出视野。

    在Scripts文件夹中创建一个新的JavaScript文件,并把它命名为Widget-Camera。在该脚本中实现连接摄像机的功能。

    14.5装配状态控制器 现在,角色已经可以移动了,它需要能够保存自己的状态和重要数据,从而在遇到诸如物品和敌人之类的东西是可以进行更新。它需要:
    1、 用来记录生命(如能量、最大生命、和最大能量)的变量,以及其他变量来确定需要多少能量才能进行加速旋转。

    2、 在某个时刻,它需要表示受到攻击以及濒死的音频变量。

    3、 用来添加生命和能量以及进行伤害并减少生命的函数。

    4、 某些种类的死亡函数,以便处理不幸发生的提前结束及其在游戏中的重生。

    在Scripts文件夹中创建一个新的JavaSc文件,并把它命名为Widget-Status,实现上述功能。

    15 连接动画 15.1Unity中的动画 在Unity中,可以用几种不同的方式来处理动画:可以在其他编辑器中创建它们并且导入,可以使用脚本来进行程序化地生成,也可以直接在Unity的Animation视图中创建。这些方法中的每一种都有其优缺点,相对于其他方法来说,某种方法可能会给一些特定的任务带来更多的好处。一个复杂的、具有多个部分的角色可以在Animation视图中进行动画,但是制作角色的美工可能会法线诸如Maya这样的独立编辑器更好用。一段拾取生命或是弹药的动画可以在外部软件中进行,但是使用简单的脚本来创建某些简单的动画效果会更为有效。另一方面,如果无法使用第三方动画编辑器,可以在Unity中处理需要的任何操作。

    15.2动画API 关于这个API需要掌握的最关键的方面之一,就是动画图层的概念。在Unity中,一个给定游戏对象上的所有可以使用的动画剪辑,都会被赋予一个图层,默认为0.根据图层的索引,一段剪辑在被赋予混合权重时,会得到一个更高的优先级。一个较高图层中的动画在需要获得优先级时可以很方便地覆盖一个较低图层中的动画。

    15.3创建动画状态管理器 在Scripts目录中,创建一个新的JavaScript文件,并把它命名为Wdiget-Animation。在该脚本中实现动画管理的功能。

    16 使用触发器并创建环境交互 16.1触发器和碰撞 在游戏中,一个触发器基本上就是任何可以激活和绊倒的东西,它会因此发送某种形式的消息或是开始一个时间。触发器通常是包含一个给定空间的不可见区域或是形体,一旦玩家进入这个区域或是在这个区域里进行特定的动作(例如,按下一个按钮),就会触发触发器。很多和玩家相关的行动(例如,打开某个东西,如门和箱子,启动电梯或是拾取一个掉下的物品)能够工作,是因为触发器和它们的形体。

    所有的游戏引擎对触发器和触发器形体的定义都是不同的,Unity也不例外。在Unity中,触发器和GameObject直接相连—这两者不能离开另一个而独自存在。每当玩家和GO的碰撞形体发生碰撞,触发器都会通过脚本来激活。GameObject自身可以是不可见的,并且定义了一个松散的区域,它也可以描述玩家可以看到的一个有形物体,例如一扇门。

    16.2设置一个简单的触发器对象 1、导入贴图,使用一种名为generic-pickups的新材质对其进行设置,并给它一个lighted outline Toon shader。

    2、为这个对象创建一个预制模型并且把它命名为Pickup-Gear。把这个物品放在最后的场景文件中。

    3、在Project视图中选中这个齿轮,并选择Sphere Collider,为这个物品赋予一个新的Sphere碰撞体。

    4、在Sphere Collider组件的Radius设置上面,单击Is Trigger框把它设置为True。

    创建一个新的JavaScript脚本,并把它命名为PickupItems。把它放在Scrips目录中。这个脚本是一个通用的脚本,用来处理游戏中所有可能的可拾取的物品。

    16.2.1背囊管理 在拾取已经完成并且正确工作后,需要创建一个背囊管理器使得角色可以真正地保存其新找到的奖品。需要某种类型的对象或是数组,来保存可以获得的物品并且记录真正被角色搜集到的物品,在Scripts目录中创建一个新的JavaScript文件,并把它命名为Widget-Inventory,这个脚本用来实现上述功能。

    17 创建探险和AI 17.1设置一个简单的敌人 角色第一次遭遇的敌人是一只简单的机器兔子,它是在山地中土生土长的。这个敌人的AI可以让玩家在没有生命危险的情况下就能熟练地控制。

    在开始编写脚本之前,需要在Unity中设置好游戏资源并且让一切就绪。打开保存的项目并且创建一个新的场景。下面是实现的步骤:
    1、 在项目中创建一个新场景,并且把一个基本的平面游戏对象放置在游戏世界中。改变其大小使得它提供足够的空间以四处奔跑。

    2、 导入兔子游戏对象,命名为E-Bunny。

    3、 把E-Bunny对象的Scale参数设置为1。

    4、 为这个兔子角色创建一个新的预制模型并且用E-Bunny对象来填充它。

    5、 使用Toon着色器来设置所提供的材质,并且把所提供的贴图赋值给它。

    6、 为这个小兔子预制模型加入一个Animation组件,并且在Inspector视图中把这个动画数组的大小改为3. 7、 因为这个小兔子需要和世界进行交互并且在世界中四处移动,所以它还需要一个角色控制器。使用Component—Physics菜单来加入这个组件,并且把碰撞体的height和radius改为0.65,把center改为(0,0.52,0)。

    17.1.1AI控制器 现在,新的敌人角色已经设置完成并且一切就绪了,需要为它定义所希望的表现。用一句话来说,你想要这个小兔子自由地四处游荡,直到它看到一个玩家去追捕它。

    1、 在一个小范围内缓慢而随机地移动。

    2、 如果角色在某个设定的区域范围内,专项并向其移动。

    3、 如果和角色发生碰撞,就攻击。短暂地停顿一下以让玩家进行反击。

    4、 如果角色还在范围内并且可以看到的话,再次向它移动。否则,视图找到它。

    5、 如果角色移动到范围以外,继续游荡。

    6、 如果被打败,丢下一个随机的小物品并且消失。

    在Scripts目录中创建一个名为Ebunny-AIController的脚本文件,实现兔子角色的人工智能。

    17.1.2为一只简单的小兔子编写简单的状态控制管理器 和角色不同,小兔子并不需要记录很多东西—它只需要记录生命值。在Scripts目录中创建一个名为EBunny-Status的脚本文件,实现上述功能。

    17.2产生和优化 在小兔子敌人上加入另一个功能,这也可以减少一些内存空间的占用以更好地优化游戏。现在,在玩家杀死测试的小兔子之后,它放下它的奖励并且消失。

    然后,通过加入一个产生点,可以让新的小兔子出现并且可以让角色面对更多的对手。同时,通过使用产生点,可以在角色离开他们的雷达时删除这些敌人,以节约不需要的空间。

    在Scripts目录中创建名为Enemy-RespawnPoint。完成上述功能。

    18 创建光影 18.1灯光的类型 Unity预制了三种类型的光源,每种类型都模拟现实世界中的一种常见光源—有向、点和聚光灯。

    1、 有向光源的功能和太阳类似:它们模拟一个大的、远的光源,指向一个方向。在场景中所有的东西都会被这个光源以相同的方式照亮,任何投影投射也会使用相同的方向。把有向光源组合起来可以迅速地照亮整个场景,但是它们也可以让一些细节消失或是把一些希望保持不可见的区域照亮。

    2、 点光源的作用和一个常见的灯泡一样—它们从一个中心点向外、在一个球体中发光。这个光源可以自然地渐渐变暗,也可以停止在一条线上。

    3、 聚光灯光源的功能就像其名称所显示的那样。光源从一个确定的点沿着一个方向向外照射,其形状就像一个圆锥。这种光源也可以自然地渐渐变暗,聚光灯的椎体角度也可以改变。

    18.2照亮游戏世界 18.2.1光照贴图 Unity拥有完整的集成光照烘培贴图工具,即 Illuminate Labs的Beast ,这意味着Beast可根据场景在Unity中的设置并考虑到网 格、材质、纹理和灯光,烘培场景中的光照贴图。也意味着光照贴图是渲染引擎中不可缺少的一部分。创建光照贴图后无需进行任何操作,就会被对象自动应用。

    18.2.2准备场景并烘焙光照贴图 从菜单中选择窗口(Window)—光照贴图(Lightmapping),打开光照贴图(Lightmapping)窗口:
    1、 确保想要进行光照映射的任何网格都有适当的UV供进行光照映射。最简单的方法是从网格导入设置(meshimportsettings)中选择生成光照贴图UV(GenerateLightmapUVs)选项。

    2、在对象(Object)窗格中将任何网格渲染器(MeshRenderer)、蒙皮网格渲染器(Skinned MeshR enderer)或地形(Terrain) 标记为静态(static),告诉Unity这些对象不会移动或更改,可进行光照贴图。

    3、要控制光照贴图的分辨率,请转到烘培 (Bake) 窗格并调整分辨率(Resolution)值(如要更好地了解如何安排光照贴图的纹元,请查看场景视图(SceneView)中的光照贴图显示(Lightmap Display)小窗口,并选择显示分辨率(Show Resolution))。

    4、点击烘培(Bake)按钮。

    5、Unity编辑器(Editor)的状态栏上出现一个进度条(右下角)。

    6、烘培完成时可在光照贴图编辑器(Lightmap Editor)窗口底部看到所有已烘培的光照贴图。场景和游戏视图将更新,场景已完成光照映射。

    18.2.3调整烘焙设置 选择灯光并打开光照贴图(Lightmapping)窗口中的对象(Object)窗格,出现阴影半径(Shadow Radius)和阴影样本(Shadow Samples)属性。将阴影半径(Shadow Radius)设置为1.2,阴影样本(Shadow Samples)设置为100,重新烘培产生带有宽半阴影的软阴影,图片看起来效果就好很多。

    在Unity专业版中可启用全局照明(Global Illumination)并添加天光(Sky Light),进一步处理场景。在烘培(Bake)窗格中将反弹(Bounces)值设置为1,天光强度(Sky Light Intensity)设为0.5。结果使灯光更软,稍稍带漫反射相互反射效果(从绿色和蓝色立方体中渗色)。虽然还是3个立方体和一盏灯,但更加美观。

    19 使用粒子系统 19.1拾取物品 制作一个简单粒子系统,是为场景中洒落的各个可拾取物获取关注。目前,这些对象从远处有点难以察觉,加入一个简单的火花效果可以帮助玩家在角色移动时看到这些对象。

    对于这个简单的火花效果来说,创建一个简单的椭球例子系统。

    1、 使用Particle System来创建一个新的例子系统,并把它命名为Attention Sparkless。

    2、 接着创建在这个系统中使用的一种新材质。在Particles文件夹中创建一种新材质,并且为它赋予Additive Shader。找到新导入的attention-sparkle贴图并且把它赋予这种材质 3、 把这种新的火花材质赋予粒子系统的渲染器组件,并且把UV Animation字段改为X=4和Y=2. 4、 调整粒子系统的属性。

    19.2检查点激活 检查点对象也可以使用一种粒子效应来提示玩家当前哪个检查点是激活的,现在看上去他们都是相同的。使用网格发射器,而不是使用球形的发射器,来创建一个柱状发射器,以匹配检查检查点的底座。

    要创建一个柱状发射器,按照下列步骤进行:
    1、 先创建一个新的简单柱状对象。使用这个网格作为新系统的起始点。把这个柱状体缩放为X=4、Y=0和Z=4. 2、 从柱状体中删除Mesh Renderer和Capsule Collider组件—对于粒子系统来说,这两者都不需要。

    3、 现在创建一种和这个网格粒子系统一起使用的新材质,并且把它命名为Station Sparkless。

    4、 把这种新材质赋予粒子渲染器,并且设置其余属性。

    5、 为这种新效果创建一个预制模型,把场景中的某个CheckPoint对象设置为其父对象,随后,重新把这个新检查点对象的父对象设置为老的CheckPoint预制模型,以使用火花效果对其更新。

    20 项目总结 20.1总结的目的 项目在开发的过程中,遇到很多的问题,是需要总结并记录的,以便于下次在遇到同样的问题时,能够快速高效的解决该问题,以节省游戏项目的开发周期,降低开发的成本。并且,对一个已完成游戏项目的总结,在他人学习该项目时,可以提供很好的帮助。  20.2关键性问题总结 第一个关键性问题是精灵动画在贴图的时候遇到的麻烦。刚开始用是Unity3D的平面组件来进行贴图,但是贴图用上去之后,运行时,精灵在运动的时候是倒立的,在检视器窗口中进行手动旋转180度之后,貌似问题解决了,但是在脚本控制精灵运动的时候就会出现意想不到的运动,比如代码明明写的是让精灵水平运动,但是精灵却是斜着走的。然后,我又试着用盒子组件来进行贴图,问题就更加千奇百怪了。最后,终于找到了解决办法:用Maya创建一个平面,让这个平面的绕X轴旋转90度,然后绕Y轴旋转180度,使得自身坐标系的Z轴反向,这样再把这个平面导成FBX格式的,再导入到Modles目录下,以便进行精灵贴图时使用。  第二个关键性问题是实例化的Prefab对象的销毁问题。我们经常在实例 化一个Prefab对象之后就不去管他,这样的话就产生很多游戏对象,影响游戏的运行效率,增加系统的开销。比如本项目中人物发射的飞镖,我是让它在3秒后或者在击中飞鸟的时候销毁,起初我也不知道该怎么去销毁它,因为在实例化之后,这个游戏对象既没有名字(指的是玩家自定义的名字),也没有标签,在调用Desdroy()函数的时候必须填写名字,那么该怎么办呢?方法其实还是很简单的,申明一个私有的GameObject对象,用来接收每个实例化的对象,然后判断这个对象是否为空,不为空就进行销毁。  当然遇到的问题还有很多,这里列出了两个最重要最难解决的问题,以 便于以后或者他人遇到同样问题时能快速解决。  20.3游戏开发周期 做游戏项目一个很关键的因素就是游戏开发所需要的时间,即开发周期。影响本次项目开发的因素不仅是技术上遇到的问题,更多的是美工上遇到的问题, 很多游戏项目也因为美工不过关而终止,这就要求前期准备阶段要做好。在技术方面遇到了困难与问题不能一拖再拖,一定要迎面而上,积极处理并寻找解决问题的方法,以免延长游戏开发的周期。

    20.4实验体会 (1)对Unity3D学习的体会 本系统主要是用Unity3D进行系统整体框架的搭建,但Unity3D对于我来说是比较陌生的,大学期间只学习了一学期相关的知识,只是对其有一些初步的了解,这款软件刚刚进入到中国市场,所以对其有了解的人并不多,可供查阅的中文资料更是少的可怜,因此我登陆到了不少国外的网站进行搜索,查找到了不少英文的资料,从中提取有用信息的同时也让我对这款软件有了进一步的认识和了解。

    (2)设计实现的体会 在设计的过程中,我掌握了很多JavaScript编程语言,对系统的设计也有了较全面的理解。编程的过程对于我本身也是一个学习进步的过程,我自己在编程上水平十分有限,经常在一些很简单的地方出现错误,因此我总是去到网站上,QQ群中咨询前辈和同学们,老师们也给了我很大的帮助,在最后的编码中我已经可以完成一些功能的实现了,对于这点在以后的工作生活中也会给我带来莫大的好处。

    (3)程序设计中的体会 在我的程序设计过程中,书本上的知识是不够的,只有把理论与实践相结合才能够真正的学到知识。本次毕业设计是面向游戏者的,对这一领域的知之甚少给我带来了不少的困难,因为不知道游戏者的好奇心在哪里,所以在设计的初期我的软件看起来极为“不好玩儿”因此在逐步的改进过程中我也知道了赛车娱乐游戏应该着眼于哪里,如何吸引游戏者的眼光。但是这款游戏还是有一些不足,无法一步到位,这使我了解到,即便有了一定的编程的基础,但是距离做出一款优质的,吸引人的好软件还是十分有难度的。真正的好游戏应该不仅仅是在知识上给人以启发,更应该在宏观上更加的吸引人,让受众更加愿意把自己的精力放在产品上。

    中国kaung业大学