【问题标题】:Object only spawning server side [NetworkServer/NetworkClient]仅生成服务器端的对象 [NetworkServer/NetworkClient]
【发布时间】:2017-05-13 13:00:17
【问题描述】:

我正在尝试开始使用 Unity 的网络功能,但在尝试生成对象时遇到了问题。我尝试按照here 找到的文档创建一个简单的演示,服务器生成一个每秒改变颜色的对象,每个连接的客户端都应该看到这个对象及其颜色变化。客户端/服务器正在连接,但对象仅出现在服务器端(没有错误消息)。

Client.cs

public class Client : MonoBehaviour
{
    public GameObject boxPrefab;

    private NetworkClient networkClient;

    private static void OnConnected(NetworkMessage networkMessage)
    {
        Debug.Log(string.Format("[ID: {0}] Connected.", networkMessage.conn.connectionId));
    }

    private void Start()
    {
        networkClient = new NetworkClient();

        ClientScene.RegisterPrefab(boxPrefab);  
        networkClient.RegisterHandler(MsgType.Connect, OnConnected);
        networkClient.Connect("127.0.0.1", 5172);

        Debug.Log("Connecting...");
    }
}

Server.cs

public class Server : MonoBehaviour
{
    public BoxSpawner boxSpawner;

    private void OnConnection(NetworkMessage networkMessage)
    {
        Debug.Log(string.Format("[ID: {0}] Connected.", networkMessage.conn.connectionId));
    }

    private void Start()
    {
        NetworkServer.RegisterHandler(MsgType.Connect, OnConnection);
        NetworkServer.Listen("127.0.0.1", 5172);
        Debug.Log("Listening...");

        NetworkServer.SpawnObjects();
        boxSpawner.Spawn();
    }
}

BoxSpawner.cs

public class BoxSpawner : NetworkBehaviour
{
    public GameObject boxPrefab;

    public void Spawn()
    {
        GameObject box = (GameObject) Instantiate(boxPrefab, transform.position, transform.rotation);
        NetworkServer.Spawn(box);
    }
}

客户端和服务器都有一个名为 Box 的预制件,上面有以下脚本,以及一个 NetworkIdentity 组件。

Box.cs

public class Box : NetworkBehaviour
{
    [SyncVar]
    private Color32 color;

    private IEnumerator ChangeColour()
    {
        while (true)
        {
            color = new Color32((byte)Random.Range(0, 255), (byte)Random.Range(0, 255),
                (byte)Random.Range(0, 255), 255);
            yield return new WaitForSeconds(1.0f);
        }
    }

    private void Start()
    {
        if (isServer)
        {
            StartCoroutine(ChangeColour());
        }
    }

    private void Update()
    {
        GetComponent<SpriteRenderer>().color = color;
    }
}

我还将客户端/服务器项目都上传到了 GitHub 存储库 here,如果有人可以看一下并帮我一把,我将不胜感激,谢谢。

注意:我正在尝试在不使用 NetworkManager 的情况下完成此操作。

【问题讨论】:

    标签: c# networking unity3d unity3d-unet


    【解决方案1】:

    快速查看您的代码我可以看到一件事,我不知道这是不是原因,但是您在客户端上注册了您的 boxPrefab。我猜应该在服务器上完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-14
      • 2022-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2012-03-07
      相关资源
      最近更新 更多