Unity笔记狗刨学习网.docx
Unity笔记 狗刨学习网一、射弹游戏 1. unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。利用交互的图型化开发环境为首要方式的软件其编译器运行在Windows和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac 和Windows的网页浏览。它的网页播放器也被Mac widgets所支持。 2. Unity3D到底是什么? Unity3D是一个让你轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎。 3. Unity3D特点: 综合编译 通过Unity简单的用户界面,你可以完成任何工作。这些为你节省了大量的时间。 图形动力 Unity对DirectX和OpenGL拥有高度优化的图形渲染管道。 资源导入 Unity支持所有主要文件格式,并能和大部分相关应用程序协同工作。 一键部署 Unity可以让你的作品在多平台呈现 Wii的发布 Unity让业界最流行的游戏开发软件更容易开发 着色器 Unity的着色器系统整合了易用性、灵活性和高性能 4. 脚本Unity支持3中脚本语言:JavaScript,C#,Boo 5. 创建一个工程Unity3d 在层次面板中点击create创建一个Cube-F2键改名。 给物体添加一个刚体组件可以使得受到重力的实现。 选择砖块,在属性面板里点击add component-选择物理里的Rigibody 为场景添加灯光-Point light。 为了在运行时场景与看到的画面一致,做对其操作-点击主摄像机选择GameObject-Align With View。 把图片引入到unity3d中,先创建一个文件-à直接拖拽。 如何将导入的图片放在组件上,选中材质球à在main color中select图片 创建文件夹来存储内容,更好的分类。 在资源文件夹中创建一个脚本文件夹。 预置:预置是一种资源类型存储在项目视图中的一种可重复使用的游戏对象。预置可以多次放入到多个场景中。当你添加一个预置到场景中,就创建了它的一个实例。所有的预置实例链接到原始预置,基本上是它的克隆。不管你的项目存在多少实例,当你对预置进行任何更改,你将看到这些更改将应用于所有实例。 6. 创建一个墙: 将组件直接拖拽到prefabs文件中,组件就变成了预置物体。Ctrl+D是复制物体。 把复制的物体变成一个空物体的子物体-à创建空物体作为砖块的复制物体。将复制的物体放在空物体里 7. 创建一个射弹à第一个脚本 创建一个球的组件并填充颜色预置。预置后删除。编写脚本:选中脚本文件夹,并创建Javascript脚本。创建脚本实现主摄像机漫游。 Sheji.js>Start函数:当场景一加载的时候运行一次函数,在Start里写 一些命令。 àUpdate函数:每调用一帧就调用一次Update函数,可以认为Update函数是实时进行的 8. Unity的输入管理器 在编辑菜单下Project Settingàinput Horizontalà水平方向默认值,a左返回-1,d右返回1。 Verticalà垂直轴,w向前走路,s向后走。 Fire1à开火键。默认ctrl 9. 编写脚本来控制主摄像机的移动 1) 输入管理器是Unity3d的类 2) Input.GetAxis(“Horizontal”)à检查按下a还是d。 3) Time.deltaTime:两帧之间的时间间隔。 4) var speed : int = 5; 移动主摄像机的速度。变量:是在计算机中用来申请的空间。Var>在java中申请变量,var x = Input.GetAxis(“Horizontal”) * Time.deltaTime * speed; 5) transform.Translate(x,0,z);à移动物体。Print(x);在控制器上输入。 6) 脚本只有依附在物体上才会成功执行。 10. 点击左键发射射弹-实例化命令 Instantiate; 检测鼠标左键: If(Input.GetButtonDown(“Fire1”)/判断是否按了左键 Var n:Transform = Instantiate (newobject,transform.position,transform.rotation); /var:java里面申请变量 给物体加力: n.rigibody.AddForce(fwd*28000); /已经给生成的物体添加刚体这个组件,fwd是个变量。 转换方向: Var fwd:Vector3 = transform.TransformDirection(Vector3.forward); /Vector3就是“xyz”。Forward是“0,0,1”向前的意思-à沿z轴方向à摄像机实际的照射的方向。 销毁物体 Destroy(gameObject,3.0);/消除射弹。过3秒钟之后消除。 11. 把射击的射弹添加到主摄像机 为变量赋予方法,直接拖拽。 12. 实现主摄像机的场景里的左右旋转 检测键盘按键命令:Input.GetKey(KeyCode.Q) /按下键盘上的Q键就返回真, Transform.Rotate(0,-25*Time.deltaTime,0,Space.Self); /旋转的xyz 13. 解决“走到地面”问题 问题的原因:是因为主摄像机与地面的夹角。 解决:利用旋转命令。 14. Java脚本里区分大小写很明显,Input.GetKey(KeyCode.Q)-àQ必须大写。 15. 镜头的升降: if(Input.GetKey(KeyCode.H) transform.Translate(0,5*Time.deltaTime,0); if(Input.GetKey(KeyCode.N) transform.Translate(0,-5*Time.deltaTime,0); 16. 实现功能-GUIText在场景中显示文字。 在Hierarchy层次面板里,create一个GUIText的物体。 GUIText的属性:Textà显示的内容 通过设置Position来控制GUIText的内容在场景里哪个位置来显示。 GUIText的物体注册点在左上角。Z轴是用来显示文字的深度。 17. 实现计算射弹数 创建一个变量来存放射弹数àvar sdcount:int = 0; 在点击的的判断语句中增àgameObject.Find(“wenzi”).GetComponent(GUIText).text=”射弹数:”+sdcount 加/在层次面板中寻找”wenzi”物体,找到组件(GetComponent(GUIText)并访问属性 18. 实现计数射弹数的消灭数(物体被打在地面下代表消灭),消灭数超过20个成功通关 创建一个变量来存放消灭数àvar xmcount:int = 0; 创建一个新的脚本àjiancha Transformà场景,gameObjectà脚本加载在哪个物体。 /transform组件里有位置、旋转等属性。判断游戏对象是否打倒在地面上: if(gameObject.transform.position.y<0) 找到sheji脚本的消灭数:Transform.Find(“Camera”).GetComponent(“sheji”).xmcount+; /寻找物体时加“”,组件不用加“” 消灭数成功之后,不在调用sheji脚本 gameObject.Find(“Camera”).GetComponent(sheji).enabled=false; 19. unity3d里transform和Translate什么分别代表什么意思? transform是Gameobject的位置属性,translate是一个动作属性。获取某个object的位置信息时就是transform,若是对其做动作,那就translate 20. 添加按钮 function OnGUI /负责界面物体,和update一样在游戏执行的每一帧都被调用 GUI.Button(Rect(180,100,60,30),”退出”);/在场景里画一个按钮,屏幕左上角是0,0。 GUI.Button(Rect(距离屏幕左,距离屏幕上,按钮宽度,按钮高度),”退出”); Application.Quit; /退出游戏 Application.LoadLevel; audio.Play; audio.Pause; audio.Stop; 21. 添加音频源组件 在InspectoràAdd ComponentàAudioàAudio Source Audio Source属性Audio Clip绑定音频文件 Play On Awake:场景加载的时候播放音乐。 Loop:循环播放。 22. 代码优化 23. 发布设置 发布什么场景,双击场景 FileàScenes In BuildàAdd Currentà发布Build 24. 添加天空盒子 导入天空盒子:窗口键AssetsàImport Package>Skyboxes 如何使用导入的天空盒子:EditàRender Setting Skybox Material选择材质球来设置天空 25. OnCollisionEnter函数 作用:检测游戏运行时,物体的碰撞,以及发生碰撞后应该执行的内容。 发生碰撞的主体一定是要带刚体的,即只有带刚体的碰撞体去撞其他碰撞体时,双方才会收到碰撞事件。 把碰撞函数放在物体上。 两个物体发生碰撞,如果要检测到碰撞信息,那么其中必有一个物体既带有碰撞器,又带有刚体,且检测碰撞信息的脚本必须附着在带有刚体的碰撞器上 两个GameObject发生碰撞,要想检测到触发信息,最少要有一个刚体碰撞器并且勾选了IsTrigger复选框,另一个最少要有一个碰撞器组件,此时检测碰撞的脚本必须附加在那个带有刚体的触发器上。 实现过程:.新建一个场景。.创建天空渲染选择图片。.GUIText的标题 设置GUIText内容居中àAnchoràUpper center创建脚本menu>按钮开始或者退出游戏。将脚本menu赋予在主摄像机上 涉及到界面绘画按钮等就在OnGUI函数中输写 /重新加载场景文件 /audio>音频 二、孤岛 1. 需要u3d里一些资源包来创建小岛上的物体。 2. Water(Basic).unityPackage-水资源包 Terrain Assets.unityPackage-地形资源包 Skyboxes.unityPackage-天空盒资源包 Character.unityPackage-角色控制器资源包 3. 通过创建地形Terrain来创建小岛,自带7个工具 4. 地形的高度:是指小岛达到的最大高度 5. 第一个:升高地形,按住shift和左键可以降低地形,只能最低降低到地面,点击拖拽就会形成升高地形 6. 第二个:展平工具-给小岛建立初始高度,快速创建小岛,降低小岛边缘的进行降低 TerrainàSettingsàHeight、Flatten 7. 第三个:平滑工具-抹去菱角 8. 第四个:绘制纹理添加 Edit Textures-àselect纹理 添加的一个材质被应用在地形上 绘制地形上的其他物质,GoodDirt,Grass&,Cliff, 9. 第五个:种树工具 10. 第六个:种草工具-绘制细节工具 11. 添加角色控制器:直接拖拽过去,脚本自身都有 12. 第七个:地形的设置:Tree Distanceà被渲染树距离角色控制之间的距离,控制游戏的速率。Detail Distanceà细节物体距离角色控制器之间的距离。 13. 添加雾和天空 Fog勾选雾就被选中,Fog Color雾的颜色,雾的模式àExp2、Linear、,Fog Density雾的浓度,Linear Fog End/Start距离摄像机的雾的变化 Ambient Lightà环境光 14. 添加湖泊 添加Water(Basic)水资源包 工程面板中点击水资源,u3d自带水是预置物体 15. 导入小房子和声音的效果 AssetsàImport PackageàCustom Paackage 导入自己的资源包 16. 导图模型资源包 三、小岛游戏的完善-角色控制器和脚本编写详解 1. 检视面板:复选框à激活作用 2. 静止选项:光照贴图 3. Tag标签:默认无标签,游戏物体的指定,通过标签在脚本中进行引用,使用标签的时 候必须创建。可自创建也可以自带 4. 层:层是另一种为物体分类的方式。可以使用层来使多个物体遵循特定的灯光和相机渲染方式。也可以用于射线技术选择性的忽略某些物体。可以把互相碰撞的物体放在同一个层上,也就是说碰撞必须放在同一个层。层在有光线的物体上可以设置某些层上的物体是否进行照射。 5. 碰撞时虽然没有涉及层,但是创建物体的时候物体被默认存放在同一个default的层上。 6. 新建层的方法: 层中前8个已经被Unity中应用。 在平行光里选择Culling Mask来进行选择性的照射物体。 7. 预置物体-àSelect:选择-锁定物体在场景中的位置 -àRevert:恢复修改之前的内容。 -àApply:应用按钮,所用同一个预置物体克隆出来的物体都去应用修改的内容。 8. 第一人称控制器 三部分组成First Person Controller-外面的绿线:角色碰撞器,Main Camera主摄像机,Graphics:胶装体 First Person Controller5个组件: Transform:位置 Character Controller-àSlope Limit:控制器最大的倾斜度:45度 Character Controller-àStep Offset:控制器最大的台阶高度 Character Controller-àSkin Width:皮肤的厚度决定两个碰撞器之间的相互深入。合理设置值为角色的半径值的百分之十。 Character Controller-àMin Move Distanc:角色移动最小值。 Character Controller-àCenter:碰撞器距离控制器的距离 Character Controller-àRadius Character Controller-àHeight:碰撞器的高度。 9. 子级物体和父级物体的建立 在场景中创建Cube物体 选中Cube直接拖拽到First Person Controller,Cube作为第一人称控制器的子物体,Cube的移动情况依赖第一人称控制器。 10. 小岛上的阴影设置 设置第一人称控制器上的胶囊体-Mesh RendereàCast Shadows、Receive Shadows点击选中,并且设置光线物体让其胶囊体产生阴影,Shadow Type选中软件阴影和硬件阴影都可以。 11. 第三人称控制器-3rd Person Controller 12. 第一人称主机摄像组件 GUILayer:负责渲染GUI纹理 Flare Layer:光晕渲染的效果 CameraàClear Flags:清除标记摄像机绘制的所有元素,屏幕上的空白部分用什么内容绘制。 CameraàCulling Mask:消影遮罩的模式,选中哪个哪个显示。 CameraàProjection:投影方式,Perspective:透视投影方式,Orthographic:正交投影模式,用于制作平面游戏。 CameraàField of View:视野,60度是正常视野。 CameraàClipping Planes:剪切平面,通过剪切来显示多少距离的物体 13. 主摄像机的规范化窗口句型 CameraàNormalizzed View Port Rect:摄像机,XY代表视图位置左下角,右上角,WH代表窗口宽高比例 14. 利用摄像机来画中画 1)第一人称主摄像机设置成满屏 2)设置空物体摄像机的X为0.8,宽高:0.2 3)由于两个摄像机的深度都为0一样的, 主摄像机的视图把空物体的视图覆盖,所以效果没有。 4)把空物体的摄像机的深度设置为1。 四、 脚本的相关知识 1. 什么是命令:一个脚本中编写的指令。 2. 在java中申请变量àvar speed:int = 10; 3. 1) Vector3数据类型:是一个可以存储x,y,z坐标系数据的简单数据类型。 2) Vector3.forward=> Vector3(0,0,1) Vector3.up=> Vector3(0,1,0) Vector3.right=> Vector3(1,0,0) Vector3.zero=> Vector3(0,0,0) Vector3.one=> Vector3(1,1,1) 3) 申请Vector3并且赋值:var v:Vector3 = Vector3(0,0,speed) 4) C#中 public Vector3 v; v = new Vector3(0,0,speed); 4. 设置小方块的初速度小案例-Rigidbody.velocity 1)建立一个平面、方块、聚光灯:createàplane、createàcube、createàspotlight 2)主摄像机和视图屏幕对齐:GameObject>Align With View 3)编写脚本 CameraàDepth:优先级的意思,深度值越大会后绘制图形,会覆盖深度值小的绘制摄像机。 CameraàHDR: rigidbody.velocity = sudu;/给此物体初速度 5. 设置小方块的颜色变换与声音小案例 1)创建小方块 2)编写脚本,创建变量存储颜色:var oldcolor:Color; 在游戏一开始的时候取出当前物体的颜色:oldcolor = render.material.color; /取出当前物体里的渲染组件下的材质里的颜色。 3)定义函数function OnMouseOver /unity中自带的函数事件函数当鼠标指向一个物体时执行此函数 4)renderer.material.color = Color.red;/设置物体的颜色为红色 5)定义函数function OnMouseExit /当鼠标离开物体的时候执行的函数 6)renderer.material.color = oldcolor; 7)定义函数function OnMouseDown /当鼠标点击物体时执行此函数 8)audio.Play; /设置物体的Audio Source的音乐并且勾掉Play On Awake 6. 设置小方块的点击旋转 1)复习摄像机的左右移动: var speed : int = 5; var x:float = Input.GetAxis("Horizontal") * Time.deltaTime * speed; var z:float = Input.GetAxis("Vertical") * Time.deltaTime * speed; transform.Translate(x,0,z); 2)复习摄像机的升降: if(Input.GetKey(KeyCode.W) transform.Translate(0,5 * Time.deltaTime,0); if(Input.GetKey(KeyCode.S) transform.Translate(0,-5 * Time.deltaTime,0); 3) /当鼠标放在物体时进行自身旋转。最后一个参数省略就是沿自身轴旋转 transform.Rotate(0,180 * Time.deltaTime,0); 4)当鼠标点击物体时进行播放,再次点击时进行暂停 7. 函数:也称为方法,是一系列在游戏运行到特定时候被调用的指令。一个脚本可以包含多个函数,每个函数中又可以调用其他存在于当前脚本或存在于其他脚本中的函数。Unity3d提供了很多函数如:OnMouseDown函数、Instantiate、Translate、Rotate等 详细函数见文本:u3d函数方法资料.txt 8. 编写自己的函数 1)定义自己的函数,写 关键字:function + 函数名(参数1,参数2):sum(a:float,b:float)函数内容 2)调用函数。 9. 案例-跳动的球 1)在工程面板里创建物理材质,Physic MaterialàBounciness设置成0.96 2)创建小球增加Sphere CollideràMaterial:为碰撞器增加物理材质,直接拖拽Physic Material到地面与小球上 3)t += Time.deltaTime;/从上一帧开始渲染到下一帧渲染的时间,起到计时作用 10. Find和FindWithTag命令寻找命令消耗计算能的命令,要避免在Update和每一帧都被调用的函数中使用这两个命令,在Start和Awake中使用。变量 = GameObject.Find(“物体名”); 或 变量 = GameObject.FindWithTag(“物体标签名贵”); 11. 使用共有变量:拖放一个物体到变量上 引用脚本所在的物体的组件上的参数:如:transform.position=Vector3(0,5.4,4); 调整脚本所在物体上的参数:renderer.material.color = Color.red; light.intensity=8; 就是说如果把脚本放在物体上之后,就可以直接修改物体的组件属性 12. SendMessage命令:一个调用其他物体上指令的方法-theCube1.SendMessage(“start”); 13. GetComponet命令:引用一个组件。 14. 案例编辑自己的第一人称控制器 1)unity中第一人称用鼠标控制方向,自己创建用键盘方向键控制角色移动 2)创建胶囊体当做第一人称控制器的实体。 3)编写脚本赋予到胶囊体上。 4)脚本:FixedUpdate:每隔一定时间执行一次函数 5)movedirection.y -= gravity*Time.deltaTime; 6)角色控制器上有Move命令来移动>移动信息以及移动过程中的碰撞信息都能保存 7)角色碰撞器发生碰撞: CollisionFlag.CollidedBelow:底部发生了碰撞”flags & CollisionFlags.CollidedBelow”返回1 CollisionFlag.CollidedNone:没有发生了碰撞”flags & CollisionFlags. CollidedNone”返回1 CollisionFlag.CollidedSides:四周发生了碰撞”flags & CollisionFlags. CollidedSides”返回1 CollisionFlag.CollidedAbove:顶端发生了碰撞”flags & CollisionFlags. CollidedAbove”返回1 8)script RequireComponent(CharacterController); /unity自动添加角色控制器 五、小岛继续创建 1. 分割动画,分割开门、关门 1)点击模型àAnimations 2)按“+”进行动画的添加,在动画的帧上截取动画并相应保存 3)点击应用 4)缩放工具:模型àModelàScale Factor=1.5 2. 如何将3D max模型导入Unity3D中 3. 交互:交互就是指玩家与玩家之间,玩家与物体,物体与物体的相互交流,相互交流的信息。 4. 网格碰撞器虽然很符合物体,但是对资源的消耗特别多,因此需要为物体增加原型碰撞器。 5. 交互功能-碰撞之间的交互 1)Mesh Collider网格碰撞器会很消耗,所以添加其他碰撞器来创建一种更好的游戏体验。 2)添加一个其他碰撞器,给门添加一种盒子碰撞器Box Collider 3)为门添加标签可以在脚本中使用门 4)给门添加刚体,取消门使用重力,勾选使用动力学,门可以产生运动。 5)给门添加开门声和关门声,为门添加音频组件。取消动画的自动播放声音选项。 function OnControllerColliderHit(hit:ControllerColliderHit) /控制器碰撞器功能:检测角色控制器与其他碰撞器的碰撞,hità当角色控制器与其他游戏物体发生碰撞,物体的信息和碰撞的信息保存在hit中。通过hit访问碰撞物体。 创建开门/关门函数: function opendoor(door:GameObject) /调用门上的音频组件播放一次开门声音 doorisopen = true; door.gameObject.audio.PlayOneShot(door_open_sound); /开门动画,动画在门的父体模型上 door.transform.parent.animation.Play("dooropen"); 计时关门: function Update if(doorisopen) /从上一帧到当前一帧所经过的时间 doortimer += Time.deltaTime; if(doortimer >door_open_time) shutdoor(currentdoor.gameObject); doortimer = 0.0; 优化代码:实现功能doorcheckà门的状态, a_clipà播放音频,anim_nameà播放动画,thisdoorà门 function door(doorcheck:Boolean,a_clip:AudioClip,anim_name:String,thisdoor:GameObject) 优化之后的函数: 1. 光线投射-Physics.Raycast 通过光线投射命令来实现自动开关门的效果 .hysics.Raycast(transform.position,transform.forward,hit,3);/transform.position:角色控制器的位置,transform.forward:前进的方向、z轴方向,hit:与角色碰撞器的碰撞信息。3:投射的光线长度为3米。、如果碰撞hit.collider.gameObject.tag=”playerDoor”; /与光线发生碰撞的便签是否为currentdoor:GameObject=hit.collider.gameObject;/ palyerDoor。、var 2. 物体交互的方式-碰撞检测的方式:角色控制器自身的碰撞函数,光线投射,触发器 3. 触发器碰撞:1)给房子添加盒子碰撞器,选择触发碰撞器只需勾选Is Trigger。2)按住shift键可以调整碰撞器。3)编写脚本,函数名:OnTriggerEnter当有其他碰撞器进入触发区域时执行此函数,参数col:Collider进入触发区域的触发器的信息保存。 4)好处:可以把脚本分散在其他物体上,减少角色上的脚本。 门上的脚本: 4. 物体交互的相关: 1)当角色控制器的脚本是碰撞脚本时,物体的盒子碰撞器选中Is Trigger,角色控制器穿过物体 2)当角色控制器的脚本是光线投影脚本时,无论是否选中Is Trigger都会显示碰撞效果。 3)两个普通碰撞器起物体之间的碰撞OnCollisitionEntion。 六、收集物体和制作HUD-在屏幕上显示信息 1. 添加旋转的电池>添加刚体>取消重力勾选动力学à添加胶囊体碰撞器à编写脚本à触发碰撞时调用第一人称控制器里的函数cellpickup 2. AudioSource.PlayClipAtPoint(声音文件,位置);/实现在一个位置播放一次声音然后移除销毁自己 3. 限制进入小屋功能:设置电池的预置,添加电池在场景中,编写Invertor的角色脚本。-静态变量:方便其他脚本的使用,不需要调用物体、组件以及属性,直接可以调用脚本中的静态变量。 4. 动态显示收集电池个数: 1)创建GUI Texture物体:选中纹理,在层次面板中点击创建GUI Texture,创建成功相应纹理的图片。 2)建立数组来存放动态的多个图片,下坐标可以使用收集的电池数 数组的申请:var textures:Texture2D; GUITexture创建:var power_gui:GUITexture; 将纹理赋予到GUITexture的纹理上:power_gui.texture = textureschange; 5. 更换物体的主材质: #pragma strict /能源个数与手机时播放的音频 static var change:int = 0; var pickup_sound:AudioClip; /电池图片数组与引用变量 var textures:Texture2D; var powergui_bl:GUITexture; /仪表盘主材质纹理数组与引用变量 var main_textures:Texture2D; var chargeMeter_bl:Renderer; function Start change = 0; /收集能量源函数 function cellpickup /播放“收集音频” AudioSource.PlayClipAtPoint(pickup_sound,transform.position); /收集计数 change+; /替换GUITexture的texture powergui_bl.texture = textureschange; /替换Renderer下的material.mainTexture chargeMeter_bl.material.mainTexture = main_textureschange; 6. 当收集能量源物体收集不到4个时候提示信息,“需要收集能量源”。 使用物体时需要绑定物体与变量,门的音频绑定锁住的声音直接调用声音的播放就是锁住的声音:door_bl.audio.play; 七、刚体和实例化 1. 创建椰子,预置,创建空物体,写脚本à开火时播放声音 2. 实例化椰子: var newcoconut:Rigidboy=Instantiate(coconut_bl,transform.position,transform.rotation); 3. 实现速度:newcoconut.velocity = transform.forward*30.0;/只有物体是刚体时可以 4. 3秒后椰子自动销毁:新建脚本 5. 忽略碰撞命令: Physics.IgnoreCollision(coconutshy_bl.collider,newcoconut.collider,true);/参数一:碰撞体,参数二:碰撞体,参数三:是否忽视碰撞 发射出的椰子不与角色控制器发生Physics.IgnoreCollision(transform.root.collider,newcoconut.collider,true); 6. 限制玩家随意发射椰子,直到到达coconutShy 7. function OnTriggerEnter(col:Collider) / 进入触发区域 function OnTriggerExit(col:Collider) /从触发区域出来 8. 收集电池之前不显示GUITexture图片,收集的时候显示。使能 9. 导入标靶物体:在模型里设置生成碰撞器,在animations动画分割 10. 设置标靶物体:给物体里target_pivot里的内容添加刚体的动力学。,添加target脚本来控制靶播放动画:targetroot=transform.parent.transform.parent.animation;/设置初始动画 11. Function OnCollisionEnter(theobject:Collision) /两个原始物体的碰撞执行函数 12. 协同程序:StartCoroutine(“targethit”); 协同程序类似于其他程序的子线程一类,可以运行本代码同时运行脚本中其他的代码,它被称为是一种优化代码结构的方法,协同程序可以执行或暂停命令一直到符合一定的条件。可以创建时间延时只是一小部分的内容。 yield new WaitForSeconds(reset_timer);/等待3秒钟,时间延时命令 碰撞:/ transform.root.collider:脚本依附的总根,transform.parent:脚本依附的父组件 13. 打倒所有靶之后,收集到能量源,能量源替换成预置的电池物体 14. 取得能源: static var target_count:int = 0; static var havewon:boolean = false; var win_sound:AudioClip; var cellprefab:GameObject; function