ss2donlinev4 c八风吹不动一屁打过江_第1页
ss2donlinev4 c八风吹不动一屁打过江_第2页
ss2donlinev4 c八风吹不动一屁打过江_第3页
ss2donlinev4 c八风吹不动一屁打过江_第4页
ss2donlinev4 c八风吹不动一屁打过江_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计游戏程序,所以我们选择这个简单的游戏做为范例。机与的版本,您会发现用arcalet设计游戏真的很简单,原本玩家操控的程序是yerGameObject中的yer.cs,现在我们进行多人联机版的改造后,为了让yer.cs中的程序代码必须能够使用与存取AGCC对象,因此我们先在Awake()中取得AGCC对象变量: voidAwake(){}要学线版太空的操控之前,现在先来复下单机版SpaceShooter的玩家操控方式,由于太空的动作比较简单,只有左右两个方向,所以在yer对象的Update里可以看到呼叫Input.GetAxisRaw("Horizontal")来取得操控设备(键盘或游戏杆)目前水平状态的程序代码,Input.GetAxisRaw("Horizontal")传回的数值只有三种,分别是0、1、-1,0表示静止,1表示往右,-1表示往左,所以在Update()中随着frame的更新重新计算太空的位移值,要完成版SpaceShooter的玩家操控,除了原先就有的本地操控外,我们还得把自己所操控的太空的位置传递到主大厅给的玩家们,让其它玩家游戏画面里所对应属于自己的太空战游戏程序一秒钟会执行Update()高达60次,如果每次都把自己的坐标数据送出去,这样的做法课题,在此我们暂时不讨论太复杂的算法。由于SpaceShooter太空是以定速移动,同步问题-1三种数值,我们可以把这三个数值做为太空的方向值,当数值改变了也就是太空的方向改变了,此时我们传送这个玩家的太空新的方向值与目前的坐标资料到主大厅,其它玩家收到后立刻重设对应的玩家太空的方向值与坐标值,便可让游戏中每一艘太空的位其中方向值是0、1、-1,分别代表静止、右移、左移;而X,Y,Z则是目前太空飞机在3D世界中这是修改Update()程序代码后的yer.cs {}{} //Movethe transform.position=}}依照讯息中的poid到 yers中找到对应的GameGameObject可以在RegyersList中被找到,为了方便使用,我们在AGCC对象中设计了一个函式Findyer(),依照poid找到对应玩家的GameObject对象,然后把它传回来,如果找不到就传回null:{ }}}}由于Remoteyer.cs中的Update()使用变量inputAxis来控制方向,所以游戏程序从主大厅收到传来要改变其对应的太空的方向时,只要直接改变inputAxis的值就可接着我们在Remoteye对象中设计一个新的函式SetyerMotionStatus(),用来设定太空的移动方向与坐标位置。为了方便使用,我们直接传递「yerMove」讯息的参数字符串给SetyerMotionStatus(),进入函式后再解析参数字符串,得到方向与坐标值后重新设定inputAxis变量与太空的位置坐标,以下是SetyerMotionStatus()函式的 {string[]p=param.Split('/');floatmove string[] }UNITY3DGameObject就是面向对象程序概念里的Object,所以会以「GameObject.Method」这样的语法来呼叫他所写的函式。事实上,GameObject控制程序中所定义对象(也就是.cs文件里面所定义的继承自MonoBehavior」只能呼叫定义的函式,不能呼叫GameObject控制程序中的函式。为什么要用到这个程序技巧呢?这是因为主大厅的讯息接收是在AGCC对象的OnMessageIn()事件中处理,当它接收到「yerMove」讯息后就得呼叫Remoteyer.cs里SetyerMotionStatus(),因此我们在取得太空的GameObject实例时,只能以GameObject.SendMessage()呼叫Remoteyer.cs中SetyerMotionStatus()函式。叫它的控制Remoteyer.cs中的SetyerMotionStatus()函式: {}了解了这样的概念后,我们着手在agcc.cs的OnMessagieIn里面加上处理「 {]==": : GameObjectpgo=Find if(pgo!=null)} yer("+}}}}太空的重生过程中,无敌状态对本地玩家来说是没有意义的,所以我们可以让太空被陨石时,的太空就马上,但的火球还是一样出现,直到本地太空战接着我们进行修改yer.cs中的碰撞侦测,当碰撞的物体是陨石时,就立刻送出讯息到主大厅,hit号poid;(x,y,z)是陨石的坐标,也就是要产生效果的坐标位置。这是修改后的yer.cs的OnTrigger()内容如下 { }}}为了方便测试所做的修改,开发者可以在使用多台计算机进试时,不会因为手忙脚乱导致游戏很快就结束,e由于yer.cs中会参考到变量enemy.enemyNo,所以要在Enemy.cs中再加上这个变数e////一、在指定的坐标上面产生效果游戏的主控者,就直接让陨石置实例化ExplosionPrefabPrefab,以产生效果。{}第二个动作:要先依照讯息的poid找到于RegyersList里的GameObject,然后呼叫其控制Remoteyer.cs里的SetyerVisible()函式。SetyerVisible()函式是我们要//// { }这里要提醒大家,此处的太空只是玩家操控的太空的同步,所以我们在此控制让它即可,至于的太空本尊在被陨石后的重生无敌状态并不需要同步到的所有玩家,直到无敌状态结这里要提醒大家,此处的太空只是玩家操控的太空的同步,所以我们在此控制让它即可,至于的太空本尊在被陨石后的重生无敌状态并不需要同步到的所有玩家,直到无敌状态结束,玩家会再送出讯息通知玩家,到时候再让的太空出现就可以了。第三个动作:要让陨石并不是真的删除陨石GameObject,而是把它的位置移到目前////{}Enemy.SetPositionAndSpeed(),不过我们还得修改这个SetPositionAndSpeed()函式,让它可以把新产生的陨石资料传送给玩家,好让其最后,我们把处理「hityer」讯息的程序代码加到agcc.cs的OnMessageIn()里////{ 时时}}} if}}}玩家接收到「hityer」讯息时会让其对应的太空,然后要再等通知让的太空再度出现,由于本地玩家会在yer.cs的DestroyShip()进行太空重生,最后当无敌状态结束时就可以发出讯息通知玩家同步让的太空再度出现,我们定义讯息格式如其中poid是被陨石的太空所属玩家之poid,(x,y,z)则是太空重新出现时的坐标位要要 { {yieldreturnnewWaitForSeconds(blinkRate);} }}设定好新坐标后再让它出现,为了重设太空飞机的位置,我们先在Remoteyce.cs中加上一个新的函式SetyerPosition()://// {}紧接着修改////{ }}}}不论陨石玩家操控的太空,或是后面要介绍的玩家发射弹陨石,陨石都得在由于陨石在游戏中属于「非玩家角色」(简称),在整个游戏系统里面只能有一个控为为为(x1,y1,z1)表transform.position,陨石出现的位置////{}接着修改////{ if(agcc.isMaster){x=Random.Range(-7f,7f);} if(agcc.isMaster){}}玩家收到「enemyAGCCEnemy.cs里的函式来产生新的陨石,Enemy.csResetEnemyParam()AGCC//// { } 这是要用来控制Update()的程序流程用的,原本单机版Update()程序代码只是很单纯的控制陨石的移动,它是一个很简单的AI(非玩家角色人工智能),如果陨石没有任何玩家所操控的太空,也没有被任何弹,最后陨石移动到游戏画面之外后,Update()程序就会呼叫SetPositionAndSpeed()产生新的陨石。至于版作业则要考虑到陨石随时都有可被任何一个玩家撞到或是,既然 ToResetEnemy变量让Update()程序呼叫SetPositionAndSpeed()来产生新的陨石,也////{ }} }}////{ ( }}{intfloat if(enemy!=null)}将将 { }}空照本地的弹制作另一个prefab,名称为RemoteProjectilePrefab。空当我们呼叫Instantiate()生成RemoteProjectile的GameObject实例后就把它在LIST里,等到弹目标或是飞到游戏画面之外,再从LIST里把这个弹GameObject删除,让不再使用↓ ↓ ↓↓↓{}↓// // { 射:为poid谁发射弹intfireNo intfirePoidif(yer==null) }}}所以要先判断讯息的poid是不是自己的,如果不是,才是玩家传送过来要我们在游戏画 yer.cs中的Fire()函式来产生玩家所发射的 射生射生 {的//把 Hashtableme=newHashtable();{} }prefabInstantiate()GameObject实例,然后把它指定给GameObject型态的变量go。接着使用Hashtable型态的变量me来存放poid、fireno、go最后一行呼叫go.SendMessage("SetNode",me),这是因为稍后介绍的弹控制程序建立RemoteProjectile.cs很简单,只有短短几行,SetNode()Hashtable参数存//// {}}在本在RemotePeojectile.cs里的Update()里控制弹的移动,当弹离开游戏画面,就把它在本一 移除跟目前这个玩家发射的弹有关Hashtable资料,也就是稍早在呼的 呼叫Destroy(gameObject),删除执行目前控制程序的GameObject。以下是完整RemotePeojectile.cs程序代码内容:在本在本////RemoteProjectile.csusingUnityEngine; {//取 }voidStart(){}voidUpdate(){{if(this.node!=null) }}}}{}指定变量原本在单机版的SpaceShooter只有一个玩家,发射的弹也只有一种,要决定弹有没有目标,只要在弹的控制程序里的OnTriggerEnter()判断和它发生碰撞的对象是否是陨石(也就是enemy对象),如果是的话,那就是目标了。由于弹与陨石的碰撞是由Unity3D的碰撞侦测系统处理,在进行版改造作业时千万了游戏场景里的每个物体只能由一个主控程控,所以弹与陨石的碰撞侦测也只能从Projectile与RemoteProjectile选择一个控制程序来进行。既然Projectile.cs在单机版时已经负责这项工作,在此我们决定仍旧由它继续担任弹与陨石的碰撞处理作业,当碰撞发生后再送出讯息通知玩家,其它玩家收到讯息后,必须把陨石的表产生新的陨石得呼叫enemy.SetPositionAndSpeed(),这个函式已经具有同步功能了,所以以下修改过的Projectile.cs的OnTriggerEnter()////publicintfireNo=0;{}{}}}}}二、让被打到的陨石产生效果为了让打到陨石的弹从记录它的List删除,我们另外 yer.cs中定义一个新的函 {}}}}////{ if(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论