使用Multiplayer Networking做一个简单的多人游戏例子.docx

上传人:b****5 文档编号:26445169 上传时间:2023-06-19 格式:DOCX 页数:11 大小:17.52KB
下载 相关 举报
使用Multiplayer Networking做一个简单的多人游戏例子.docx_第1页
第1页 / 共11页
使用Multiplayer Networking做一个简单的多人游戏例子.docx_第2页
第2页 / 共11页
使用Multiplayer Networking做一个简单的多人游戏例子.docx_第3页
第3页 / 共11页
使用Multiplayer Networking做一个简单的多人游戏例子.docx_第4页
第4页 / 共11页
使用Multiplayer Networking做一个简单的多人游戏例子.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

使用Multiplayer Networking做一个简单的多人游戏例子.docx

《使用Multiplayer Networking做一个简单的多人游戏例子.docx》由会员分享,可在线阅读,更多相关《使用Multiplayer Networking做一个简单的多人游戏例子.docx(11页珍藏版)》请在冰豆网上搜索。

使用Multiplayer Networking做一个简单的多人游戏例子.docx

使用MultiplayerNetworking做一个简单的多人游戏例子

使用MultiplayerNetworking做一个简单的多人游戏例子

猴子原创,欢迎转载。

转载请注明:

转载自Cocos2Der-CSDN,谢谢!

原文地址:

Networking做一个简单的多人游戏例子-1/3使用MultiplayerNetworking做一个简单的多人游戏例子-2/3使用MultiplayerNetworking做一个简单的多人游戏例子-3/37.在网络中控制Player移动上一篇中,玩家操作移动会同时控制同屏内的所有Player,且只有自己的屏幕生效。

因为咱们还没有同步Transform信息。

下面我们通过UnityEngine.Networking组件来实现玩家控制各自Player打开PlayerController脚本添加命名空间UnityEngine.NetworkingusingUnityEngine.Networking;11修改MonoBehaviour为NetworkBehaviourpublicclassPlayerController:

NetworkBehaviour11在Update函数中添加如下方法if(!

isLocalPlayer)

{

return;

}12341234最后你的PlayerController内容如下:

usingUnityEngine;

usingUnityEngine.Networking;

publicclassPlayerController:

NetworkBehaviour

{

voidUpdate()

{

if(!

isLocalPlayer)

{

return;

}

varx=Input.GetAxis("Horizontal")*Time.deltaTime*150.0f;

varz=Input.GetAxis("Vertical")*Time.deltaTime*3.0f;

transform.Rotate(0,x,0);

transform.Translate(0,0,z);

}

}1234567891011121314151617181912345678910111213141516171819保存脚本回到Unity中选中Playerprefab在Project面板中保持Playerprefab为选中状态添加组件Network>NetworkTransform保存工程NetworkTransform用于在网络中同步所有Client信息。

加上isLocalPlayer判断,只让当前客户端操作。

8.测试网络中多玩家移动同样Build一个Macstandaloneapplication作为主机运行点击LANHost作为主机开始游戏运行Unity,点击LANClient作为另一个客户端加入游戏点击各自的WASD移动各自Player9.区分各自的Player上面中两个Player外观一致,我们修改自己Player的颜色打开PlayerController脚本添加OnStartLocalPlayer方法publicoverridevoidOnStartLocalPlayer()

{

GetComponent<MeshRenderer>().material.color=Color.blue;

}12341234最终PlayerController:

usingUnityEngine;

usingUnityEngine.Networking;

publicclassPlayerController:

NetworkBehaviour

{

voidUpdate()

{

if(!

isLocalPlayer)

{

return;

}

varx=Input.GetAxis("Horizontal")*Time.deltaTime*150.0f;

varz=Input.GetAxis("Vertical")*Time.deltaTime*3.0f;

transform.Rotate(0,x,0);

transform.Translate(0,0,z);

}

publicoverridevoidOnStartLocalPlayer()

{

GetComponent<MeshRenderer>().material.color=Color.blue;

}

}123456789101112131415161718192021222324123456789101112131415161718192021222324Build新的Mac版本,测试效果关闭Mac版本,停止运行Unity,回到编辑状态10.给Player添加射击武器创建子弹创建一个SphereGameObject修改名称为“Bullet”选中Bullet对象修改Transform(0.2,0.2,0.2)添加组件Physics>Rigidbody在Rigidbody属性中取消UseGravity拖拽Bullet到Project面板中,制作为Prefab删除场景中Bullet保存场景下面修改PlayerController添加发射子弹打开PlayerController脚本添加public变量bulletPrefabpublicGameObjectbulletPrefab;11添加子弹local发射点publicTransformbulletSpawn;11在Update中加入输入源if(Input.GetKeyDown(KeyCode.Space))

