2

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

这是我的代码:-

  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);
}
4

3 回答 3

0

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

我也面临同样的问题,我通过使用命令 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 Behavior派生你的类。

于 2017-02-02T07:59:44.863 回答
0

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

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

于 2016-03-02T23:49:22.047 回答
0

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

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

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

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

于 2016-12-17T01:33:29.840 回答