Unity5.6微信如何发布微场景后场景中一片粉色(缺少颜色材质),同时unity界面下方console报错

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 5753|回复: 3
unity发布ios教程_使用Unity 3D开发iOS游戏入门教程
本帖为抢楼帖,欢迎抢楼!&
5920/1000排名<font color="#FF昨日变化14主题帖子积分
熟悉之中, 积分 920, 距离下一级还需 80 积分
熟悉之中, 积分 920, 距离下一级还需 80 积分
蛮牛币1050
在线时间3 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
如果你想自学unity,那就从本教程开始吧!在本教程中,你将学到如何使用unity制作一款简单ios游戏——以前没经验也可以!这款游戏主要玩法就是:玩家要在某段时间内冲到终点,途中要避开障碍。
在制作游戏过程中,你将逐渐了解unity开发环境和流程,并且学习(或复习)到游戏设计基本概念。
本教程将分为三部分:在第一部分,你将学习使用unity制作简单角色操作机制。
你还会了解如何在ios上配置项目。
在第二部分,你将学习如何使用预制控制器对象和一些在标准软件包中建立脚本来改进角色移动;如何使用unity remote调试;如何自定义场景。
在第三部分,你将学习如何给项目中添加玩法和创建游戏设计概念,如预制件、计时器、菜单和声音等,以丰富游戏体验。
准备好学习新技能了吗?那就开始吧!入门沿着这个系列教程,你会慢慢熟悉unity开发流程,包括以下四个基本组件:1、用unity editor中装配游戏场景2、用monodevelop editor编写脚本3、用unity remote进行远程调试4、通过unity editor发布到你ios设备上在教程第一部分,安装好unity后,你将学习editor界面基本知识,然后创建一个项目,以便了解基本游戏概念。
到第一部分结尾,你游戏中应该有一个可以通过触摸触发器来移动角色。
你还要在unity editor中和你ios设备中测试你项目。
本教程使用是第4版unity,如果你没有话,就先下载吧。
unity提供30天内免费完整试用版unity pro。
这个版本已经足够开发出一款能在ios上运行游戏了。
unity在mac和windows系统上都可用,但本教程使用是mac系统。
注:unity软件包相当大,接近1gb,下载可能需要一些时间,看你网速了。
所以如果你想马上制作本教程游戏,那就提前下载好吧。
创建项目下载、安装、启动unity。
如果这是你第一次启动unity,那么软件会提示你激活版本。
勾选激活免费30天试用版unity pro,如下图所示:登录后,你会看到几个。
移到列表底部点击“not right now”就可以全部跳过了。
然后最后,你就可以开始使用unity了。
现在你看到是unity界面,其中已经有一个默认项目了。
如下图所示:丢掉那个项目,从菜单中选择file
ew project创建新项目。
你会看到如下图所示project wizard(项目向导):在project wizard上,点击set然后选择一个存放项目文件夹。
输入“dashandzag”作为项目名称并点击save,然后再点击create project(创建项目)(游戏邦注:你会看到对话框提示你是否保存之前打开默认项目,没有必要话就选择不保存。
)注:project wizard包含一些标准程序包,你可以在初始项目制作时导入。
不过现在还用不上。
到本教程后期,你可以导入任何你需要程序包。
unity会关闭当前项目并重启新项目:新画布出来了!但那些控制键、窗口和选项是怎么回事?从哪入手?初识ui完全习惯unity editorui确实要花上一段时间,所以多看看吧。
首先要看是右上角layout(布局)选项。
将视图变成wide模式:以下是整个界面分解图:project view(项目视图):你unity包含一个assets文件夹,它包含内容就显示在这个视图里。
你制作脚本、场景、预制件等unity对象就显示在这里。
hierarchy view(层级视图):包含当前场景中gameobjects(游戏对象)。
在unity游戏中所有物品都叫作一个gameobject;可以是从gameobject菜单中或导入资源中制作出来简单物品。
你初始项目只包含一个游戏对象:主摄像机。
scene view(场景视图):你可以在这个视图中放置游戏对象。
场景视图右上角处有一个scene gizmo(场景小座标),它显示了场景摄像头当前方向。
game view(游戏视图):这是从游戏摄像头看游戏视图。
点击工具条上play按钮就进入这个视图了。
另外,也可以通过点击视图上方选项卡在场景视图和游戏视图之间切换。
inspector(检查器): 可以通过inspector观察游戏对象细节,然后调整对象属性如大小或位置等,或附加脚本调整对象行为。
使用工具条转换工具来调整游戏对象位置和查看场景视图,会更舒服。
所以我们要先熟悉工具条使用。
hand工具使用使用hand工具(手工具)可以控制场景视野。
想下一下你自己落入一个3d场景中,里面有许多游戏对象;你能看见你面前游戏对象,在你身后则看不见。
你可能希望能看到更多对象(缩放),或者从左边右边观察其他对象,或者转过身看到后面对象。
这时候,你就要使用手工具了。
因为游戏对象会越来越多,为了在场景中布置对象,你会更加频繁使用这个工具。
手工具使用方法是,首先选中它,然后从层级视图中选择主摄像机(这样你才能在场景视图中看到东西);然后在场景中拖曳画布。
缩放视图时,可以使用鼠标滚轮或按键拖曳。
按下选项同时拖曳可以旋转视图。
点击右上方场景小坐标箭头之一,可以随时重置视图。
多练习,熟悉一下如何使用这个工具缩放/旋转场景。
因为你会经常在手工具和其他工具之间切换,所以最好能记住它快捷键。
各个工具快捷键默认分别对应键盘上q(手)、w(移动)、e(旋转)和r(缩放)。
注:手工具不能移动对象,它只能改变场景视野,看起来就好像是对象在移动。
多练习用手工具操作场景视图吧。
move工具使用你可以使用move工具(移动工具)在3d空间中对象。
选择主摄像机(游戏邦注:如果在场景视图中找不到,就在层级视图中双击它),然后点击移动工具。
你应该会看到主摄像机处出现一个三个箭头小座标。
三个箭头就表示物品可以移动方向。
红箭头表示x轴,绿箭头表示y轴,蓝箭头表示z轴。
选中对象后左击,然后朝小坐标内部(白线框)拖曳,就可以转换或移动游戏对象了。
选择主摄像机,然后移动。
看看检查器转换组件。
x、y、z值就表示游戏对象位置。
移动对象时,你可以看到这些值在变化。
使用移动工具或输入xyz值都可以改变游戏对象位置。
想把游戏对象朝某个方向移动时,只要选择小座标上对应箭头,左击并拖曳就可以了。
将游戏对象往x轴方向移动,你会发现在检查器中,只有x值发生变化。
请在y轴和z轴方向做相同测试。
现在,你已经知道如何移动场景视图,以及如何移动对象。
干得不错!rotate工具使用你可以使用rotate工具(旋转工具)在3d空间中旋转游戏对象。
为了学习旋转工具用法,我们应该更加详细了解场景小座标。
场景小座标就在场景视图右上角,它有不同模式。
其中一个模式(见下图右半边)是自由视图,你可以从3d透视图中察看场景。
如果你想知道游戏在3d空间中样子,这个模式是非常管用。
点击小座标下方字就切换到等角视图(见下图左半边)。
旋转游戏对象时比较适合使用这个模式。
另一个模式是x轴视图,也就是从x轴观察场景。
如果你想沿着y轴或z轴移动游戏对象,同时保持x轴不变,就可以使用这个模式。
类似,还有y轴视图和z轴视图。
原理同x轴视图。
选择主摄像机,右击小座标选择“free”就切换到自由透视模式了。
点击小座标下字可以在等角模式和透视模式之间切换。
依次点击x、y、z轴模式,看看场景小座标和场景视图变化。
再次选择自由视图,然后测试旋转效果。
在主摄像机仍然选中情况下,点击旋转工具。
你应该会看到如下图所示三个不同颜色圈,分别代表三个旋转轴向。
左击主摄像机中心,然后用鼠标拖曳。
注意,当你旋转对象时,你会发现检查器transform
otation属性在变化。
你也可以手动修改这些属性值。
在旋转时点击主摄像机中心,就是在所有轴向上做自由旋转。
你还可以绕着一个轴旋转游戏对象,比如,点击红色圆圈选中它,然后拖曳对象,就是在x轴上旋转对象了。
对绿色和蓝色圆圈做同样测试。
视野现在,你有必要学习一下局部视野和全局视野之间差别。
通过inspector ransform
otation将主摄像机旋转属性值重置为0,0,0,点击工具条上“local”按钮。
然后选择移动工具,这样你就可以看到场景小座标了:注意,场景小座标和主摄像机小座标是类似,两个小座标三个轴都分别代表相同方向。
现在,在检查器中设置transform
otation值为0,0,-20,就是沿着z轴旋转主摄像机。
注意,主摄像机小座标现在是沿着z轴旋转——这就表示这个对象这个轴处于它本坐标。
这与场景小坐标是不同,因为场景小坐标代表是整个空间方向。
切换到全局视图,看看有何不同。
在教程后半部分,你将学习移动游戏对象和发现它与不同空间(局部或全局)关系。
看一下旋转后主摄像机,如果你现在想在局部空间视图中把它朝x轴方向移动,最终结果会不同于在全局空间中把它朝x轴移动。
记住这一点,以后会用到!再学习下面内容以前,请再次将旋转值重置为0,0,0。
scale工具使用你可以使用scale工具(缩放工具)调整游戏对象大小。
与其他游戏对象操作工具一样,你只能在三个轴向收改变对象大小。
你也可以选择在inspector ransform面板中修改属性值来调整对象大小。
选择主摄像机,注意,缩放小座标是由位于各轴末端方形控点和中心方形控点组成。
沿着所有轴自由缩放方法就,选择对象中心方块后保持左击,然后朝外移让对象变大,朝内移让对象变小。
看一看inspector ransformscale属性,你会发现当你缩放对象时,属性值会发生变化。
选择代表x轴红色控点,按下同时朝外移动,这样对象就变大了。
你会发现在检查器inspector ransform面板上,只有x值改变了。
在y轴和z轴上做同样测试。
在inspector ransform面板中重置主摄像机设置,输入如下值:position(位置): 0,1,-10rotation(旋转): 0,0,0scale(缩放): 1,1,1结果如下图所示:添加游戏对象你已经学习了基本概念,现在可以开始添加游戏对象了——摄像机已经寂寞好久了。
目前摄像机面对世界还是空荡荡。
添加一个表示角色方块,再添加一个表示面平面(角色将在上面移动)。
当你使用unity设计游戏时,最好先思考游戏玩法,而不要考虑角色是怎么样。
这样你才能集中精神优化玩法和角色移动方式,而不是分心思考角色外观。
另外值得注意是,虽然unity是一个非常好,但你不应该用它制作图形资源。
有许多工具非常适合制作图形部件,而unity更擅长导入各种工具制作资源。
游戏开发分工通常是这样:游戏开发人员使用unity开发玩法,同时,图像设计师使用他们最拿手图像工具制作图像。
当图形资源能够达到美化游戏目时,二者就可以融为一体了。
选择game objectcreate otherplane,添加一个表示面平面。
这个新平面游戏对象会出现在层级视图中。
在层级视图中选择平面,然后设置transformposition值为0,0,0。
在检查器中将它大小设置为50、1、50。
你场景应该接近下图:接下来是添加一个角色游戏对象,用方块表示。
对啦,就是方块英雄!选择game objectcreate othercube,这样层级视图中就出现一个方块游戏对象了。
在层级视图中选中方块,然后在检查器中设置transformposition值为0,0,0。
结果如下图所示:点击移动工具,然后在场景小座标上点击y轴,将对象移动限制在y轴上。
移动方块,使它位于平面(面)之上。
你还可以通过设置位置属性值为0,1,0达到相同效果。
现在我们迎来激动人心时刻了——点击工具条上play按钮,预览你游戏:你现在就是在用unity editor测试你游戏。
你应该换到游戏视图,结果如下图所示:你现在看到是通过场景主摄像机看到游戏。
你角色,这个方块英雄就站在面远处——多么孤独而勇敢存在!这个游戏还没有什么看点,因为你还没添加任何组件来调整角色行为。
并且,场景有点暗了。
我们先来解决场景问题,也就是给场景添加一个光源。
再次点击play按钮,退出游戏预览。
回到场景视图,添加光源:选择game objectcreate otherpoint light。
像平常一样,移动光源到合适方,然后进一步调整位置。
在检查器中设置transform position属性值为0,0,0。
现在调整光源高度和亮度,以便看清场景。
给你提示一下:使用移动工具,只沿着y轴移动。
高度调好后,就可以调亮度了:在light组件中修改range(范围)和intensity(强度)设置。
如果想看得更清楚一点,可以利用手工具来环转场景。
有了足够光之后,点一下game选项卡(不是点击play按钮)切换到游戏视图,你就可以看清场景了。
来回移动光源,直到你可以看到角色。
调整完后,点击play按钮检查修改效果。
当你切换到游戏视图时,你看到结果应该如下图:恭喜你啦,你已经添加完教程现阶段要求所有游戏对象了。
记住,你应该先设计游戏玩法,然后再考虑图像。
既然你已经做好一些有意义东西了,那就将结果作为场景保存到项目中吧。
项目可以由一个或多个场景组成。
你可以把一个场景等同于游戏一个关卡。
在这个教程中,你可以将各个部分当作一个场景。
这是一个仿造游戏关卡概念,但你可以重复利用一个场景资源。
保存场景方法是选择filesave scene,然后在save scene对话框中输入场景名称为level_1。
你项目视图将更新成你刚做好场景。
事件函数游戏现在还是静态。
我们必须让它“活”起来。
你可以通过制作自己脚本或使用已打包脚本,附加到相应游戏对象上,从而让对像活动起来。
例如,在本教程第一部分,你做了一个“通过触摸移动角色”脚本。
你制作这个脚本应该响应触摸事件,以改变方块英雄位置和旋转情况。
unity支持脚本语言有:javascript、c#和boo。
本教程使用是javascript。
unity脚本语言包括预定义事件函数,你可以用它定义游戏对象行为。
最常用事件函数是update()。
如果你在脚本中定义这个函数,每一帧它就会被调用一次。
每一帧游戏显示就会绘制一次,所以update函数就负责帧中显示。
游戏以每秒某数量帧运行,记住,这个速率根据游戏运行平台、其他应用占用系统资源会有所不同。
这意味着,你不应该把东西做得太密集,并且你不可能估计到那个速率到底是多少。
另一个预定义事件函数fixedupdate()不同于update(),它是个固定帧速。
如果你脚本定义了这个方式,它就会每隔一段固定时间调用一次(相比之下,update方式每一次调用可能各不相同)。
因为物理是非常讲究时间,所以更适合使用fixedupdate()函数处理任何物理相关活动。
例如,现在有一个使用物理游戏对象,如刚体 (之后会学习到)。
当这个对象与另一个对象相撞时,你必须计算作用到对象上力量,这就要通过fixedupdate()函数来实现。
至于像改变对象位置或旋转之类操作,最好使用update()函数。
第三个实用函数是start(),在第一帧update发生以前调用。
一般会把初始化放在这里。
最后是awake(),它在游戏开始时调用。
也是放初始化代码好方。
触摸我们来尝试一下。
创建一个新脚本:选择assetscreatejavascript。
这样,一个带默认名称“newbehaviorscript”新脚本就出现在你项目视图中。
点击脚本名称,重命名为“movesimple”。
start()和update()函数已经帮你写好了,因为它们是常用事件函数。
如果你不需要start()函数,那就去掉它。
添加如下变量,它们是用来控制方块英雄移动和旋转速度:用如下代码替换空白update():function update () { // detect mouse left clicks if (input.getmousebuttondown(0)) { // check if the gameobject is clicked by casting a // ray from the main camera to the touched position. var ray : ray = camera.main.screenpointtoray (input.mouseposition); var hit : // cast a ray of distance 100, and check if this // collider is hit. if (collider.raycast (ray, hit, 100.0)) { // log a debug message debug.log(“moving the target”); // move the target forward transform.translate(vector3.forward * speed); // rotate the target along the y-axis transform.rotate(vector3.up * rotatespeed); } else { // clear the debug message debug.log(“”); } } }保存修改。
这份代码首先寻找鼠标点击事件,特别是鼠标左键点击。
当使用getmousebuttondown函数时,参数“0”表示左键单击,“1”表示右键单击,“2”表示中键单击。
如果检测到单击事件,代码就会使主摄像机生成一道光束(想一下激光笔),移到鼠标点击位置。
collider.raycast()函数会检测脚本中碰撞器是否被光束击中。
如果碰撞器被击中,collider.raycast()就会返回“true”。
这个函数调用有3个参数:1、你构建光束2、raycasthit对象,如果碰撞器被击中,还包含更多细节3、光束长度参数假设结果是“true”,接下来代码就会让角色向前移动,speed变量决定它速度,rotatespeed变量决定它旋转。
transform.translate()函数将游戏对象按它vector3输入指定方向和距离进行移动。
vector3是代表一个具有方向和长度或大小对象3d矢量。
这个矢量可以分解成x、y和z组件。
在代码中,你方块英雄向前移动,距离增加器是根据speed变量计算。
vector3.forward与vector3(0,0,1)一样,速度增加器为3就是把方块按vector3(0,0,3)移动。
角色移动方向与角色本座标有关。
选择方块,然后使用移动工具,你看到z轴方向就是角色将前进方向。
transform.rotate()函数会根据由vector3输入指定角度旋转游戏对象。
euler角就是用来描述游戏对象方向。
euler角z度就是绕着z轴旋转,euler角x度就是绕着x轴旋转,euler角y度就是绕着y轴旋转。
在以上代码中,角色使用vector3.up或vector(0,1,0)作旋转动作,表示绕着y轴移动。
旋转角度按rotatespeed增加。
旋转与角色本座标有关。
所以你方块英雄将绕着它y轴旋转,你知道,这与全局y轴是不一样。
注:真正游戏绝对不会使用这类移动方式来控制角色。
本教程是为了介绍关于移动游戏对象基本概念才使用。
教程后面使用将是更真实移动方式。
这份代码包含两个debug.log()语句。
当游戏在运行时,log输出就会在unity控制器中打印。
在unity editor底部,你可以看到最后一次log输出。
你还可以通过选择windowconsole看到前一次log输出,或清除log记录。
你应该时时注意unity editor底部log输出,因为那就是显示脚本错误方。
通过代码定义行为后,就可以把行为赋给游戏对象了。
在层级视图中选择方块,然后选择componentscriptsmove simple。
这个步骤就是添加一个脚本行为给游戏对象,你也可以简单选择你已经做好脚本(名称为movesimple)。
注意,检查器现在包含一个movesimple脚本段落。
你可以在检查器视图中看到你在脚本、speed和rotatespeed中定义公共变量。
你现在可以只调整这些公共变量,而不必变更基础脚本。
这意味着如果在场景中有两个角色带有movesimple脚本,那么只要增大inspectormove simplespeed数值,就可以让其中一个角色移动得比另一个更快。
点击play预览游戏。
点一下角色让它移动,注意检查器中位置和旋转属性变化。
注意,位置从0,1,0变成0,1,3了——换句话说,根据速度增加器,角色在z轴上移动了3。
旋转也从1,1,1变成1,10,1,这是旋转速度增加器造成结果。
游戏在运行时,你可以在检查器中调整速度和旋转速度变量。
点击角色后,增加速度值,观察角色位置变化。
停止游戏,注意速度和旋转速度变量会恢复到初始值。
在游戏运行中你做任何调整都是暂时。
这有助于你尝试不同数值,结束预览后回到初始设置。
如果你决定改变设置,那就要在测试游戏以前进行。
注意,当你运行游戏时,控制器记录正确排错声明,这取决于角色是否被点击。
摄像机设置你应该已经注意到,当你移动方块英雄时,它就会离摄像机越来越远——感觉不太好。
就像无微不至父母照看刚学会走路孩子,你希望让主摄像机在角色后面一直跟着。
这是第三人称射击游戏典型做法。
选择assetsimport packagescripts,在items to import窗口中选择smoothfollow脚本,然后点击import:注:如果当你选择assetsimport packagescripts时没有看到导入选择对话框,那么就试一下退出unity后重新启动。
这么做对我来说是有效。
在你项目视图中应该可以看到新standard assets文件夹。
浏览它下级文件夹可以看到smoothfollow脚本。
双击这个脚本,在monodevelop中打开,这样你就看到了代码关键部分。
以上表示被追踪目标公共变量。
使用目标转变信息来设置追踪者(主摄像机)位置和旋转。
追踪者位置和旋转在lateupdate()中设置,这是另一个预定义事件函数。
这个函数是在update()函数完成后调用,一般你会把与发生在update()中操作有关代码放在lateupdate()中。
当方块英雄位置和旋转在movesimple脚本定义update()中改变了,摄像机就会在smoothfollow脚本lateupdate()函数中更新它自己位置和旋转。
以上代码段落有几个关键点:1、找到追踪者必须旋转角度,以匹配目标旋转。
旋转是绕着y轴进行。
2、追踪者在目标之后沿着y轴移动,距离由距离变量决定。
追踪者还根据目标旋转绕着y轴旋转。
最后,确保追踪者在目标上方高度固定。
3、确保追踪者总是面向目标。
现在将脚本赋给主摄像机。
在层级视图中选择主摄像机,然后选择componentcamera controlsmooth follow:检查smooth follow新段落是不是添加到主摄像机检查器中。
注意,target变量现在还没赋值。
你要把方块这个游戏对象指定给这个输入。
在主摄像机仍然选中,smooth follow脚本在检查器中可见时,将方块游戏对象从层级视图中拖曳到target变量。
或者,你也可以点击target值旁边带小点圆圈,从对象列 表中选择。
现在,target变量已经与方块(角色)连系起来了。
点击play按钮。
你应该可以马上看到视野变化,你现在是从给定高度观察角色。
点击角色移动它,观察摄像机如何追踪角色。
注意主摄像机在检查器中转变信息会随着方块英雄移动而发生变化。
停止游戏,保存后再进行下一步。
在ios上部署你一定等不及想看看游戏在ios设备上运行情况。
好消息是,unity pro试用版允许你在ios上测试你项目!最好能在真正设备上测试你unity项目。
你总不希望仅在模拟器上测试吧,即使你可以做到。
因为游戏开发严重依赖基础硬件,所以只有在真正设备上测试,才能更容易发现性能问题。
unity可以把你游戏建成x代码项目,使你可以在ios设备上部署。
选择fileuild settings:选择ios平台,然后点击switch platform。
再点击build settings对话框底部player settings按钮。
unity editor检查器会显示player settings,你可以自定义你ios部署。
请做以下调整:默认方向:横版向左其他设置捆绑标识符:这样你应用才能顺序部署到设备上。
sdk 版本: device sdk瞄准ios版本:4.3返回到build settings对话框。
在scenes in build窗口添加场景。
因为你项目只有一个场景,所以很容易添加。
点击add current按钮就可以添加level_1 scene了。
点击build按钮,启动创建进程。
你可以指定某个方保存x代码项目:在save as中输入dashandzag,然后选择save。
unity现在就建立了一个项目,打开包含x代码版本文件夹。
这个项目名称是unity-iphone.xcodeproj。
打开x代码项目,确保scheme设置成unity-iphone,选择你设备,然后建立项目。
运行应用。
你首先会看到带unity默认标志画面。
然后,你游戏就出来了:触碰方块英雄,观察它移动。
你已经将你第一个unity项目部署到ios上了!操作等等,事情还没完呢!如果你玩得更久一点,你会注意到一件奇怪事。
你可以通过一根手指触摸方块来移动它。
但是,当你用两根手指放在离它等距离方时,方块也会移动。
这是怎么回事?从movesimple脚本中调出这行代码:这行代码就是让摄像机发出光束移到触摸点。
input.mouseposition就表示触摸点。
当项目在ios设备上运行时,input.mouseposition是按当前所有触摸平均位置计算,所以当你手指那么放时,角色就移动了。
你应该修复这个问题,以免困扰用户。
你可以使用unity中触摸相关函数来检测触摸事件,以便找到更准确触摸位置。
开打movesimple脚本。
在顶部(其他变量所在方)添加一个标记,表示你可以使用触摸输入:private var istouchdevice : boolean =你可以在ios和unity editor中测试。
如果你只在ios上测试,那么你就可以忽略触摸检查逻辑,只使用触摸相关函数。
下一步是添加一个awake()函数,它会执行运行期检查,以检测游戏是否在ios环境下运行。
awake()函数只调用一次,也就是在游戏载入时候:application.platform返回游戏正在运行平台。
runtimeplatform.iphoneplayer表示游戏正在ios上运行。
最后,将你update()函数作如下修改:保存修改。
你正在使用两个新本变量,clickdetected和touchposition,检测点击和保存点击位置。
如果是在ios上运行,那么就是通过查看触摸来检测点击。
然后,根据第一次触摸位置来计算点击位置。
如果你不是在ios上运行,那么逻辑如之前一样。
在重建项目以前,请关闭x代码项目。
现在,从build settings对话框中重建。
如果出现以关于build文件夹已存在警告,那就选择replace。
x代码项目重建好后,在ios设备上运行游戏。
检验是否能移动方块英雄,以及用两根手指移动它问题是否解决。
结尾恭喜啦,你已经初步掌握unity基本概念和在ios上部署!在本教程下一部分中,你将学习如何改进方块英雄移动和完善场景。
另外还要做一点调试工作!这是使用unity 3d创造ios游戏教程系列第二部分。
在该系列第一部分我们通过创建一个非常简单项目并将其用于ios设备上而了解了unity基本要素。
而今天我们将添加一些函数去丰富这一项目,即包括更有趣玩家移动和更棒游戏场景。
让我们开始吧:场景改变首先打开我们在第一部分教程中所创建unity项目。
今天教程将基于一个全新场景,从而让玩家可以在之后轻松使用之前场景作为参考。
选择filesave scene as…并将新场景命名为level_2。
新level_2场景将出现在项目视图中。
之前场景中所有资产(游戏邦注:包括脚本)都能够用于新场景中。
在你可以改变gameobjects在level_2场景中呈现而不会影响到level_1场景中相同对象。
玩家移动首先我们需要强化玩家移动。
现在我们heroic cube始终都是向前移动,并向右旋转。
这种移动并不顺畅,也不有趣。
角色控制器是unity组件,我们能够将其附加到gameobject去创造更加真实移动。
我们可以基于脚本函数去操纵角色控制器。
举个例子来说吧,我们可以调用预先定义simplemove函数去移动角色。
在vector3中simplemove函数代表执行移动速度。
角色移动会自动算上重力,从而让它能够爬上斜坡也能爬下楼梯。
同时角色还能滑过各种障碍无需你去编写代码提示他们。
为了更好理解这一点,我们可以在hierarchy view中选择cube gameobject,并选择componentphysicscharacter controller。
你将看到一个对话框在询问是否用charactercontroller替换box collider。
点击替换。
在inspector中你可以看到一个有关角色控制器新组建。
你需要创造一个全新脚本去控制玩家移动,从而让你无需再将movesimple脚本附加到heroic cube上。
在inspector点击movesimple脚本组件右边齿轮图标,并选择移动组件。
脚本将不再出现于inspector。
通过选择assetscreatejavascript创建一个新javascript资产,并将其命名为movearound。
在monodevelop editor双击打开新脚本。
选择存根函数并添加如下代码:保存你所做出改变。
脚本最后一行内容明确了这一脚本只能附加到gameobject(游戏邦注:拥有一个角色控制器组件)。
update()函数拥有角色控制器组件句柄。
然后它将围绕着y轴(基于代表着左/右移动输入内容)进行旋转。
左/右移动是默认由左/右箭头和a/d键所控制。
input.getaxis()值范围是从-1到+1。
负值代表逆时针方向,而正值则代表顺时针方向。
基于来自input.getaxis(“vertical”)输入内容,simplemove函数能够向前或向后移动角色。
这一输入内容是由向上 /向下箭头或w/s键所触发。
就像水平输入一样,input.getaxis()值范围是从-1到+1,负值和正值将分别触发向后和向前移动。
我们 将使用倍速器去控制和旋转角度或移动距离。
将新脚本附加到heroic cube。
当你完成了这些设置后,你便能在玩家inspector上看到新move around脚本组件。
为什么不使用unity editor去旋转heroic cube?点击游戏按键并感受左右旋转,向前并向后移动乐趣吧!使用左/右/上/下箭头进行移动,同时测试w/a/s/d按键。
多亏了角色控制器组件和脚本,如今玩家移动变得更加顺畅了。
使用unity remote进行调试你可能会注意到,在最后教程中基于ios设备测试项目有点麻烦。
导出到xcode项目与在设备上创建和运行过程需要我们花费一定时间,而这些都包含在开发过程中。
不过也存在一些更有效方法。
最快调试方法便是使用名为unity remote应用。
这一应用让你能够略过多个步骤,如面向ios创建项目,启动xcode并在你设备上运行。
基于unity remote ios应用,我们可以将自己ios设备与unity editor连接在一起,并从ios设备上去控制unity editor。
这能让你在unity editor上快速调试游戏。
在app store上购买unity remote是免费。
注:如果要使用unity remote,你ios设备和计算机必须使用同一个wi-fi网络。
除此之外,unity editor窗口还必须保持前台操作。
如果你将unity editor窗口转向后台,你便会收到“等待游戏视图。
按压‘播放’”信息。
在unity editor上点击“播放”。
在你ios设备上启动unity remote应用。
从出现列表中选择你计算机。
如果你计算机并未出现在列表上,那就在unity remoteip设置上输入计算机ip址。
当unity remote与你计算机匹配在一起时,你ios设备便能够在unity editor上控制游戏运行了。
虽然设备显示器分辨率不是最理想,但这却是创建游戏原型快速方法。
当然,你也想偶尔面向ios创建项目并通过 xcode发行,所以你可以基于更加现实情境去测试游戏。
基于ios测试游戏。
你会发现,因为在ios中并不存在向左/右/上/下输入,所以你不能在设备上移动玩家(游戏邦注:但是你却可以在mac上进行控制)。
接下来你将执行一些操纵杆控制去解决这一问题。
双重操纵杆,双重乐趣幸运是,unity标准资产包(包含资产)能够执行操纵杆函数。
我们需要选择assetsimport packagestandard assets (mobile)从资产包中导入相关道具(如下所示)。
选择与操纵杆函数相关指示道具。
点击import。
在完成导入后,项目视图将包含名为standard assets (mobile)新文件夹。
在带有导入操纵杆脚本untiy 4中你将看到如下警告:为了解决这一问题,让我们双击警告内容。
如此便会打开操纵杆脚本文件。
将鼠标放在警告行上:修改声明为:现在当你回到unity editor时,你会发现警告已经消失了。
首先在场景上添加dual joysticks预制件。
预制件可以再次利用,并总是被定制为gameobject。
我们可以从项目视图拖出预制件或经由脚本将其添加到场景中。
例如,我们可以先创建一个代表玩家预制件,并添加多个玩家到场景中。
在你项目视图中打开standard assets (mobile)prefabs文件夹。
将dual joysticks预制件拖到层次结构视图中。
我们可以点击游戏标签并进入游戏视图看到操纵杆:让我们回到场景视图中。
在层次结构视图中点击dual joysticks旁边三角形。
我们可以注意到dual joysticks gameobject包含了两个孩子gameobjects。
这个过程就像是“养育”过程,能够用于设置操纵杆父母/孩子gameobject之间关系。
如果你想要创造一个复合gameobject(拥有 连接gameobject),那么“养育”过程便非常有帮助。
举个例子来说吧,如果你想要左右操纵杆同时发挥作用,那么当它们都被当成单一对象时,你便能 够通过脚本轻松实现这一过程了。
选择leftjoystick gameobject,并注意到它附加了操纵杆脚本组件,选择rightjoystick gameobject进行同样核查。
操纵杆可以查出gui texture上碰触事件,并基于某些限制条件去改变它位置。
例如,我们只能在特定范围内移动图像。
脚本将确保位置输出规范化,即保持在-1至+1范围内。
如此我们便能在ios环境中使用操纵杆去替代input.getaxis()。
这时候你已经在场景中放置了2个操纵杆,但是它们却不能连接到heroic cube去触发输入内容。
我们将修改脚本去分配操纵杆任务,即右边操纵杆能够旋转玩家,而左边操纵杆将前后移动玩家。
var movejoystick : var rotatejoystick :然后添加一个新函数,即面向操纵杆位置并回到输出范围(在-1至+1之间)。
将其添加到 update()函数之后:操纵杆输入是一个vector2输入,拥有x和y组件。
我们可以使用更大x或y绝对值去设置输出内容。
我们还可以将操纵方向作为倍增器去指示负值或正值。
结果便是输出值范围也是在-1至+1之间。
修改update()函数去处理来自unity editor或ios设备输入内容:变换rotate()函数将接受左/右箭头(或a/d按键)或旋转操纵杆输入。
角色控制器simplemove函数将获得来自上/下箭头(或w/s按键)或左操纵杆输入。
保存改变后脚本。
选择玩家gameobject(立方体)并注意move around脚本组件拥有两个关于移动操纵杆和旋转操纵杆全新公共变量。
目前这些变量并未得到分配。
我们仍需要选中玩家gameobject,并将leftjoystick gameobject拖到move joystick变量。
将rightjoystick gameobject拖到rotate joystick变量。
(或者我们也可以使用每个变量旁边选择器。
)点击unity editor“播放”,并在我们ios设备上开始进行unity remote。
测试操纵杆函数并核实我们是否能使用左操纵杆向前或向后移动,并使用右操纵杆向左和向右移动。
当我们在ios设备上移动操纵杆时,我们也应该能够看到操纵杆在unity editor上移动。
注:也许你看到操纵杆图像如图所示。
但是不要担心,在真正设备上出现操纵杆并不是这样。
清晰明亮天空盒如今我们已经完善了heroic cube移动,接下来是否该完善场景呢?到目前为止玩家一直待在一个阴暗世界。
我们应该想办法去美化游戏环境。
幸运是这并不困难。
unity包含标准资产包中资产,我们可以使用这些资产去创造天空,添加植被并改变形高度。
在这一阶段你将利用天空盒组件去添加天空。
天空盒是一个较大立方体,能够附加到游戏main camera上。
当你添加了组件时,你便能够添加材料去装饰它,并经过渲染而创造出天空效果。
选择assetsimport packageskyboxes开始输入过程。
选择sunny2 skybox.mat,然后点击import。
在完成输入后,你项目视图将拥有一个全新standard assetsskyboxes文件夹,即包含最新输入资产。
选择main camera对象,然后选择component
enderingskybox。
新组件将出现在inspector。
我们可以注意到新组件包含一个代表材料变量。
在此你所输入天空盒材料便能发挥作用了。
点击custom skybox变量旁边小小圆形图标。
这时候将弹出select material对话框,其中列出了一些你项目可以使用材料资产。
太阳也出现了!尽管有时候会出现阴天,但是我们也可以添加一些绿色植物为游戏世界增添色彩。
不要忘记植物让我们回到场景视图。
我们可以添加形gameobject而创造植被,然后添加材料(如草)和对象(如树木)。
这时候我们将不再需要平面gameobject,因为形将负责铺设层面。
右击层次结构视图平面gameobject,然后选择删除。
选择assetsimport package errain assets。
点击import去输入所有选择。
这时候形资产将出现在标准资产文件夹中。
我们可以使用已经输入资产去修改形gameobject行为。
选择terraincreate terrain将形gameobject添加到场景中。
选择形对象并使用inspector将其参数域改为-1000,0,-1000。
这将最大限度延伸形,从而提供给玩家足够广移动空间。
terrain (script)所包含工具能够帮助我们装饰形:选择绘画工具中画笔:我们将能用草去装饰形。
点击edit texturesadd texture:在add terrain texture对话框纹理区域中点击“选择”,选择grass (hill)纹理,关闭弹出select texture,然后选择“添加”:点击场景然后开始绘制草。
检查原图,然后点击游戏标签:如果只是进行景观美化便非常简单!回到场景视图–现在我们便能够种植一些棕榈树了。
在terrain (script)中选择“种树”工具:点击edit treesadd tree:在添加树对话框中点击树旁边圆形图标,选择palm gameobject,然后点击“添加”:将笔触大小设置为20:然后我们便可以点击适当位置去添加树了。
提示:放大场景并着眼于我们想要种树位置。
在添加树过程中尝试着调整电光源范围和高度去浏览更多场景。
完成这些设置后你场景将如下图所示:已经很棒了!渐渐有了真实世界雏形了。
但是形看起来还是很平坦。
这时候我们可以在形中添加一些高度变量。
在terrain (script)中选择最左边工具去提高或降低形高度:将笔触大小设置为20,然后在场景视图中围绕着玩家点击2至3个点(不要靠太近)以变化形高度。
预览游戏并在场景中移动。
适当调整场景中树数量,并记得在做出任何改变之前暂停游戏。
保存场景。
使用unity remote去测试项目,当你感到满意时便能够将其作为一个xcode项目。
选择fileuild settings,在构建设置对话框中点击add current去添加level_2场景。
新场景将出现在scenes in build列表上。
这是取消level_1场景选定而至创建level_2。
点击建造,必要话选择替换之前项目,然后启动xcode项目。
在我们ios设备上调配并测试。
ios device(from raywenderlich) 在本系列第一部分,你已经掌握了基本unity工具用法,创造了一款含简单玩家控制机制游戏,并且知晓如何在ios平台配置项目。
在本系列第二部分,你加快了游戏中heroic cube移动,加入天空、草、树木和多变形,使游戏世界呈现了一些生命力。
在第三部分中,你将给项目添加游戏玩法。
这里不是简单在场景中四处移动,而是让你heroic cube在特定时间内撞击到达终点线。
为了给玩家制造一些挑战,我们要在cube奔向终点过程中设置一些障碍。
为此我们要添加一个定时器,并在获胜时添加欢呼声,失败时则是死寂般沉默。
首先,将level_2场景保存成新场景并命名为level_3。
在第三部分教程中,你将针对新场景改变原有内容。
你可以用一个粗线将两个标杆连接起来创造终点线,这样玩家可以清楚看到目。
终点线将包括一个无形墙,如果heroic cube过线了就会触发相应结果。
选择gameobjectcreate empty创造一个代表终点线新对象。
这是一个gameobject母对象,其子对象将包括标杆、线条和墙体。
将这一对象通过inspector仪表盘或者右击对象,选择“重命名”将其重命名为finish line。
将转变位置设为0,0,0。
要创造第一个标杆,选择gameobjectcreate othercylinder,将其重命名为post1。
将转变范围设为1,3,1。
将转变位置设为-10,0,20令其呈现在玩家左前方。
使用move tool,调整y位置,让圆柱体底部就略低于面。
post1_after_height_adjusted(from raywenderlich) 拖拽post1 gameobject并将其放置于finish line gameobject,让后者成为post1母体。
post1_parented(from raywenderlich) 要创造第二个标杆,选择post1,右击并选择“复制”。
再右击一次并选择“粘贴”。
将这个新gameobject从post1重命名为post2。
使用move tool,调整x位置以便标杆立于玩家右侧。
提示:从y轴查看场景以便做出调整。
或者,将转变x位置设为10也可以。
post2_after_xposition_adjusted(from raywenderlich) 下一步,创造用于检测cube是否穿过终点线墙体。
选择gameobjectcreate othercube,将其重命名为goal。
将转变范围设为24,10,0.5。
将原转变位置设为0,2,0。
goal_scale_adjusted(from raywenderlich) 将墙体移动到两个标杆之后。
如果必要话,调整x范围值,以便墙体从一个标杆延伸到另一个标杆。
goal_scale_position_adjusted(from raywenderlich) 现在墙体仍在选择状态,打开inspectorox collider组件,查看is trigger数值。
取消选中mesh renderer组件以便让墙体隐形。
boxcollider_istrigger_meshoff(from raywenderlich) 拖拽goal gameobject,使其位于finish line gameobject之下,成为后者子对象。
goal_parented(from raywenderlich) 下一步就是创造连接标杆线条,以便玩家清楚看到终点线。
你将通过脚本从一个标杆到另一个标杆绘制出线段。
选择assetcreatejavascript创造新脚本并将其命名为finishlinerender。
在project view中双击打开脚本,删除其中隔离功能,添加以下代码: // the finish line posts var post1 : var post2 : var linecolor : color = color. function start () { // set the visual for the finish line posts var linerenderer : linerenderer = gameobject.addcomponent(linerenderer); linerenderer.setposition(0, post1.position); linerenderer.setposition(1, post2.position); linerenderer.material = new material (shader.find(“particles/additive”)); linerenderer.setcolors(linecolor, linecolor); } linerenderer类允许玩家在3d环境中绘制线条。
通过一排节点,你可以使用line renderer组件(componentseffectsline renderer)画出直线。
你可以将line renderer组件添加到finish line对象,并为post1和post2转变位置进行硬编程,但通过代码创建line renderer会更轻松些。
这就是你现在操作。
你要在start()函数中画出线条,这只要一次就成。
首先你要添加linerenderer脚本界面组件,然后从变量输入值中为线条设置第一和第二个点。
设置渲染器中材料。
最后,设置线条起点和终点颜色。
要让线条颜色值设为公共状态,以便过后进行调整。
将finishlinerender脚本组件附于finish line gameobject。
提示:你可以通过选择finish line对象然后轻敲inspector中add componet按钮为gameobject添加脚本。
此时会出现一个检索框——只需简单输入“finishlinerender”一词头几个字母,就会自动显示脚本内容。
finishline_script_added(from raywenderlich) 分别将post1和post2 gameobject分配到post 1和post 2变量。
finishline_vars_assigned(from raywenderlich) 在unity edito中预览游戏。
你会看到两个标杆以及一条绿线所组成终点线。
gameview_finishline 1(from raywenderlich) 下一步代将创造一个能够检测超过终点线这一行为新脚本,并将这一新脚本粘附到goal gameobject中。
选择assetscreatejavascript并将脚本命名为finishlinedetection。
function ontriggerenter(other : collider) { if (other.gameobject.tag == “player”) { debug.log(“you made it!!!”); } } @script requirecomponent(collider) 在另一个碰撞器进入gameoject时就调用ontriggerenter()函数。
要将这个gameobject设置为触发器(正如goal对象设置一样)。
玩家gameobject有一个称为角色控制器组件碰撞器。
所以当玩家冲过goal gameoject时,就会触发ontriggerenter()事件。
你要在你代码中,查看gameobject是否进入了一个标签名为“玩家”对象。
如果是这样,就说明heroic cube穿过了终点线。
将finishlinedetection粘附到goal gameobject。
提示:在hierarchy view中选择goal对象,从project view中将finishlinedetection脚本拖拽到inspectoradd component按钮,以将该脚本组件粘附到gameobject。
在你拖拽玩家之前,为玩家gameobject命名(而不是简单旧名“cube”)。
为了保持一致,将cube gameobject重命名为player。
cube_renameto_player(from raywenderlich) 现在,为玩家对象添加一个标签,以便终点线检测逻辑生效。
在inspector中下拉标签选项并选中player。
player_tag_select(from raywenderlich) player_tagged(from raywenderlich) 玩家是预建标签之一。
之后,你将创建自己标签以便鉴定游戏中所有敌人。
点击play并将heroic cube移到终点线之后。
你就会看到“你成功了!!!”这一记录信息,你就知道玩家此时已经穿过终点线。
gameview_finishline(from raywenderlich) 没错,heroic cube能够到达目标并赢得游戏,但你不能让它太轻松实现。
你还得为游戏添加两层复杂性:一个基于时间挑战和多个障碍。
首先,让我们添加障碍。
创建一个空白gameobject,并将其命名为launcher,代表将阻止heroic cube前进步伐障碍发射中心。
在z轴方向上,使用move tool将发射器对象放置于玩家和终点线之间,并且位于玩家之上。
你可以将转变位置设为0,12,8,并根据需要进行调整。
launcher_adjusted(from raywenderlich) 发射器主要存在理由就是发射障碍,所以你得给它提供一些发射物。
在unity中创造弹药一般是先设计一些gameobject,然后创造一些能够在游戏玩法场景中实例化预制件。
你将创建一个obstacle gameobject,将其转变为预制件,然后让发射器将其射向倒霉玩家。
创建一个方形gameobject,并将其命名为obstacle。
把转变范围设为2,2,2,让它比玩家更大并更具威慑感。
这就是那些将扮演坏蛋立方体。
让这些障碍看起来更有趣一些,而不只是默认灰色物质。
为匹配完整样本,首先要从角色控制器包中输出一个材料:选择assetsimport packagecharacter controller,然后选中constructor_done材料以及在下图中显示相关纹理,最后点击import。
obstacle_material_import(from raywenderlich) obstacle_material_after_import(from raywenderlich) 选择obstacle gameobject。
通过调整inspectormesh renderermaterialselement 0属性改变渲染材料。
点击靠近属性圆形图标,产生“材料选择”对话框。
obstacle_select_material(from raywenderlich) 选择你刚输出constructor_done材料,关闭“材料选择”对话框。
obstacle_after_material_added(from raywenderlich) 现在你必须为obstacle gameobject贴标签,以便开始新游戏时清除场景中obstacle实例。
为此,创建一个名为enemy新标签。
点击inspector agadd tag。
tagmanager将显示在右侧栏。
点击靠近标签三角形来扩展标签阵列。
将element 3值设为enemy。
add_enemy_tag(from raywenderlich) 选择obstacle gameobject,并为这一对象贴上新enemy标签。
obstacle_tagged(from raywenderlich) 当obstacle被具体化时,你将添加代码则需要将一个刚体组件粘附到障碍上。
这要先添加一个刚体。
选择componentphysics
igidbody(游戏邦注:obstacle仍在选中状态): rigidbody_added(from raywenderlich) 点击project view中assets文件夹。
选择assetscreateprefab,为你障碍物创建一个预制件。
此时project view会显示一个空白预制件。
将其命名为障碍。
create_prefab(from raywenderlich) 注:如果你资产图标大于以上截图所示情况,并且不知该如何查看资产列表中物品,只需向左下滑资产列表就能看到。
将obstacle gameobject拖拽到这个新预制件中。
obstacle_prefab(from raywenderlich) 现在你已经创建了一个可作为重用资产预制件,在这个场景中已经不再需要这个预制件。
发射器将负责在必要时候具体化一个obstacle实例。
在hierarchy view中,选择obstacle gameobject,右击并选择“删除”。
下一步,通过脚本创造逻辑以发射障碍,完成这一过程。
创造一个新脚本资产并将其命名为obstaclelauncher。
提示:你可以在project view中右击并选择createjavascript以创建一个脚本。
var projectile : var speed = 5; var maxobstacles = 2; var launchinterval : float = 5.0; var target : private var nextlaunch : float = 0.0; private var numobstacleslaunched = 0; function start () { if (target == null) { // find the player transform target = gameobject.findgameobjectwithtag(“player”). } } function update () { if ((numobstacleslaunched
nextlaunch)) { // set up the next launch time nextlaunch = time.time + // set up for launch direction var hit : var ray : var hitdistance : // instantiate the projectile var instantiatedprojectile : rigidbody = instantiate(projectile, transform.position, transform.rotation); // simple block, try to get in front of the player instantiatedprojectile.velocity = target.transformdirection(vector3.forward * speed); // increment the launch count numobstacleslaunched++; } } 这个发射器编码将用于面向玩家发射特定数量障碍。
因此它需要一些可代表玩家输入。
在此之前,将gameobject分配到脚本时,你可以使用editor将gameobject拖拽到脚本变量中。
也可以通过start()函数用另一种方法实现这一做法。
在start()中,我们可以检查是否已无分配目标。
如果没有找到目标,代码就会查询含有player标签gameobject,并将这个gameobject分配到目标变量。
gameobject.findgameobjectwithtag()函数调用是一个棘手调用,因为它需要浏览所有gameobject。
所以你得在start()中就调用这个函数以免将其引入update()这个会重复多次调用函数。
update()会在代码中首先查看发射器是否发送了最大限量障碍。
如果没有,它还会查看是否已经超过时间间隔。
这可以避免在短暂时间内发射过多障碍。
如果是时候发射另一个障碍,那么obstacle预制件就会在特定位置实例化,其旋转方式会与发射器保持一致。
然后实例化障碍会针对玩家前进方向发射出去,这样障碍就会在玩家正前方着陆。
现在要保存你代码。
首先,要将obstaclelauncher脚本粘附到launcher gameobject。
将obstacle预制件分配到脚本中抛射变量(你可以将预制件从assets列表拖拽到变量)。
将player gameobject分配到脚本中目标变量。
obstacle_launcher_vars_assigned(from raywenderlich) 在unity editor中试玩游戏,确认这些阻块确实是面向heroic cube进行发射。
调整发射器方向以便阻块在玩家和终点线之间发射。
你还可以在z轴方向通过移动finish line gameobject来调整终点线。
提示:你可以将转变位置设为0,0,2。
当你移动finish line对象时,子对象也会随之而来,这就是将相关gameobject分组好处之一。
gameview_test_launcher(from raywenderlich) 现在多数游戏功能都到位了。
下一代你得用一个可显示游戏计时器任务控制脚本,将所有东西组合到一起,协调玩法并重置场景以便开始新游戏。
创建一个新脚本资产并将其命名为gamecontroller。
打开脚本,删除多余函数并添加以下代码: static var gamerunning : boolean = var gametimeallowed : float = 20.0; private var gamemessagelabel = “”; private var gamemessagedisplay : private var timedout : boolean = private var gametimeremaining : float = function awake() { gamemessagedisplay = rect(10, 10, screen.width – 20, 40); } function ongui() { gui.color = color. gui.backgroundcolor = color. var text : string = “”; if (timedout) { gamemessagelabel = “time’s up!!”; } else { text = string.format( “{0:00}:{1:00}”, parseint( gametimeremaining / 60.0 ), parseint( gametimeremaining % 60.0 ) ); gamemessagelabel = “time left: ” + } gui.box(gamemessagedisplay, gamemessagelabel); } function update() { if (!gamerunning) // keep track of time and display a countdown gametimeremaining -= time. if (gametimeremaining <= 0) { timedout = gamerunning = } } unity提供了易于添加文本标签和按钮功能gui控制方式。
gamemessagedisplay变量控制是呈现位置。
在此你要让倒计时器呈现屏幕顶端。
鼠标点击等事件发生时,系统就会调用ongui()。
gui.box()会使用你之前设置维度以及当前游戏信息(游戏邦注:包括倒计时信息、成功消息以及失败消息)创造一个box control。
gametimeallowed变量代表游戏计时器,并设为20秒。
gametimeremaining会追踪当前剩余时间。
它原先被设为gametimeallowed值,并在update()中通过time.deltatime递减。
time.deltatime是最后一帧完成时秒数。
记住由于帧率可能有所不同,所以这个数值也会有所差别。
当gametimeremaining值低于0时,timedout标记设置为真,玩家就会看到超时信息。
代码还可以设置一个gamerunning标记以便追踪游戏是否在正在运行。
这可用于停止倒计时逻辑,你还将在游戏停止运行后用它来控制对象行为。
gamecontroller_added(from raywenderlich) 试玩游戏并检测倒计时器呈现方式,以及失败情况。
这很难看出问题,但别担心,你可以停止游戏进行调整。
gameview_test_timeout(from raywenderlich) 当heroic cube穿过终点线或者无形墙面时,你得呈现成功信息——要鼓励玩家完成挑战行为!这条信息得包括玩家完成挑战时间。
最好在gamecontroller脚本中设置这些信息。
但是,终点线检测代码在另一个脚本:finishlinedetection。
有一个方法可实现这一操作,那就是在gamecontroller中定义一个函数,这样当玩家过线时就会调用finishlinedetection。
之后这个函数就可以通过ongui()函数触发所需呈现信息。
向gamecontroller脚本添加两个私有变量。
一个用于追踪完成挑战时间,另一个用于标记成功任务(可以将以下代码置于其他现有私有变量之下): private var missioncompleted : boolean = private var missioncompletetime : float = 然后在gamecontroller脚本末尾添加以下代码: function missioncomplete() { if (!gamerunning) missioncompleted = gamerunning = missioncompletetime =
gametimeallowed – } missioncomplete()会检测游戏是否仍在运行。
如果是,它就会将私有missioncompleted标记设置为真,将gamerunning标记设置为假。
这样可以节省完成任务时间。
现在要修改ongui()添加成功事例(如下所示)以显示完成挑战时间信息。
新代码添加于 var text : string = “”之下,排列并修改原有if条件: if (missioncompleted) { text = string.format( “{0:00}:{1:00}”, parseint( missioncompletetime / 60.0 ), parseint( missioncompletetime % 60.0 ) ); gamemessagelabel = “mission completed in: ” + } else if (timedout) { gamemessagelabel = “time’s up!!”; … 切换到finishlinedetection脚本并作如下修改: var gamecontrollerscript : // 1: new function ontriggerenter(other : collider) { if (other.gameobject.tag == “player”) { debug.log(“you made it!!!”); gamecontrollerscript.missioncomplete(); // 2: new } } @script requirecomponent(collider) 1.定义一个指向gamecontroller脚本公共变量。
你很快就会如此分配。
2.在gamecontroller脚本中调用missioncomplete()以触发成功事例。
after_gamecontroller_var_added(from raywenderlich) 为分配gamecontrollerscript变量,选择goal gameobject,然后选择inspectorfinish line detection并点击靠近game controller脚本圆形图标。
在弹出对话框中,选择main camera gameobject并关闭对话。
assign_gamecontroller_script(from raywenderlich) gamecontroller_var_assigned(from raywenderlich) 试玩游戏并冲向终点线,躲避那些邪恶阻块。
你及时到达终点时要注意查看下信息呈现方式是否正确。
gameview_test_success(from raywenderlich) 停止游戏并点击play再玩一次。
检测失败事例情况,看该逻辑是否仍然可行。
你可能注意到了,尤其是在使用unity remote或ios设备测试游戏时你会发现,呈现游戏信息字体非常之小。
你可以通过dafont.com等诸多网站中获得大量字体。
你将使用样本是由免费transformers font创造。
没错,这就是来自《变形金刚》电影中原字体。
我将以上字体添加到resources.zip文件中。
下载资源档案并提取其中内容。
找到字体大小并将transformers movie.ttf拖拽到你project viewassets文件夹中进行输出。
在project view中选择transformers movie资产。
inspector显示了输出设置。
将字体大小设置为36,点击apply。
font_import_settings_changed(from raywenderlich) 你已经输出了你定制字体,现在可以将其运用到你项目中。
打开gamecontroller脚本修改信息字体。
定义公共变量以设置字体: var gamemessagefont : 通过修改ongui()来改变用于呈现标签字体,如下所示: function ongui() { gui.skin.font = gui.color = color. … 将gamemessagefont公共变量分配到gui.skin.font以改变字体。
font_assigned(from raywenderlich) 现在选择main camera gameobject。
将字体资产拖拽到将gamemessagefont变量中,以便将gamemessagefont分配到新输出字体。
gameview_font_test(from raywenderlich) 下一步,创建一个游戏内置按钮,玩家摁下即可开始,或在失败/成功之后重新开始游戏。
只要游戏停止运行,就要呈现这个按钮。
重新调用你定义一个gamerunning标记,使用它来控制按钮能见度。
为了创建游戏按钮及相关功能,你必须修改gamecontroller脚本。
首先要定义一个控制游戏按钮文本私有变量: private var playbuttontext = “play”; function startgame() { // reset if starting a new game gametimeremaining = timedout = missioncompleted = // change button text after the initial run playbuttontext = “play again”; // kick off the game gamerunning = } 现在修改ongui()以便在游戏不运行时呈现按钮,在ongui()末尾添加以下代码: // the menu button if (!gamerunning) { var xpos = screen.width / 2 – 100; var ypos = screen.height / 2 + 100; if( gui.button( new rect( xpos, ypos, 200, 50 ), playbuttontext ) ) { startgame(); } } 最后,将gamerunning标记设为假。
只要修改变量原来变量将其最初值从“真”改为“假”。
static var gamerunning : boolean = ongui()会使用gui.button()函数放置按钮。
按钮文本是一个变量,所以它最初会出现“play”并在随后每次都出现“play again”。
gui.button()包含在if语句中。
如果点击按钮就会返回“真”值。
当用户点击按钮时,游戏就开始了。
startgame()会首先初始化游戏,更改游戏按钮文本并最终将gamerunning标记设为“真”。
在unity editor中预览游戏。
确认游戏按钮最初是可视状态,在你点击之后才变成隐藏状态。
确认当游戏运行结束时,这个play按钮会再次恢复可视,其中文本 也从“play”变成“play again”。
注意你在首次之后每回点击这个按钮,时间都会重置 ,倒计时也会重新开始。
同时也要注意,玩家可以在点击play按钮之前移动。
这有点令人心烦,不要让你heroic cube抢跑。
为了处理这个细节,要使用gamerunning变量(因为有静态调节器,所以这是一个全局变量)。
在movearound脚本顶端update()添加以下代码: if (gamecontroller != null && !gamecontroller.gamerunning) 你也可以在游戏不运行时放弃障碍物使发射器失效。
在obstaclelauncher脚本update()顶端添加以下代码: if (gamecontroller != null && !gamecontroller.gamerunning) 预览游戏确认当游戏停止运行时,玩家就无法移动,系统也不会再发射障碍物。
现在play按钮已经可以正常运行,你可以会注意到尽管游戏重新开始时计时器已经重置,但游戏其他内容并未重置。
障碍物停止掉落,它们可能已经达到最大数量,但此时并没有消失。
heroic cube也并没有倒退回原点。
真正重置会要求游戏刷新,比如障碍清除并重新装载,而玩家也回到了原点。
实现这一操作理想方式就是向所有相关团体发送一条信息让它们重置。
heroic cube就会返回原点,发射器也会重新装载。
一个方法就是在脚本中定义一个重置函数以处理重置行为。
然后用gameobject.sendmessage()调用这个重置函数,以便让依附于gameobject粘附一个组件处理这个函数调用。
1.你将在movearound脚本中定义一个resetgame()函数,当游戏开始时将玩家位置调回原点。
2.你将在obstaclelauncher脚本中定义一个resetgame()函数,以便让障碍数量重置为0。
3.你将依次通过一个给定gameobjects列表(包括玩家和发射器gameobject),调用gameobject.sendmessage(“resetgame”, …)来激活重置。
4.当用户重置游戏时,你将在gamecontroller中添加重置逻辑。
但代码比文字更有说服力。
首先,要打开movearound脚本并添加以下变量和函数: var originalposition : vector3; var originalrotation : function awake() { originalposition = transform. originalrotation = transform. } function resetgame() { // reset to original position transform.position = transform.rotation = } 然后开打obstaclelauncher脚本并添加新函数: function resetgame() { // reset to original data numobstacleslaunched = 0; } 下一步打开gamecontroller脚本并添加以下变量: var gameobjectstoreset : gameobject []; 上一行代码定义了一列gameobjects,将由重置游戏函数调用它们激活重置行为。
现在用以下代码替换原有startgame()函数: function startgame() { // reset if starting a new game gametimeremaining = timedout = missioncompleted = // change button text after the initial run playbuttontext = “play again”; // clean out any enemy objects var enemies = gameobject.findgameobjectswithtag(“enemy”); for (var enemy : gameobject in enemies) { destroy ( enemy); } // call all game reset methods for (var gameobjectreceiver : gameobject in gameobjectstoreset) { gameobjectreceiver.sendmessage(“resetgame”, null, sendmessageoptions.dontrequirereceiver); } // kick off the game gamerunning = } 通过查找带有enemy标签gameobjects清除所有敌人实例。
在敌人gameobjects中调用destroy(),在场景中清除所有障碍物。
然后由代码处理gameobjectstoreset阵列并向每个gameobject发送一条信息调用resetgame()。
这并非一个强制要求阵列中一个组件执行resetgame()。
你需要向处理流程分配对象。
现在选择main camera对象,并为game objects to reset标注新公共变量: gameresetarray_added(from raywenderlich) 将大小设为2。
这个阵元就会扩展。
将player gameobject分配到element 0,将launcher gameobject分配到element 1。
gamereset_assigned(from raywenderlich) 预览游戏并确认游戏在一次成功或失败后已经完全重置。
确认玩家已经重置到原点,屏幕上障碍已经清除,当游戏重新开始时,障碍又开始降落。
你基本玩法功能现在已经到位了,但最好在游戏刚启动时添加一些额外元素,呈现与游戏相关信息。
现在你呈现只是一个play按钮,用户并不知道自己将面临什么情况。
添加一些欢迎文本,以及一个关于游戏操作规则简短解释,这样会让游戏显得更为人性化。
这个欢迎文本将使用你所输出transformers字体。
而描述文本则使用unity绑定arial字体。
创建一个空白游戏对象,命名为intro并将转变位置设为0,0,0。
选择gameobjectcreate other3d text创建一个3d text gameobject并将其命名为description text。
将inspector ext mesh ext属性设为“在时间结束前到达终点线”。
将原转变位置设为-10,1,12。
desc_text_transform_text(from raywenderlich) 在unity editor中预览游戏,调整对象位置令其居于水平中间位置,以便将它看得更清楚。
提示:你可能很需要调整x和z轴方向,x位于对象中间,z用于缩放。
desc_text_adjusted(from raywenderlich) 用unity remote查看游戏,确保文本在ios设备上查看时具有可视性。
必要时可进行调整。
将description text对象放置于intro gameobject之下。
这样做可以让你在之后通过代码方便显示或隐藏菜单显示信息。
desc_text_parented(from raywenderlich) 创建第二个3d text gameobject,将其命名为welcome text。
这个文字应该显示于描述文本上方,所以将原转变位置设为-6,5,10。
将inspector ext mesh ext属性设为“welcome”。
从project view中将字体资产拖拽到inspector中font属性,将font属性设为transformers movie(游戏邦注:也可以点击靠近font带点图标圆形,并从弹出列表中选中它): welcome_text_transform_text_font(from raywenderlich) 调整welcome text位置,这样你在unity editor和通过unity remote中测试游戏时可以清楚看到它。
welcome_text_adjusted(from raywenderlich) 将welcome text对象置至intro gameobject之下。
当游戏运行时隐藏intro gameobject(及其子对象)。
打开gamecontroller脚本并进行以下调整: var intro : … function startgame() { … // turn off the intro text for (var child : transform in intro ) { child.gameobject.renderer.enabled = } // clean out any enemy objects var audiodefeat : var volumevictory : float = 2.0; var volumedefeat : float = 2.0; function playsoundofvictory(isvictory : boolean) { // stop any current audio if (audio.isplaying) audio.stop(); // play either the sound of victory or defeat. audio.clip = isvictory ? audiovictory : audio.volume = isvictory ? volumevictory : audio.play(); } function resetgame() { // reset to original state, stop any audio if (audio.isplaying) audio.stop(); } @script requirecomponent(audiosource) 这个脚本有两个音频片段,一个是针对胜利,一个针对失败。
playsoundofvictory()函数会先停止目前正在播放任何音频,然后根据isvictory输入播放所需音频。
resetgame()会中止当前正在播放任何音频。
你将快速接通gamecontroller在游戏每次重启时调用resetgame()。
将这个新脚本附加到goal gameobject上。
将victory音频资产设为audio victory变量。
将defeat音频资产设为audio defeat变量。
fan_script_added(from raywenderlich) 编译gamecontroller脚本并作如下调整: var fanreactionscript : … function update() { if (!gamerunning) // keep track of time and display a countdown gametimeremaining -= time. if (gametimeremaining <= 0) { timedout = gamerunning = // play the sound of defeat fanreactionscript.playsoundofvictory(false); } } … function missioncomplete() { if (!gamerunning) missioncompleted = gamerunning = // play the sound of victory fanreactionscript.playsoundofvictory(true); missioncompletetime =
gametimeallowed – } 这段代码定义了一个引用fanreaction脚本新公共变量。
你修改missioncomplete()以调用 playsoundofvictory(),设置为真以播放胜利声音。
你还要修改update()以调用playsoundofvictory(),设 置为假来播放失败声音。
你现在可以将goal gameobject中fanreaction脚本链接到main camera‘s gamecontroller脚本组件变量。
选择main camera然后在inspector中gamecontroller之下,靠近fanreactionscript变量圆形图标。
在弹出对话中,选 择goal gameobject,然后关闭弹出对话。
fan_var_assigned(from raywenderlich) 在fanreaction中调用resetgame(),选择main camera object。
在inspector中game controller组件片段中,将game objects to reset中数组大小从2增加到3。
将goal gameobject设为element 2。
game_reset_array_assigned(from raywenderlich) 预览游戏并检测胜利和失败场景以确保游戏正确播放声音。
确认你点击play again时这些声音就会停止。
如果障碍物落时也能添加一些声音,效果会更好。
为达到这一目标,你将把一个音频源添附到obstacle预制件,然后选择碰撞,这样当障碍物降落或撞击到任何物体时都能播放音效。
将audio source组件添加到obstacle预制件。
将impact音频分配到audio clip属性。
audio_impact_added(from raywenderlich) 创建一个新javascript资产并将其重命名为objectcollision。
编译脚本,删除无关函数并添加以下代码: var impact : function oncollisionenter () { audio.playoneshot(impact);
unity发布ios教程发布ios平台;开发ios注意;u3d使用line render制作闪电特效;unity3d 正前方;unity3d ios开发环境;unity3d ios 输入框;unity app ios开发教程;学unity3d 还是ios 打开ios 怎么加载button到unity3d;findgameobjectswithtag 顺序;unity3d ios 真机调试;的办法。不过最后还是用制作游戏教程来解决这个问题的。游戏教程大全当中包含了;unity 开发0开发unity怎么发布unity如何发布unity 发布unity发布到unity ios 发布;0开发ios游戏ios unity游戏;unity的游戏unity发布游戏;unity 场景切换后变暗;uunity 触发音效;unitycameraunity 5smooth follow unity c#;unity unity如何画箭头;unity 5unity 5 stunity raycast mouse
每日推荐:
13/50主题帖子积分
注册看看, 积分 3, 距离下一级还需 47 积分
注册看看, 积分 3, 距离下一级还需 47 积分
在线时间2 小时
好棒的参考
[]: claire8810 发帖时在路边捡到 2
蛮牛币,偷偷放进了口袋.
每日推荐:
61019/1500排名<font color="#FF昨日变化1主题帖子积分
蛮牛粉丝, 积分 1019, 距离下一级还需 481 积分
蛮牛粉丝, 积分 1019, 距离下一级还需 481 积分
蛮牛币2064
在线时间278 小时
................全文字么... 看得好辛苦
每日推荐:
251/150排名<font color="#FF昨日变化7主题帖子积分
初来乍到, 积分 51, 距离下一级还需 99 积分
初来乍到, 积分 51, 距离下一级还需 99 积分
在线时间4 小时
好多好多 看着难受
每日推荐:}

我要回帖

更多关于 场景秀发布到公众号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信