我正在为我的朋友们开一个小游戏。到目前为止,我已经获得了网络权利,两个玩家都可以飞来飞去,而且它们都是同步的。
现在我添加了我产生的射弹(激光):
if (_mou.LeftButton == ButtonState.Pressed
&& oldState.LeftButton
!= ButtonState.Released)
{
if (timeSinceShot > timePerShot)
{
timeSinceShot = 0;
bulletRotation = rotation; //Rotation of the players ship
laser.addLaser(myID, bulletRotation, localPosition);
}
}
这很好用,它从我的船上发射激光,但还没有显示出来。
现在,当我开火时,我称之为:
om.Write(bulletRotation); //Sends the rotation to the server
当服务器收到它时,它会将其发送给所有玩家,包括射击者。
以下是我在客户端上接收数据并将其写入激光列表的方法:
if (who != myID)
{
try
{
float laserR = msg.ReadFloat();
laser.addLaser(who, laserR, player.players[i].position);
}
catch { }
}
现在,当我在2个客户端测试它并开火时,我可以看到自己在第二个客户端开火,这很好。然而,它不仅会激发第二个客户端,还会触发我客户的第二个玩家。
编辑:谁是RemoteUniqueIdentifier,myID是客户端RemoteUniqueIdentifier
这是我的问题的图片。 http://i.stack.imgur.com/CYJyW.png (因为我没有10个代表,所以无法上传。)
编辑2:
这是服务器将数据发送给所有玩家的方式:
foreach (NetConnection player in server.Connections)
{
// ... send information about every other player (actually including self)
foreach (NetConnection otherPlayer in server.Connections)
{
// send position update about 'otherPlayer' to 'player'
NetOutgoingMessage om = server.CreateMessage();
// write who this position is for
om.Write(player.RemoteUniqueIdentifier);
om.Write(otherPlayer.RemoteUniqueIdentifier);
if (otherPlayer.Tag == null)
otherPlayer.Tag = new float[4];
float[] pos = otherPlayer.Tag as float[];
om.Write(pos[0]); // velocity X
om.Write(pos[1]); // velocity X
om.Write(pos[2]); // rotation
if (!noLasers)
{
om.Write(pos[3]); // bullet rotation
}
// send message
server.SendMessage(om, player, NetDeliveryMethod.Unreliable);
}
}
答案 0 :(得分:0)
如果RemoteUniqueIdentifier
是某个类的对象,并且您试图通过网络天真地传递它,那么您将永远无法测试本地版本以及从服务器获得的相等性。
“另一边”上的重建对象将始终具有无法与原始对象进行比较的引用。
在这种情况下,您可以选择从RemoteUniqueIdentifier
切换到某些不可变类型,例如int
或Guid
,甚至可以使用string
。