Вызов команды не выполняется - PullRequest
0 голосов
/ 26 ноября 2018

В настоящее время я делаю тестовую программу, которая перемещает игрока вверх после нажатия кнопки.

Я использую команды и RPC для этого.Когда я нажимаю кнопку на хосте, плеер хоста перемещается вверх, но не тогда, когда я нажимаю кнопку на клиенте.Я не могу понять, почему.Я получаю сообщение об ошибке, говорящее, что я

пытаюсь отправить команду для объекта без прав доступа.

Но игрок уже должен иметь право авторитета ?!У префаба игрока есть сетевая идентификация с проверенными полномочиями локального игрока.

Что странно, так это то, что мой код, который меняет имена каждого игрока, когда они появляются, работает отлично, но не код, который меняет позицию для клиента, по крайней мере.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class TestPlayerController : NetworkBehaviour 
{

    void Start() 
    {
        if (!isServer)
        {
            CmdChangeName("Player 2");
        }
        else if (isServer) 
        {
            CmdChangeName("Player 1");
        }
    }

    void Update() 
    {
        if (TestCubeScript.button1Press == true) 
        {
            if (!isServer) 
            {
                CmdMoveCube(new Vector2(transform.position.x, transform.position.y + 1));
                TestCubeScript.button1Press = false;
            }
            else 
            {
                RpcUpdateCube(new Vector2(transform.position.x, transform.position.y + 1));
                TestCubeScript.button1Press = false;
            }
        }
    }

    [Command]
    void CmdMoveCube(Vector2 pos)
    {
        RpcUpdateCube(pos);
    }

    [ClientRpc]
    void RpcUpdateCube(Vector2 pos)
    {
        transform.position = pos;
    }

    [Command]
    void CmdChangeName(string name) 
    {
        RpcUpdateName(name);
    }

    [ClientRpc]
    void RpcUpdateName(string name) 
    {
        transform.name = name;
    }
}

1 Ответ

0 голосов
/ 26 ноября 2018

О том, как работают CMD и RPC, схема должна выглядеть примерно так:

private void Foo()
{
  if(isServer)
  {
    RpcFoo();
  }
  else
  {
    if(!hasAuthority)
    {
      setLocalAuthority(); //You should code this behaviour depending of the object
    }
    else
    {
      CmdFoo();
    }
  }
}

[ClientRpc]
private void RpcFoo()
{
  //Do your stuff
}

[Command]
private void CmdFoo()
{
  RpcFoo();
}

Так что, вероятно, ваша ошибка в Start, где:

void Start() 
{
  if (!isServer)
  {
      CmdChangeName("Player 2");
  }
  else if (isServer) 
  {
      CmdChangeName("Player 1");
  }
}

должно быть:

void Start() 
{
  if (!isServer)
  {
      CmdChangeName("Player 2");
  }
  else if (isServer) 
  {
      RpcChangeName("Player 1") //--> The change!;
  }
}
...