您的位置: 旅游网 > 社会

千金-益母颗粒戲教程之利用Unity制作ios3D游戲

发布时间:2020-02-15 18:38:58

戏教程之利用Unity制作ios 3D游戏入门教程(三)

戏教程之利用Unity制作ios 3D游戏入门教程(三) |爪游控 首页多彩生活娱乐八卦汽车世界科技产业数码新品游戏动漫体坛风云军情解码社会万象健康养生 首页 / 游戏动漫 / 戏教程之利用Unity制作ios 3D游戏入门教程(三) 戏教程之利用Unity制作ios 3D游戏入门教程(三) Posted on 2014年3月11日 by stanper in 游戏动漫 在本系列,你已经掌握了基本的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位置,让圆柱体底部就略低于地面提示:从Z轴查看场景有助于进行调整 拖拽Post1 GameObject并将其放置于Finish Line GameObject,让后者成为Post1的母体 要创造第二个标杆,选择Post1,右击并选择“复制”再右击一次并选择“粘贴”将这个新的GameObject从Post1重命名为Post2使用Move Tool,调整X位置以便标杆立于玩家右侧提示:从Y轴查看场景以便做出调整或者,将转变X位置设为10也可以 下一步,创造用于检测Cube是否穿过终点线的墙体选择GameObjectCreate OtherCube,将其重命名为Goal将转变范围设为24,10,0.5将原转变位置设为0,2,0 将墙体移动到两个标杆之后如果必要的话,调整X范围值,以便墙体从一个标杆延伸到另一个标杆 现在墙体仍在选择状态,打开InspectorBox Collider组件,查看Is Trigger数值取消选中Mesh Renderer组件以便让墙体隐形 拖拽Goal GameObject,使其位于Finish Line GameObject之下,成为后者的子对象 连接节点下一步就是创造连接标杆的线条,以便玩家清楚看到终点线你将通过脚本从一个标杆到另一个标杆绘制出线段选择AssetCreateJavaScript创造新脚本并将其命名为FinishLineRender在Project View中双击打开脚本,删除其中的隔离功能,添加以下代码:// The finish line posts var post1 : Transform; var post2 : Transform; var lineColor : Color = Color.green; 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”一词的头几个字母,就会自动显示脚本内容 分别将Post1和Post2 GameObject分配到Post 1和Post 2变量 在Unity Edito中预览游戏你会看到两个标杆以及一条绿线所组成的终点线 下一步代将创造一个能够检测超过终点线这一行为的新脚本,并将这一新脚本粘附到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 现在,为玩家对象添加一个标签,以便终点线检测逻辑生效在Inspector中下拉标签选项并选中Player 玩家是预建标签之一之后,你将创建自己的标签以便鉴定游戏中所有的敌人点击Play并将Heroic Cube移到终点线之后你就会看到“你成功了”这一记录信息,你就知道玩家此时已经穿过终点线 没错,Heroic Cube能够到达目标并赢得游戏,但你不能让它太轻松实现你还得为游戏添加两层复杂性:一个基于时间的挑战和多个障碍首先,让我们添加障碍创建发射器创建一个空白的GameObject,并将其命名为Launcher,代表将阻止Heroic Cube前进步伐的障碍发射中心在Z轴方向上,使用Move Tool将发射器对象放置于玩家和终点线之间,并且位于玩家之上你可以将转变位置设为0,12,8,并根据需要进行调整 发射器的主要存在理由就是发射障碍,所以你得给它提供一些发射物在Unity中创造的弹药一般是先设计一些GameObject,然后创造一些能够在游戏玩法场景中实例化的预制件你将创建一个Obstacle GameObject,将其转变为预制件,然后让发射器将其射向倒霉的玩家创建障碍创建一个方形的GameObject,并将其命名为Obstacle把转变范围设为2,2,2,让它比玩家更大并更具威慑感这就是那些将扮演坏蛋的立方体让这些障碍看起来更有趣一些,而不只是默认的灰色物质为匹配完整的样本,首先要从角色控制器包中输出一个材料:选择AssetsImport PackageCharacter Controller,然后选中constructor_done材料以及在下图中显示的相关纹理,最后点击Import 新材料会显示在你的Project View中 选择Obstacle GameObject通过调整InspectorMesh RendererMaterialsElement 0属性改变渲染材料点击靠近属性的圆形图标,产生“材料选择”对话框 选择你刚输出的constructor_done材料,关闭“材料选择”对话框 现在你必须为Obstacle GameObject贴标签,以便开始新游戏时清除场景中的Obstacle实例为此,创建一个名为Enemy的新标签点击InspectorTagAdd TagTagManager将显示在右侧栏点击靠近标签的三角形来扩展标签阵列将Element 3的值设为Enemy 选择Obstacle GameObject,并为这一对象贴上新的Enemy标签 当Obstacle被具体化时,你将添加的代码则需要将一个刚体组件粘附到障碍上这要先添加一个刚体选择ComponentPhysicsRigidbody(GDchina注:Obstacle仍在选中状态): 点击Project View中的Assets文件夹选择AssetsCreatePrefab,为你的障碍物创建一个预制件此时Project View会显示一个空白的预制件将其命名为障碍 注:如果你的资产图标大于以上截图所示情况,并且不知该如何查看资产列表中的物品,只需向左下滑资产列表就能看到将Obstacle GameObject拖拽到这个新预制件中 预制件变成蓝色表明它已经被指定现在你已经创建了一个可作为重用资产的预制件,在这个场景中已经不再需要这个预制件发射器将负责在必要的时候具体化一个Obstacle实例在Hierarchy View中,选择Obstacle GameObject,右击并选择“删除”释放障碍下一步,通过脚本创造逻辑以发射障碍,完成这一过程创造一个新脚本资产并将其命名为ObstacleLauncher提示:你可以在Project View中右击并选择CreateJavaScript以创建一个脚本打开新脚本,用以下代码替换原来的函数:var projectile : Rigidbody; var speed = 5; var maxObstacles = 2; var launchInterval : float = 5.0; var target : Transform; private var nextLaunch : float = 0.0; private var numObstaclesLaunched = 0; function Start if target == null // Find the player transform target = GameObject.FindGameObjectWithTag “Player” .transform; function Update if numObstaclesLaunched maxObstacles Time.time nextLaunch // Set up the next launch time nextLaunch = Time.time + launchInterval; // Set up for launch direction var hit : RaycastHit; var ray : Ray; var hitDistance : float; // 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分配到脚本中的目标变量 在Unity Editor中试玩游戏,确认这些阻块确实是面向Heroic Cube进行发射调整发射器方向以便阻块在玩家和终点线之间发射你还可以在Z轴方向通过移动Finish Line GameObject来调整终点线提示:你可以将转变位置设为0,0,2当你移动Finish Line对象时,子对象也会随之而来,这就是将相关GameObject分组的好处之一 现在多数游戏功能都到位了下一代你得用一个可显示游戏计时器的任务控制脚本,将所有东西组合到一起,协调玩法并重置场景以便开始新游戏倒计时创建一个新脚本资产并将其命名为GameController打开脚本,删除多余函数并添加以下代码:static var gameRunning : boolean = true; var gameTimeAllowed : float = 20.0; private var gameMessageLabel = “”; private var gameMessageDisplay : Rect; private var timedOut : boolean = false; private var gameTimeRemaining : float = gameTimeAllowed; function Awake gameMessageDisplay = Rect 10, 10, Screen.width – 20, 40 ; function OnGUI GUI.color = Color.yellow; GUI.backgroundColor = Color.black; 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: ” + text; GUI.Box gameMessageDisplay, gameMessageLabel ; function Update if !gameRunning return; // Keep track of time and display a countdown gameTimeRemaining -= Time.deltaTime; if gameTimeRemaining = 0 timedOut = true; gameRunning = false; Unity提供了易于添加文本标签和按钮功能的GUI控制方式gameMessageDisplay变量控制的是呈现位置在此你要让倒计时器呈现的屏幕顶端鼠标点击等事件发生时,系统就会调用OnGUI()GUI.Box()会使用你之前设置的维度以及当前的游戏信息(GDchina注:包括倒计时信息、成功消息以及失败消息)创造一个Box ControlgameTimeAllowed变量代表游戏计时器,并设为20秒gameTimeRemaining会追踪当前剩余时间它原先被设为gameTimeAllowed值,并在Update()中通过Time.deltaTime递减Time.deltaTime是最后一帧完成时的秒数记住由于帧率可能有所不同,所以这个数值也会有所差别当gameTimeRemaining值低于0时,timedOut标记设置为真,玩家就会看到超时信息代码还可以设置一个gameRunning标记以便追踪游戏是否在正在运行这可用于停止倒计时逻辑,你还将在游戏停止运行后用它来控制对象行为将脚本粘附到你的Main Camera对象: 试玩游戏并检测倒计时器呈现方式,以及失败情况这很难看出问题,但别担心,你可以停止游戏进行调整 时有赢输当Heroic Cube穿过终点线或者无形的墙面时,你得呈现成功信息——要鼓励玩家完成挑战的行为这条信息得包括玩家完成挑战的时间你还得让玩家知晓比赛何时结束最好在GameController脚本中设置这些信息但是,终点线检测代码在另一个脚本:FinishLineDetection有一个方法可实现这一操作,那就是在GameController中定义一个函数,这样当玩家过线时就会调用FinishLineDetection之后这个函数就可以通过OnGUI()函数触发所需呈现的信息向GameController脚本添加两个私有变量一个用于追踪完成挑战的时间,另一个用于标记成功任务(可以将以下代码置于其他现有的私有变量之下):private var missionCompleted : boolean = false; private var missionCompleteTime : float = gameTimeAllowed;然后在GameController脚本末尾添加以下代码:function MissionComplete if !gameRunning return; missionCompleted = true; gameRunning = false; missionCompleteTime = gameTimeAllowed – gameTimeRemaining; 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: ” + text; else if timedOut gameMessageLabel = “Time’s up!!”; …切换到FinishLineDetection脚本并作如下修改: /#pragma strict var gameControllerScript : GameController; // 1: new function OnTriggerEnter other : Collider if other.gameObject.tag == “Player” Debug.Log “You made it!!!” ; gameControllerScript.MissionComplete ; // 2: new @script RequireComponent Collider code 新代码数量有限,执行以下操作: 1.定义一个指向GameController脚本的公共变量你很快就会如此分配 2.在GameController脚本中调用MissionComplete 以触发成功事例 img alt= src= http://game.dapps.net/uploads/2013/03/281.png title= http://game.dapps.net/uploads/2013/03/281.png > 为分配gameControllerScript变量,选择Goal GameObject,然后选择InspectorFinish Line Detection并点击靠近Game Controller脚本的圆形图标在弹出对话框中,选择Main Camera GameObject并关闭对话 img alt= src= http://game.dapps.net/uploads/2013/03/291.png title= http://game.dapps.net/uploads/2013/03/291.png > img alt= src= http://game.dapps.net/uploads/2013/03/301.png title= http://game.dapps.net/uploads/2013/03/301.png > 试玩游戏并冲向终点线,躲避那些邪恶的阻块你及时到达终点时要注意查看下信息呈现方式是否正确 img alt= src= http://game.dapps.net/uploads/2013/03/311.png title= http://game.dapps.net/uploads/2013/03/311.png > 停止游戏并点击Play再玩一次检测失败事例的情况,看该逻辑是否仍然可行 h3 改变呈现字体 /h3 你可能注意到了,尤其是在使用Unity Remote或iOS设备测试游戏时你会发现,呈现游戏信息的字体非常之小 你可以通过http://dafont.com等诸多站中获得大量字体你将使用的样本是由免费的Transformers Font创造的没错,这就是来自《变形金刚》电影中的原字体 我将以上字体添加到Resources.zip文件中 下载资源档案并提取其中内容找到字体大小并将Transformers Movie.ttf拖拽到你的Project ViewAssets文件夹中进行输出在Project View中选择Transformers Movie资产Inspector显示了输出设置将字体大小设置为36,点击Apply img alt= src= http://game.dapps.net/uploads/2013/03/321.png title= http://game.dapps.net/uploads/2013/03/321.png > 你已经输出了你的定制字体,现在可以将其运用到你的项目中 打开GameController脚本修改信息字体定义公共变量以设置字体: code lang= objc var gameMessageFont : Font;通过修改OnGUI()来改变用于呈现标签的字体,如下所示:function OnGUI nt = gameMessageFont; lor = llow; …将gameMessageFont的公共变量分配到nt以改变字体 现在选择Main Camera GameObject将字体资产拖拽到将gameMessageFont变量中,以便将gameMessageFont分配到新输出的字体 预览游戏,并确认呈现信息使用的是新字体现在,这些字体看起来更理想了游戏时间下一步,创建一个游戏内置按钮,玩家摁下即可开始,或在失败/成功之后重新开始游戏只要游戏停止运行,就要呈现这个按钮重新调用你定义的一个gameRunning标记,使用它来控制按钮的能见度为了创建游戏按钮及相关功能,你必须修改GameController脚本首先要定义一个控制游戏按钮文本的私有变量:private var playButtonText = “Play”;然后添加一个称为startGame()的新变量:function startGame // Reset if starting a new game gameTimeRemaining = gameTimeAllowed; timedOut = false; missionCompleted = false; // Change button text after the initial run playButtonText = “Play Again”; // Kick off the game gameRunning = true; 现在修改OnGUI()以便在游戏不运行时呈现按钮,在OnGUI()末尾添加以下代码:// The menu button if !gameRunning var xPos = dth / 2 – 100; var yPos = ight / 2 + 100; if tton new Rect xPos, yPos, 200, 50 , playButtonText startGame ; 最后,将gameRunning标记设为假只要修改变量原来的变量将其最初值从“真”改为“假”static var gameRunning : boolean = false;OnGUI()会使用tton()函数放置按钮按钮文本是一个变量,所以它最初会出现“Play”并在随后每次都出现“Play Again”tton()包含在if语句中如果点击按钮就会返回“真”值当用户点击按钮时,游戏就开始了startGame()会首先初始化游戏,更改游戏按钮文本并最终将gameRunning标记设为“真”在Unity Editor中预览游戏确认游戏按钮最初是可视状态,在你点击之后才变成隐藏状态确认当游戏运行结束时,这个Play按钮会再次恢复可视,其中的文本也从“Play”变成“Play Again”注意你在首次之后每回点击这个按钮,时间都会重置 ,倒计时也会重新开始同时也要注意,玩家可以在点击Play按钮之前移动这有点令人心烦,不要让你的Heroic Cube抢跑为了处理这个细节,要使用gameRunning变量(因为有静态调节器,所以这是一个全局变量)在MoveAround脚本顶端的Update()添加以下代码:if GameController != null !meRunning return;你也可以在游戏不运行时放弃障碍物使发射器失效在ObstacleLauncher脚本的Update()顶端添加以下代码:if GameController != null !meRunning return;预览游戏确认当游戏停止运行时,玩家就无法移动,系统也不会再发射障碍物重新开始游戏现在Play按钮已经可以正常运行,你可以会注意到尽管游戏重新开始时计时器已经重置,但游戏其他内容并未重置障碍物停止掉落,它们可能已经达到最大数量,但此时并没有消失Heroic Cube也并没有倒退回原点真正的重置会要求游戏刷新,比如障碍清除并重新装载,而玩家也回到了原点实现这一操作的理想方式就是向所有相关团体发送一条信息让它们重置Heroic Cube就会返回原点,发射器也会重新装载一个方法就是在脚本中定义一个重置函数以处理重置行为然后用ndMessage()调用这个重置函数,以便让依附于GameObject粘附的的一个组件处理这个函数调用以下就是你的执行操作:1.你将在MoveAround脚本中定义一个resetGame()函数,当游戏开始时将玩家位置调回原点2.你将在ObstacleLauncher脚本中定义一个resetGame()函数,以便让障碍数量重置为03.你将依次通过一个给定的GameObjects列表(包括玩家和发射器GameObject),调用ndMessage(“resetGame”, …)来激活重置4.当用户重置游戏时,你将在GameController中添加重置逻辑但代码比文字更有说服力首先,要打开MoveAround脚本并添加以下变量和函数:var originalPosition : Vector3; var originalRotation : Quaternion; function Awake originalPosition = sition; originalRotation = tation; function resetGame // Reset to original position sition = originalPosition; tation = originalRotation; 然后开打ObstacleLauncher脚本并添加新函数:function resetGame // Reset to original data numObstaclesLaunched = 0; 下一步打开GameController脚本并添加以下变量:var gameObjectsToReset : GameObject ;上一行代码定义了一列GameObjects,将由重置游戏函数调用它们激活重置行为现在用以下代码替换原有的startGame()函数:function startGame // Reset if starting a new game gameTimeRemaining = gameTimeAllowed; timedOut = false; missionCompleted = false; // Change button text after the initial run playButtonText = “Play Again”; // Clean out any enemy objects var enemies = ndGameObjectsWithTag “Enemy” ; for var enemy : GameObject in enemies Destroy enemy ; // Call all game reset methods for var gameObjectReceiver : GameObject in gameObjectsToReset ndMessage “resetGame”, null, ntRequireReceiver ; // Kick off the game gameRunning = true; 通过查找带有Enemy标签的GameObjects清除所有敌人实例在敌人GameObjects中调用Destroy(),在场景中清除所有的障碍物然后由代码处理gameObjectsToReset阵列并向每个GameObject发送一条信息调用resetGame()这并非一个强制要求阵列中的一个组件执行resetGame()你需要向处理流程分配对象现在选择Main Camera对象,并为Game Objects To Reset标注新公共变量: 将大小设为2这个阵元就会扩展将Player GameObject分配到Element 0,将Launcher GameObject分配到Element 1 预览游戏并确认游戏在一次成功或失败后已经完全重置确认玩家已经重置到原点,屏幕上的障碍已经清除,当游戏重新开始时,障碍又开始降落补充完整信息你的基本玩法功能现在已经到位了,但最好在游戏刚启动时添加一些额外元素,呈现与游戏相关的信息现在你呈现的只是一个Play按钮,用户并不知道自己将面临什么情况添加一些欢迎文本,以及一个关于游戏操作规则的简短解释,这样会让游戏显得更为人性化这个欢迎文本将使用你所输出的Transformers字体而描述文本则使用Unity绑定的Arial字体创建一个空白的游戏对象,命名为Intro并将转变位置设为0,0,0选择GameObjectCreate Other3D Text创建一个3D Text GameObject并将其命名为Description Text将InspectorText MeshText属性设为“在时间结束前到达终点线”将原转变位置设为-10,1,12 在Unity Editor中预览游戏,调整对象的位置令其居于水平中间位置,以便将它看得更清楚提示:你可能很需要调整X和Z轴方向,X位于对象中间,Z用于缩放 用Unity Remote查看游戏,确保文本在iOS设备上查看时具有可视性必要时可进行调整将Description Text对象放置于Intro GameObject之下这样做可以让你在之后通过代码方便地显示或隐藏菜单显示信息 创建第二个3D Text GameObject,将其命名为Welcome Text这个文字应该显示于描述文本上方,所以将原转变位置设为-6,5,10将InspectorText MeshText属性设为“Welcome”从Project View中将字体资产拖拽到Inspector中的Font属性,将Font属性设为Transformers Movie(GDchina注:也可以点击靠近Font的带点图标圆形,并从弹出列表中选中它): 调整Welcome Text位置,这样你在Unity Editor和通过Unity Remote中测试游戏时可以清楚看到它 将Welcome Text对象置至Intro GameObject之下当游戏运行时隐藏Intro GameObject(及其子对象)打开GameController脚本并进行以下调整:var intro : Transform; … function startGame … // Turn off the intro text for var child : Transform in intro abled = false; // Clean out any enemy objects …现在你添加了一个新公共变量以处理Intro GameObject然后你修改startGame()以便让Intro对象不可视(关闭其子游戏对象的渲染器)现在选择Main Camera设置Intro变量,并从Hierarchy View中将Intro GameObject拖拽到InspectorGame ControllerIntro变量进行分配 或者使用圆形点图标来操作,因为这样更简单 预览游戏以检测当点击Play按钮,游戏开始时,文本是否处于隐藏状态添加音频音频在游戏体验中发挥着重要作用,不但可提供感觉反馈,还可以创造氛围所以你得添加音频以进一步丰富玩法当玩家及时过线,任务失败,或者当障碍物砸到地面或撞向任何事物时,游戏都将触发音效当然,游戏必须含有一些背景音乐用Unity添加音频包括将一个Audio Source组件粘附到一个GameObjectAudio Source组件有一个Audio Clip属性,你可以将此分配到你想播放的声音中这个组件还有一些额外属性可控制音乐文件何时播放,以及是否循环播放其中支持的音频文件格式包括.AIF, .WAV, .MP3, and .OGG以下两个站提供了本教程所使用的无版税音频资源:* (需注册方可下载音乐)你之前下载的p文件包含了你将使用的所有音频文件你也可以采用自己创造的音效而不是我所提供的资源为了便于参考,以下列出这个p文件所包含的音频文件原链接:*胜利:20784__wanna73__v*失败:83916__timbre__v*效果:30668__hardpcm__v*背景: Gustav 3要注意为了清楚和简便,p中的文件已经重新命名前往你原先从p提炼出的文件夹,输出音频文件(将它们拖拽到Project View/Assets文件夹) 当音频文件输出到Unity时,你可以说明它是否将被压缩或保持原样(GDchina注:MP3和Ogg Vorbis音频通常是以压缩格式输出)这有什么关系呢压缩文件会更小,但它们需要在游戏运行时解压,这会占据CPU周期你一般会压缩背景音频,至于较短的音效,保持原来的格式会更好,更能提供良好的音质如果音频模式被压缩了,你就可以选择是否使用硬件处理解压,如果是在iOS设备上运行就可以使用苹果硬件解码器硬件速度更快,但硬件一次只能解压一个音乐文件你还可以将声音设为3D格式这意味着当声音播放时,音效就会与GameObject的3D位置相对应例如,GameObject若在远方,其声音也就会更轻 在Project View中选择背景音频以显示输出设置不选中3D Sound选项,选择硬件解码点击Apply保存这一设置调整其他音频文件是.WAV格式,你不需要修改默认的输出设置,将其设为3D和原音频格式为了听到声音,你的屏幕需要一个添加到GameObject的Audio Listener组件场景中只能有一个Audio Listener,这个监听器将从离自己最接近的音频资源挑选声音,并将其发送到设备扬声器在默认状态下,Audio Listener依附于Main Camera你也可以将它粘附到一个不同的GameObject,例如玩家在这款游戏中,你将让Audio Listener保留在Main Camera中,但你创建自己的游戏时可以尝试不同的选项成功与失败的声音你将把音频添附到Goal GameObject以模拟终点线上的群体欢呼声或嘲弄的声音在Hierarchy View选择Goal GameObject,并通过选择ComponentAudioAudio Source添加一个音频源将胜利的音频资产设置到InspectorAudio SourceAudio Clip属性除去Play on Awake选项 现在创建一个新的JavaScript资产以便用于播放成功或失败的声音将新脚本命名为FanReaction打开新脚本去除无关函数,并添加以下代码:var audioVictory : AudioClip; var audioDefeat : AudioClip; var volumeVictory : float = 2.0; var volumeDefeat : float = 2.0; function playSoundOfVictory isVictory : boolean // Stop any current audio if Playing op ; // Play either the sound of victory or defeat. ip = isVictory ? audioVictory : audioDefeat; lume = isVictory ? volumeVictory : volumeDefeat; ay ; function resetGame // Reset to original state, stop any audio if Playing op ; @script RequireComponent AudioSource 这个脚本有两个音频片段,一个是针对胜利,一个针对失败playSoundOfVictory()函数会先停止目前正在播放的任何音频,然后根据isVictory输入播放所需音频resetGame()会中止当前正在播放的任何音频你将快速接通GameController在游戏每次重启时调用resetGame()将这个新脚本附加到Goal GameObject上将Victory音频资产设为Audio Victory变量将Defeat音频资产设为Audio Defeat变量 编译GameController脚本并作如下调整:var fanReactionScript : FanReaction; … function Update if !gameRunning return; // Keep track of time and display a countdown gameTimeRemaining -= ltaTime; if gameTimeRemaining = 0 timedOut = true; gameRunning = false; // Play the sound of defeat aySoundOfVictory false ; … function MissionComplete if !gameRunning return; missionCompleted = true; gameRunning = false; // Play the sound of victory aySoundOfVictory true ; missionCompleteTime = gameTimeAllowed – gameTimeRemaining; 这段代码定义了一个引用FanReaction脚本的新公共变量你修改MissionComplete()以调用playSoundOfVictory(),设置为真以播放胜利的声音你还要修改Update()以调用playSoundOfVictory(),设置为假来播放失败声音你现在可以将Goal GameObject中的FanReaction脚本链接到Main Camera‘s GameController脚本组件的变量选择Main Camera然后在Inspector中的GameController之下,靠近fanReactionScript变量的圆形图标在弹出对话中,选择Goal GameObject,然后关闭弹出对话 在FanReaction中调用resetGame(),选择Main Camera Object在Inspector中的Game Controller组件片段中,将Game Objects To Reset中的数组大小从2增加到3将Goal GameObject设为Element 2 预览游戏并检测胜利和失败场景以确保游戏正确播放声音确认你点击Play Again时这些声音就会停止3D音效如果障碍物落地时也能添加一些声音,效果会更好为达到这一目标,你将把一个音频源添附到Obstacle预制件,然后选择碰撞,这样当障碍物降落或撞击到任何物体时都能播放音效将Audio Source组件添加到Obstacle预制件将impact音频分配到Audio Clip属性 创建一个新JavaScript资产并将其重命名为ObjectCollision编译脚本,删除无关的函数并添加以下代码:var impact : AudioClip; function OnCollisionEnter ayOneShot impact ; @script RequireComponent AudioSource 这些代码执行的是预定义的OnCollisionEnter()事件函数,并调用ayOneShot()函数来播放impact音频片段ayOneShot()说明了另一种播放音频的方法,允许你在想播放时传送音频将脚本添附到Obstacle预制件将impact音频资产设为脚本中的Impact变量 预览游戏并确认当障碍物着地或撞到某物时,游戏会发出令人满意的声音注意障碍物超贴近玩家,声音就会越大添加背景音乐现在你的游戏基本成型了但还有一物没到位——一些背景音乐音乐在塑造游戏氛围上发挥了重要作用它可以让用户的肾上腺素产生反应,并通过提供一些诸如鸟鸣或狼嗥的环境音,让他们“感受”游戏环境所以要添加一些背景音乐将一个Audio Source组件添加到Main Camera GameObject将Background音频资产设为Audio Clip属性选择Play on Awake以及Loop选项这可以确保游戏一开始背景音乐也跟着开始,并且会持续播放将音量属性调整为0.1,这样它就不会淹没其他声音如果你使用的是自己创造的声音,那就根据自己的音乐默认音量大小来调整,以达到同样的效果要让用户在可听到所有音效的同时,听到背景音乐 在Unity Editor中预览项目在你完全满意时,将项目部署到iOS设备,这时你将在Build Setting中添加Level_3场景 在你的iOS设备中测试玩法,试听你刚添加的背景音 总结恭喜你,现在你已经通关掌握了Unity的基本用法但对于Unity游戏,你还只是接触了一点表层的内容,你还有更多需要学习和掌握的东西 文章导航Previous Previous post: 手游和主机游戏研发应互相学习什么下一条 Next post: 张柏芝、谢霆锋和王菲,怎么都能在一起 本站CDN由UPYUN又拍云强力驱动. 关于我们 | 加入我们 | 联系我们 | 版权声明 © 爪游控 版权所有. 陕ICP备号-1 Top

脱臼了应该怎么办
活血化瘀消肿止痛药
脱臼一般多久可以恢复
玉林正骨水多少钱一瓶
猜你会喜欢的
猜你会喜欢的