【问题标题】:NetworkServer is not active. Cannot spawn objects without an active server in Unity 3DNetworkServer 未激活。在 Unity 3D 中没有活动服务器时无法生成对象
【发布时间】:2016-06-14 04:21:20
【问题描述】:

我正在尝试在 Unity3d 中实现多人游戏功能。它就像一个蛇游戏,蛇吃食物并产生它的一部分。我也可以成功生成食物和零件,但它不会移动并给我错误“网络服务器未激活。没有活动服务器就无法生成对象。”

这是我的代码:-

  private void CmdCheckForFood(Vector3 snakePartPosToBeInitialize,Vector3 headPos)
{

    if(_food != null)
    {
        if (_food.transform.position == headPos) // if food collide with head. 
        {
            _food.transform.position = GenerateRandomPosForFood(); 
               currPartOfSnake += 1;
            CmdCreatePartSnake(snakePartPosToBeInitialize);


        }
    }

}
public void CreatePartSnake(Vector3 snakePartPosToBeInitialize)
{
    GameObject obj = Instantiate(snakePart, snakePartPosToBeInitialize, Quaternion.identity) as GameObject;

    obj.name = "" + currPartOfSnake;
    obj.transform.parent = gameObject.transform;
    tail.Add(obj); // tail is list which contain all part of snake
    NetworkServer.Spawn(obj);
}

【问题讨论】:

    标签: networking unity3d multiplayer unity5 unity-networking


    【解决方案1】:

    您正在尝试在客户端调用 NetworkServer,因此在这种情况下,CreatePartSnake 应该是 [COMMAND] 以便在服务器上运行。

    http://docs.unity3d.com/ScriptReference/Networking.CommandAttribute.html

    【讨论】:

    • 我也这样做了,但是通过使用命令它给了我在服务器上的空引用。
    • @vanshika 您获得空引用,因为您无法从命令方法访问蛇形部件或任何其他游戏对象。这些应该作为方法的参数发送,但是因为实际上不可能,您需要传递对它的引用而不是实际对象。
    【解决方案2】:

    我不知道你是否还有问题,但正如@Jansen所说,你需要在函数上方添加[Command]标签,并将Cmd添加到函数的开头。

    另外,您可以使用 NetworkServer.active() 检查服务器是否处于活动状态。

    类似 if(NetworkServer.active()) 的东西应该足以确保除非网络服务器启动,否则不会调用该函数。

    确保您的服务器实际上也正在启动!

    【讨论】:

      【解决方案3】:

      注意:当前的统一文档会让你疯狂尝试,风险自负

      我也面临同样的问题,我通过使用command Attribute 制作函数来解决它,你应该需要像这样改变你的产卵函数

      [Command]//add command attribute to the spawning function and also add Cmd in function name
          public void CmdCreatePartSnake(Vector3 snakePartPosToBeInitialize)
          {
              GameObject obj = Instantiate(snakePart, snakePartPosToBeInitialize, Quaternion.identity) as GameObject;
      
              obj.name = "" + currPartOfSnake;
              obj.transform.parent = gameObject.transform;
              tail.Add(obj); // tail is list which contain all part of snake
              NetworkServer.Spawn(obj);
          }
      

      但首先你需要从Network Behaviour 派生你的类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-07
        • 1970-01-01
        • 1970-01-01
        • 2021-03-11
        • 2018-11-20
        • 2021-09-05
        • 1970-01-01
        相关资源
        最近更新 更多