【问题标题】:Networking Problems - Server controls client网络问题 - 服务器控制客户端
【发布时间】:2015-03-06 19:00:31
【问题描述】:

我正在尝试开发一个在线游戏,人们可以在其中闲逛和聊天,但由于某种原因,客户端的立方体没有出现在服务器的游戏中,反之亦然,但服务器控制着客户端和服务器.这是两个文件的代码:

网络脚本:

using UnityEngine;
using System.Collections;
public class NetworkManager : MonoBehaviour
{

string registeredGameName = "Hangout Zone";
bool isRefreshing = false;
float refreshRequestLength = 3.0f;
HostData[] hostData;

private void StartServer()
{
    Network.InitializeServer(16, 25002, false);
    MasterServer.RegisterHost(registeredGameName, "Hangout Zone", "The place to chill with friends.");
}

void OnServerInitialized()
{
    Debug.Log("Server has been initialized.");
}

void OnPlayerDisconnected(NetworkPlayer player)
{
    Debug.Log("Player disconnected.");
    Network.RemoveRPCs(player);
    Network.DestroyPlayerObjects(player);
}

void OnApplicationQuit()
{
    if (Network.isServer)
    {
        Network.Disconnect(200);
        MasterServer.UnregisterHost();
    }

    if (Network.isClient)
    {
        Network.Disconnect(200);
    }
}

void OnMasterServerEvent(MasterServerEvent masterServerEvent)
{
    if (masterServerEvent == MasterServerEvent.RegistrationSucceeded)
    {
        Debug.Log("Registration Successful.");
    }
}

public IEnumerator RefreshHostList()
{
    Debug.Log("Refreshing...");
    MasterServer.RequestHostList(registeredGameName);
    float timeStarted = Time.time;
    float timeEnd = Time.time + refreshRequestLength;

    while (Time.time < timeEnd)
    {
        hostData = MasterServer.PollHostList();
        yield return new WaitForEndOfFrame();
    }

    if (hostData == null || hostData.Length == 0)
    {
        Debug.Log("No active servers have been found.");
    }
    else
    {
        Debug.Log(hostData.Length + " have been found.");
    }

}

private void SpawnPlayer()
{
    Debug.Log("Spawning player...");
    Network.Instantiate(Resources.Load("Prefabs/Block"), new Vector3(0f, 2.5f, 0f), Quaternion.identity, 0);
}



public void OnGUI()
{

    if (Network.isServer)
    {
        GUILayout.Label("Running as a server.");
    }
    else if (Network.isClient)
    {
        GUILayout.Label("Running as a client.");
    }

    if (Network.isClient)
    {
        if (GUI.Button(new Rect(25f, 25f, 150f, 30f), "Spawn"))
        {
            SpawnPlayer();
        }
    }
    if (Network.isClient || Network.isServer)
    {
        return;
    }

    if (GUI.Button(new Rect(25f, 25f, 150f, 30f), "Start New Server"))
    {
        StartServer();
    }
    if (GUI.Button(new Rect(25f, 65f, 150f, 30f), "Refresh Server List"))
    {
        StartCoroutine("RefreshHostList");
    }
    if (hostData != null)
    {
        for (int i = 0; i < hostData.Length; i++)
        {
            if (GUI.Button(new Rect(Screen.width / 2, 65f + (30f * i), 300f, 30f), hostData[i].gameName))
            {
                Network.Connect(hostData[i]);
            }
        }
    }
}
}

控制脚本:(这是 JavaScript)

#pragma strict

function Update () {
    if (Input.GetKey(KeyCode.W))
    {
        transform.position.z += 0.03;
    }

    if (Input.GetKey(KeyCode.S))
    {
        transform.position.z -= 0.03;
    }

    if (Input.GetKey(KeyCode.A))
    {
        transform.position.x -= 0.03;
    }

    if (Input.GetKey(KeyCode.D))
    {
        transform.position.x += 0.03;
    }
}

【问题讨论】:

  • 播放器预制是否添加到 NetworkManager 中?

标签: c# networking unity3d unityscript multiplayer


【解决方案1】:

您是否缺少OnPlayerConnect 或类似的东西? 我只看到SpawnPlayer(),除了按钮之外看不到它被从任何地方调用。

无论如何,您正在生成一个带有本地控件的对象。这意味着如果第二个玩家确实生成了更多的立方体,您将通过所有机器控制所有这些立方体。 控制脚本只有在看到本地玩家是对象的所有者时才需要响应(因为我怀疑您已将脚本附加到所有生成的块上)。

我认为统一在网络视图的NetworkView.isMine 属性中具有此功能。将类似这样的内容添加到您的控制器脚本中:

function Update () {
if (!networkView.isMine) { return; }
if (Input.GetKey(KeyCode.W))
{
    transform.position.z += 0.03;
}

【讨论】:

  • 我添加了 OnPlayerConnect 但仍然没有任何反应
  • 我认为 Network.Instantiate 有问题,因为每当播放器生成时,它都会给我一个错误,但我不知道如何修复它。我将在下面粘贴确切的错误。
  • 我认为 Network.Instantiate 有问题,因为每当播放器生成时,它都会给我一个错误,但我不知道如何修复它。我将在下面粘贴确切的错误。
  • 好的,错误现在消失了,但仍然有问题
  • 您已将NetworkView 附加到您实例化的游戏对象?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多