{

Fire();

}12341234添加Fire方法voidFire()

{

//CreatetheBulletfromtheBulletPrefab

varbullet=(GameObject)Instantiate(

bulletPrefab,

bulletSpawn.position,

bulletSpawn.rotation);

//Addvelocitytothebullet

bullet.GetComponent<Rigidbody>().velocity=bullet.transform.forward*6;

//Destroythebulletafter2seconds

Destroy(bullet,2.0f);

}12345678910111213141234567891011121314最终PlayerController如下:

usingUnityEngine;

usingUnityEngine.Networking;

publicclassPlayerController:

NetworkBehaviour

{

publicGameObjectbulletPrefab;

publicTransformbulletSpawn;

voidUpdate()

{

if(!

isLocalPlayer)

{

return;

}

varx=Input.GetAxis("Horizontal")*Time.deltaTime*150.0f;

varz=Input.GetAxis("Vertical")*Time.deltaTime*3.0f;

transform.Rotate(0,x,0);

transform.Translate(0,0,z);

if(Input.GetKeyDown(KeyCode.Space))

{

Fire();

}

}

 

voidFire()

{

//CreatetheBulletfromtheBulletPrefab

varbullet=(GameObject)Instantiate(

bulletPrefab,

bulletSpawn.position,

bulletSpawn.rotation);

//Addvelocitytothebullet

bullet.GetComponent<Rigidbody>().velocity=bullet.transform.forward*6;

//Destroythebulletafter2seconds

Destroy(bullet,2.0f);

}

publicoverridevoidOnStartLocalPlayer()

{

GetComponent<MeshRenderer>().material.color=Color.blue;

}

}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748123456789101112131415161718192021222324252627282930313233343536373839404142434445464748保存脚本回到Unity下面开始针对变化过的PlayerController修改PlayerPrefab将PlayerPrefab拖拽到场景中保持Playerprefab选中创建一个Cylinder圆柱体作为其Child修改Cylinder名称为“Gun”保持Gun被选中移除CapsuleCollider组件设置TransformPosition(0.5,0.0,0.5)设置TransformRotation(90.0,0.0,0.0)设置TransformScale(0.25,0.5,0.25)设置Material为BlackMaterial最后Player效果:

保持Player选中状态创建一个emptyGameObject作为Child修改emptyGameObject名称为“BulletSpawn”设置BulletSpawnPosition(0.5,0.0,1.0)主要是将子弹发射点BulletSpawn设置到枪口处保持PlayerPrefab选中将Bulletprefab拖到PlayerController中的BulletPrefab框将Player的ChildBulletSpawn拖到PlayerController中的BulletSpawn框保存工程Build新的Mac版本,并测试你会发现空格键可以在各自场景中发射子弹,但是子弹没有出现在对方场景中。

关闭Mac版本停止Unity,回到编辑模式11.增加多人射击下面我们会将Bulletprefab注册到NetworkManager选中Bulletprefab在Project面板中保存Bulletprefab选中添加组件Network>NetworkIdentity添加组件Network>NetworkTransform设置NetworkTransform中NetworkSendRate为0子弹不会中途改变方向,所以我们不需要每帧更新位置,每个客户端自己计算Bullet坐标信息,所以将NetworkSendRate设置为0,网络不需要同步坐标信息。

选中NetworkManager在Hierarchy面板中保持NetworkManager选中展开SpawnInfo点击RegisteredSpawnablePrefabs右下角+将BulletPrefab加入到RegisteredSpawnablePrefabs中打开PlayerController脚本注意[Command]可以声明一个函数可以本客户端调用,但是会在服务端(主机)执行。

添加[Command]给Fire函数修改Fire函数名称为“CmdFire”[Command]

voidCmdFire()1212Update函数中修改调用为CmdFireCmdFire();11在CmdFire函数中添加NetworkServer.Spawn方法来创建bulletNetworkServer.Spawn(bullet);11最终PlayerController如下:

usingUnityEngine;

usingUnityEngine.Networking;

publicclassPlayerController:

NetworkBehaviour

