Unity3d Unity网络:对象具有速度,但不移动
这是一款2.5D/正交视图游戏。基本上,每个玩家都可以发射一枚射弹。这个弹丸应该有一个固定的速度,直到它击中目标(没有阻力,没有重力)。我最初是这样做的,尽管对于非服务器玩家来说有很大的滞后。为了解决这个问题,我使用了一个RPC调用为所有客户端实例化一个本地“虚拟”投射物,而服务器实例化并管理真正的投射物(使用collider等)。这样,客户端就可以看到一个laggy投射物(服务器上没有生成对象) 我几乎让它工作了(网络方面-没有延迟,显示正确),但是,所有的射弹都会毫无理由地慢到停止。根据“对象刚体信息”部分,它似乎仍然有速度,但它没有移动 这是我的密码。我希望它在没有NetworkServer.Spawn(投射物)的情况下工作 如果我取消注释这一行,生成的投射物不会失去速度,而客户端虚拟投射物会停止 谢谢你的帮助Unity3d Unity网络:对象具有速度,但不移动,unity3d,networking,velocity,rigid-bodies,Unity3d,Networking,Velocity,Rigid Bodies,这是一款2.5D/正交视图游戏。基本上,每个玩家都可以发射一枚射弹。这个弹丸应该有一个固定的速度,直到它击中目标(没有阻力,没有重力)。我最初是这样做的,尽管对于非服务器玩家来说有很大的滞后。为了解决这个问题,我使用了一个RPC调用为所有客户端实例化一个本地“虚拟”投射物,而服务器实例化并管理真正的投射物(使用collider等)。这样,客户端就可以看到一个laggy投射物(服务器上没有生成对象) 我几乎让它工作了(网络方面-没有延迟,显示正确),但是,所有的射弹都会毫无理由地慢到停止。根据“对
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()}并告诉我它是否有所改进