Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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
Unity3d Unity网络:对象具有速度,但不移动_Unity3d_Networking_Velocity_Rigid Bodies - Fatal编程技术网

Unity3d Unity网络:对象具有速度,但不移动

Unity3d Unity网络:对象具有速度,但不移动,unity3d,networking,velocity,rigid-bodies,Unity3d,Networking,Velocity,Rigid Bodies,这是一款2.5D/正交视图游戏。基本上,每个玩家都可以发射一枚射弹。这个弹丸应该有一个固定的速度,直到它击中目标(没有阻力,没有重力)。我最初是这样做的,尽管对于非服务器玩家来说有很大的滞后。为了解决这个问题,我使用了一个RPC调用为所有客户端实例化一个本地“虚拟”投射物,而服务器实例化并管理真正的投射物(使用collider等)。这样,客户端就可以看到一个laggy投射物(服务器上没有生成对象) 我几乎让它工作了(网络方面-没有延迟,显示正确),但是,所有的射弹都会毫无理由地慢到停止。根据“对

这是一款2.5D/正交视图游戏。基本上,每个玩家都可以发射一枚射弹。这个弹丸应该有一个固定的速度,直到它击中目标(没有阻力,没有重力)。我最初是这样做的,尽管对于非服务器玩家来说有很大的滞后。为了解决这个问题,我使用了一个RPC调用为所有客户端实例化一个本地“虚拟”投射物,而服务器实例化并管理真正的投射物(使用collider等)。这样,客户端就可以看到一个laggy投射物(服务器上没有生成对象)

我几乎让它工作了(网络方面-没有延迟,显示正确),但是,所有的射弹都会毫无理由地慢到停止。根据“对象刚体信息”部分,它似乎仍然有速度,但它没有移动

这是我的密码。我希望它在没有NetworkServer.Spawn(投射物)的情况下工作 如果我取消注释这一行,生成的投射物不会失去速度,而客户端虚拟投射物会停止

谢谢你的帮助

protected virtual void CreateProjectile() {
    Vector2 mousePos = playerCamera.ScreenToWorldPoint(Input.mousePosition);
    Vector2 myPos = (Vector2)transform.position;
    Vector2 direction = mousePos - myPos;
    direction.Normalize();
    float orientation = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
    Vector3 endOfGun = DetermineEndOfWeapon() * 0.7f; // 0.6f because gun doesn't take up entire sprite
    Vector3 endOfGunWorldPos = this.transform.position + endOfGun;

    Cmd_CreateProjectile(endOfGunWorldPos, direction, orientation);
}

[Command]
protected virtual void Cmd_CreateProjectile(Vector2 endOfGunWorldPos, Vector2 direction, float orientation) {

    GameObject projectile = Instantiate(projectilePrefab, endOfGunWorldPos, Quaternion.identity) as GameObject;
    projectile.gameObject.layer = LayerMask.NameToLayer("TeamAProjectile");
    projectile.GetComponent<Rigidbody2D>().velocity = direction * projectileSpeed;
    projectile.transform.Rotate(0, 0, orientation);
    projectile.transform.SetParent(projectileParent.transform);
    projectile.name = projectileName;

    // don't want to spawn, just create local projectile for all clients
    //NetworkServer.Spawn(projectile);
    Rpc_CreateDummyProjectile(endOfGunWorldPos, direction, orientation);
}

[ClientRpc]
protected virtual void Rpc_CreateDummyProjectile(Vector2 endOfGunWorldPos, Vector2 direction, float orientation) {
    if (isServer) {
        return;
    }
    // creating dummy bullet for 'laggy' client so it looks good for them
    GameObject dummyProjectile = Instantiate(projectilePrefab, endOfGunWorldPos, Quaternion.identity) as GameObject;
    BoxCollider2D bc2d = dummyProjectile.GetComponent<BoxCollider2D>();
    Destroy(bc2d);

    dummyProjectile.GetComponent<Rigidbody2D>().velocity = direction * projectileSpeed;
    dummyProjectile.transform.Rotate(0, 0, orientation);
    dummyProjectile.transform.SetParent(projectileParent.transform);
    dummyProjectile.name = "DUMMY" + projectileName;
}
protected virtual void createspolution(){
Vector2 mousePos=playerCamera.ScreenToWorldPoint(Input.mousePosition);
Vector2 myPos=(Vector2)transform.position;
Vector2方向=鼠标点-myPos;
方向。规范化();
浮动方向=数学Atan2(方向y,方向x)*数学Rad2Deg;
Vector3 endOfGun=DetermineEndOfWeapon()*0.7f;//0.6f,因为枪不会占据整个精灵
Vector3 endofgunforldpos=this.transform.position+endOfGun;
Cmd_CreateProjection(endOfGunWorldPos、方向、方向);
}
[命令]
受保护的虚拟void Cmd_createSprojection(矢量2 endofgunforldpos、矢量2方向、浮动方向){
GameObject Sproject=实例化(ProjectlePreFab、endOfGunWorldPos、Quaternion.identity)为GameObject;
Sproject.gameObject.layer=LayerMask.NameToLayer(“团队项目”);
projection.GetComponent().velocity=方向*投射速度;
投射。变换。旋转(0,0,方向);
projective.transform.SetParent(projectleParent.transform);
projection.name=projectLenName;
//不想繁殖,只需为所有客户端创建本地投射
//NetworkServer.Spawn(投射物);
Rpc_createdummy投射物(endofgunborldpos、方向、方向);
}
[客户端RPC]
受保护的虚拟空Rpc_CreatedumMySprojection(矢量2 endOfGunWorldPos、矢量2方向、浮动方向){
如果(isServer){
返回;
}
//为“laggy”客户端创建虚拟项目符号,使其看起来更适合他们
GameObject DummySproject=实例化(ProjectlePrefab,endOfGunWorldPos,Quaternion.identity)为GameObject;
BoxCollider2D bc2d=dummyprojection.GetComponent();
销毁(bc2d);
DummyProjection.GetComponent().velocity=方向*投射速度;
Dummy投射。变换。旋转(0,0,方向);
dummyprojection.transform.SetParent(projectleparent.transform);
dummyprojection.name=“DUMMY”+项目名称;
}

CreateSproject是否仅在服务器上调用?(请通过isServer检查确认)您好,谢谢您的回复。不,当鼠标单击时,任何玩家都应该能够发射投射物,这意味着客户端玩家还需要调用CreateProjectletry,使其类似于:private void createProjector(){if(isServer){Rpc_createProjector();}else{Cmd u createProjector()}并告诉我它是否有所改进