{

publicGameObjectbulletPrefab;

publicTransformbulletSpawn;

voidUpdate()

{

if(!

isLocalPlayer)

{

return;

}

varx=Input.GetAxis("Horizontal")*Time.deltaTime*150.0f;

varz=Input.GetAxis("Vertical")*Time.deltaTime*3.0f;

transform.Rotate(0,x,0);

transform.Translate(0,0,z);

if(Input.GetKeyDown(KeyCode.Space))

{

CmdFire();

}

}

//This[Command]codeiscalledontheClient…

//…butitisrunontheServer!

[Command]

voidCmdFire()

{

//CreatetheBulletfromtheBulletPrefab

varbullet=(GameObject)Instantiate(

bulletPrefab,

bulletSpawn.position,

bulletSpawn.rotation);

//Addvelocitytothebullet

bullet.GetComponent<Rigidbody>().velocity=bullet.transform.forward*6;

//SpawnthebulletontheClients

NetworkServer.Spawn(bullet);

//Destroythebulletafter2seconds

Destroy(bullet,2.0f);

}

publicoverridevoidOnStartLocalPlayer()

{

GetComponent<MeshRenderer>().material.color=Color.blue;

}

}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152531234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253保存脚本回到UnityBuild新版本Mac,测试此时应该可以看到子弹同步到了每个玩家场景中关闭Mac版本停止运行Unity,回到编辑模式添加玩家生命值给BulletPrefab添加一个新脚本“Bullet”打开Bullet脚本添加碰撞函数usingUnityEngine;

usingSystem.Collections;

publicclassBullet:

MonoBehaviour{

voidOnCollisionEnter(Collisioncollision)

{

Destroy(gameObject);

}

}1234567891012345678910此时子弹碰撞到Player之后自动销毁添加玩家生命值-给Playerprefab添加一个新脚本“Health”Health脚本如下:

usingUnityEngine;

publicclassHealth:

MonoBehaviour

{

publicconstintmaxHealth=100;

publicintcurrentHealth=maxHealth;

publicvoidTakeDamage(intamount)

{

currentHealth-=amount;

if(currentHealth<=0)

{

currentHealth=0;

Debug.Log("Dead!

");

}

}

}12345678910111213141516171234567891011121314151617保存脚本在Bullet中增加击中受伤修改Bullet中的OnCollisionEnter函数usingUnityEngine;

usingSystem.Collections;

publicclassBullet:

MonoBehaviour{

voidOnCollisionEnter(Collisioncollision)

{

varhit=collision.gameObject;

varhealth=hit.GetComponent<Health>();

if(health!

=null)

{

health.TakeDamage(10);

}

Destroy(gameObject);

}

}12345678910111213141516171234567891011121314151617添加一个简易的玩家头顶血条在场中中创建一个UIImage修改Canvas名称为“HealthbarCanvas”修改Image名称为“Background”保存Background选中设置RectTransformWidth100设置RectTransformHeight10修改SourceImage为built-inInputFieldBackground修改ImageColor为红色不要修改Background的中心点和锚点复制一份Background修改复制出来的Background名称为Foreground将Foreground设置为Background的Child将Playerprefab拖到场景中将HealthbarCanvas拖到Player中作为Child整个Player结构如下:

选中Foreground设置ForegroundImage为绿色将Foreground中心点和锚点修改为MiddleLeft(用于血条从左到右填充)选中HealthbarCanvas点击RectTransform设置按钮(小齿轮)中的Reset设置RectTransformScale(0.01,0.01,0.01)设置RectTransformPosition(0.0,1.5,0.0)选中Player,点击apply,保存PlayerPrefab保存场景修改Health脚本,控制血条最终Health脚本如下:

usingUnityEngine;

usingUnityEngine.UI;

usingSystem.Collections;

publicclassHealth:

MonoBehaviour{

publicconstintmaxHealth=100;

publicintcurrentHealth=maxHealth;

publicRectTransformhealthBar;

publicvoidTakeDamage(intamount)

{

currentHealth-=amount;

if(currentHealth<=0)

{

currentHealth=0;

Debug.Log("Dead!

");

}

healthBar.sizeDelta=newVector2(currentHealth,healthBar.sizeDelta.y);

}

}1234567891011121314151617181920212212345678910111213141516171819202122保存脚本回到Unity保持Player选中将Foreground拖到Healthbar输入框中applyPlayerprefab删除场景中的Player保存场景最后,修改Healthbar永远朝向主摄像机-给Playerprefab中的HealthbarCanvas添加新脚本“Billboard”Billboard脚本如下:

usingUnityEngine;

usingSystem.Collections;

publicclassBillboard:

MonoBehaviour{

voidUpdate(){

transform.LookAt(Camera.main.transform);

}

}123456789123456789编译新Mac版本,测试你会发现血条只在本地变化了,没有同步到所有玩家。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1