使用Multiplayer Networking做一个简单的多人游戏例子.docx
- 文档编号:26445169
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:11
- 大小:17.52KB
使用Multiplayer Networking做一个简单的多人游戏例子.docx
《使用Multiplayer Networking做一个简单的多人游戏例子.docx》由会员分享,可在线阅读,更多相关《使用Multiplayer Networking做一个简单的多人游戏例子.docx(11页珍藏版)》请在冰豆网上搜索。
使用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版本,测试你会发现血条只在本地变化了,没有同步到所有玩家。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用Multiplayer Networking做一个简单的多人游戏例子 使用 Multiplayer Networking 一个 简单 游戏 例子