C# unity网络:在服务器上的客户端之外看不到预置
我试图让玩家创建shurikens,但它们只出现在制作它们的客户机上。我已将网络标识添加到shuriken预置,并将shuriken预置添加到network manager中已注册的可繁殖预置。以下是播放器脚本中用于创建shuriken预制件的以下命令:C# unity网络:在服务器上的客户端之外看不到预置,c#,unity5,unity-networking,C#,Unity5,Unity Networking,我试图让玩家创建shurikens,但它们只出现在制作它们的客户机上。我已将网络标识添加到shuriken预置,并将shuriken预置添加到network manager中已注册的可繁殖预置。以下是播放器脚本中用于创建shuriken预制件的以下命令: void CmdThrowShuriken(){ //creates knife shurikenCount -= 1; myAnimator.SetTrigger("throw"); if (shuri
void CmdThrowShuriken(){
//creates knife
shurikenCount -= 1;
myAnimator.SetTrigger("throw");
if (shurikenCount != 0) {
if (facingRight) {
GameObject tmp = (GameObject)Instantiate (knifePrefab, transform.position, Quaternion.identity);
NetworkServer.Spawn(tmp);
tmp.GetComponent<Shuriken> ().Initialize (Vector2.left);
} else {
GameObject tmp = (GameObject)Instantiate (knifePrefab, transform.position, Quaternion.identity);
NetworkServer.Spawn(tmp);
tmp.GetComponent<Shuriken> ().Initialize (Vector2.right);
}
}
}
void CmdThrowShuriken(){
//制造刀
shurikenCount-=1;
myAnimator.SetTrigger(“抛出”);
如果(shurikenCount!=0){
如果(朝向右侧){
GameObject tmp=(GameObject)实例化(刀子预置、transform.position、Quaternion.identity);
NetworkServer.Spawn(tmp);
tmp.GetComponent().Initialize(Vector2.left);
}否则{
GameObject tmp=(GameObject)实例化(刀子预置、transform.position、Quaternion.identity);
NetworkServer.Spawn(tmp);
tmp.GetComponent().Initialize(Vector2.right);
}
}
}
和shuriken脚本:
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Shuriken_net : NetworkBehaviour {
// Use this for initialization
private float speed = 10;
private Rigidbody2D myRigidbody;
private Vector2 direction;
void Start () {
myRigidbody = GetComponent<Rigidbody2D> ();
}
// Update is called once per frame
void FixedUpdate(){
}
void RotateRight () {
transform.Rotate (Vector3.forward * 45);
}
public void Initialize(Vector2 direction){
this.direction = direction;
}
[ServerCallback]
void Update () {
myRigidbody.velocity = direction * speed;
RotateRight ();
}
void OnCollisionEneter(Collision other){
if (PlayerNet.Instance.health != 0) {
PlayerNet.Instance.health -= 5;
}
if (!isServer) {
return;
}
if (other.gameObject.tag != "Ninja") {
return;
}
if (PlayerNet.Instance.health != null) {
PlayerNet.Instance.TakeDamage(5);
}
}
void OnBecameInvisible(){
NetworkServer.Destroy (gameObject);
}
使用UnityEngine;
使用系统集合;
使用UnityEngine。联网;
公共类Shuriken_net:网络行为{
//用于初始化
私人浮动速度=10;
私人刚体;
专用矢量2方向;
无效开始(){
myRigidbody=GetComponent();
}
//每帧调用一次更新
void FixedUpdate(){
}
void RotateRight(){
变换。旋转(矢量3.forward*45);
}
公共无效初始化(矢量2方向){
这个方向=方向;
}
[服务器回调]
无效更新(){
速度=方向*速度;
RotateRight();
}
void OnCollisionEneter(碰撞其他){
如果(PlayerNet.Instance.health!=0){
PlayerNet.Instance.health-=5;
}
如果(!isServer){
返回;
}
如果(other.gameObject.tag!=“忍者”){
返回;
}
if(PlayerNet.Instance.health!=null){
PlayerNet.实例.承受伤害(5);
}
}
void onbecame隐身(){
NetworkServer.Destroy(游戏对象);
}
}我对这个API很生疏,但是这个对象有NetworkIdentity组件吗?预制是否已在两个客户端上注册?此外,像您这样在客户端上手动设置变量有点不可靠,除非您使用客户端权限(告诉服务器一个客户端将控制该对象)。通常,数据由服务器命令设置。如果您在没有权限的客户端中设置它,它可能无法同步。是的,我已将NetworkIdentity添加到shuriken中,很抱歉没有提供详细信息,并且播放器预置位于网络管理器中,我确实将shuriken预置添加为注册的可生成预置,我假设这赋予了播放器生成shuriken的权限,然而,你提出了一个很好的观点,我将不得不尝试用客户端权限繁殖玩家。感谢您的回复,我的意思是将shuriken授予客户权限。但你不需要这么做。我发现Unity多人游戏教程在理解这些东西时非常有用,因为它们的代码几乎可以演示所有内容。这是与您相关的页面:在该示例中,他们显然在服务器函数中调用Instantiate()和Spawn()。我认为这可能是您的问题的核心——您正在作为客户机进行实例化和生成。这很有效-谢谢!本教程看起来很棒,非常感谢链接:)