Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
客户端无法在服务器上生成对象-Unity mirror networking c#_C#_Unity Networking - Fatal编程技术网

客户端无法在服务器上生成对象-Unity mirror networking c#

客户端无法在服务器上生成对象-Unity mirror networking c#,c#,unity-networking,C#,Unity Networking,我已经为此挣扎了一两天了。出于某种原因,NetworkServer.Spawn()似乎无法工作。据我所知,可以从客户端调用NetworkServer.Spawn()来生成服务器上的对象,并从服务器上生成所有客户端上的对象。目前,当客户机触发时,它只出现在该客户机上(而不是服务器上),当主机触发时,投射物会在主机和客户机上生成 代码顶部有一个using Mirror标记,该脚本源自NetworkBehavior。下面这段代码是在客户端上调用的: void Shoot() { //S

我已经为此挣扎了一两天了。出于某种原因,NetworkServer.Spawn()似乎无法工作。据我所知,可以从客户端调用NetworkServer.Spawn()来生成服务器上的对象,并从服务器上生成所有客户端上的对象。目前,当客户机触发时,它只出现在该客户机上(而不是服务器上),当主机触发时,投射物会在主机和客户机上生成

代码顶部有一个using Mirror标记,该脚本源自NetworkBehavior。下面这段代码是在客户端上调用的:

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在服务器端都将是一个空引用。