客户端无法在服务器上生成对象-Unity mirror networking c#
我已经为此挣扎了一两天了。出于某种原因,NetworkServer.Spawn()似乎无法工作。据我所知,可以从客户端调用NetworkServer.Spawn()来生成服务器上的对象,并从服务器上生成所有客户端上的对象。目前,当客户机触发时,它只出现在该客户机上(而不是服务器上),当主机触发时,投射物会在主机和客户机上生成 代码顶部有一个using Mirror标记,该脚本源自NetworkBehavior。下面这段代码是在客户端上调用的:客户端无法在服务器上生成对象-Unity mirror networking c#,c#,unity-networking,C#,Unity Networking,我已经为此挣扎了一两天了。出于某种原因,NetworkServer.Spawn()似乎无法工作。据我所知,可以从客户端调用NetworkServer.Spawn()来生成服务器上的对象,并从服务器上生成所有客户端上的对象。目前,当客户机触发时,它只出现在该客户机上(而不是服务器上),当主机触发时,投射物会在主机和客户机上生成 代码顶部有一个using Mirror标记,该脚本源自NetworkBehavior。下面这段代码是在客户端上调用的: void Shoot() { //S
void Shoot()
{
//Spawn porjectile on local machine
GameObject shot = Instantiate(projectile) as GameObject;
//Set shot projectile position
shot.transform.position = projectilePoint.position;
shot.transform.rotation = transform.rotation;
//Set projectile component of the shot projectile
Projectile shotProjectile = shot.GetComponent<Projectile>();
//Set properties of shot projectile
shotProjectile.damage = damage;
shotProjectile.direction = projectilePoint.position - transform.position;
shotProjectile.speed = projectileTravelSpeed;
shotProjectile.team = team;
shotProjectile.shotBy = gameObject;
NetworkServer.Spawn(shot);
}
void shot()
{
//在本地计算机上生成porject
GameObject shot=将(投射物)实例化为GameObject;
//设置射弹位置
shot.transform.position=投影点.position;
shot.transform.rotation=transform.rotation;
//设置射击弹丸的弹丸组件
射弹shotparket=shot.GetComponent();
//射弹的集合性质
散弹。损坏=损坏;
shotparket.direction=projectlepoint.position-transform.position;
射弹速度=射弹行进速度;
shotparket.team=团队;
shotparket.shotBy=游戏对象;
NetworkServer.Spawn(快照);
}
有人知道为什么投射物不是从客户端在服务器上生成的吗?代码示例(c#)也会非常有用。NetworkServer.Spawn()
只能在服务器上调用。它使GameObject
被发送到所有客户端,这样他们就可以看到它,与它交互等等。因此,您需要从客户端调用服务器上的函数,该函数将Spawn()
为您生成对象
[Client]
void Shoot()
{
//Call spawn on server
CmdShoot(projectile, projectilePoint.position, transform.rotation);
}
[Command]
void CmdShoot(GameObject projectile, Vector3 position, Quaternion rotation)
{
GameObject shot = Instantiate(projectile) as GameObject;
//Set shot projectile position
shot.transform.position = projectilePoint.position;
shot.transform.rotation = transform.rotation;
//Set projectile component of the shot projectile
Projectile shotProjectile = shot.GetComponent<Projectile>();
//Set properties of shot projectile
shotProjectile.damage = damage;
shotProjectile.direction = projectilePoint.position - transform.position;
shotProjectile.speed = projectileTravelSpeed;
shotProjectile.team = team;
shotProjectile.shotBy = gameObject;
NetworkServer.Spawn(shot);
RpcOnShoot();
}
[ClientRpc]
void RpcOnShoot()
{
//Called on all clients
}
[客户端]
空射()
{
//在服务器上调用spawn
CMDShot(投射物、投射点、位置、变换、旋转);
}
[命令]
射击(游戏物体投射,矢量3位置,四元数旋转)
{
GameObject shot=将(投射物)实例化为GameObject;
//设置射弹位置
shot.transform.position=投影点.position;
shot.transform.rotation=transform.rotation;
//设置射击弹丸的弹丸组件
射弹shotparket=shot.GetComponent();
//射弹的集合性质
散弹。损坏=损坏;
shotparket.direction=projectlepoint.position-transform.position;
射弹速度=射弹行进速度;
shotparket.team=团队;
shotparket.shotBy=游戏对象;
NetworkServer.Spawn(快照);
RpcOnShoot();
}
[客户端RPC]
void RpcOnShoot()
{
//拜访所有客户
}
或者调用
NetworkServer.SpawnWithClientAuthority()
,如果希望实例化对象具有客户端权限(客户端需要设置shotprojectles
属性)。看起来网络服务器是第三方协议。找不到有关Spawn的任何文档。我确实在网上找到了一个pdf文档:lora网关到网络服务器接口定义:什么进入RpcOnShoot()
?是否有必要,或者该命令是否会自动为每个客户端创建对象?RpcOnShoot()具有[ClientRpc]属性,因此在服务器上调用时会在所有客户端上调用它(也只能从服务器上调用)。如果您想在实例化之后立即执行某些操作,那么它不是必需的,但很有用。是的,尽管在调用NetworkServer后,它将在服务器上实例化。生成(快照)该对象将在每个客户端上创建。是否确实可以传递一个游戏对象,如CMDShot(游戏对象投射、矢量3位置、四元数旋转)中?无论我做什么,Sprojector在服务器端都将是一个空引用。