Unity Server GameObject уничтожение - PullRequest
0 голосов
/ 09 октября 2018

У меня есть 2D-игра, созданная в Unity, в которой я хочу, чтобы персонажи могли стрелять пулями, а когда пуля попадает в игрока, чтобы оттолкнуть его назад, уничтожая пулю.Из-за того, что сервер не синхронизируется идеально, в некоторых случаях пуля уничтожается локально, но не на всех клиентах, поэтому я хочу сделать это [Command], чтобы уничтожить ее на сервере и на всех клиентах тоже.

Код для локального кода выглядит следующим образом:

void OnTriggerEnter2D(Collider2D col)
{
    if (col.gameObject.tag == "bullet") 
    {
        Explode (Mathf.Sign (col.attachedRigidbody.velocity.x));
        Destroy(col.gameObject);
    }
}

И я попытался сделать его для многопользовательской игры вот так

[Command]
void CmdOnTriggerEnter2D(Collider2D col)
{
    if (col.gameObject.tag == "bullet") 
    {
        Explode (Mathf.Sign (col.attachedRigidbody.velocity.x));
        Network.Destroy(col.gameObject);
    }
}

Но он не работает .. он говорит мне, что

Параметр CmdOnTriggerEnter2D [col] имеет тип [Collider2D], который является Компонентом.Вы не можете передать Компонент удаленному вызову.Попробуйте передать данные из компонента.

Я понимаю, что должен использовать другой параметр, но как ..?Как я могу сделать эту функцию для работы на моем сервере?

1 Ответ

0 голосов
/ 09 октября 2018

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

В документации Unity для Command вы можете найти, какие значения разрешены в качестве параметра:

Допустимые типы аргументов:

  • Базовый тип (byte, int, float, string,UInt64 и т. Д.)
  • Встроенный математический тип Unity (Vector3, Quaternion и т. Д.),
  • Массивы базовых типов
  • Структуры, содержащие допустимые типы
  • NetworkIdentity
  • NetworkInstanceId
  • NetworkHash128
  • GameObject с подключенным компонентом NetworkIdentity.

=> Обратите особое внимание на самый нижний элемент вlist:

Вы можете просто передать col.gameObject, если в нем есть NetworkIdentity компонент!


Чем бы я проверил, если тег Tag уже совпадаетпрежде чем подчеркнуть пропускную способность сети вг.Значение: проверять вкладку локально и вызывать только команду с действительной ссылкой GameObject.

Таким образом, ваш код должен выглядеть так:

//local
void OnTriggerEnter2D(Collider col)
{
    if (col.gameObject.tag != "bullet") return;

     CmdOnTriggerEnter2D(col.gameObject);
} 

// This is executed only on the server
[Command]
void CmdOnTriggerEnter2D(GameObject col)
{
    // Depending on what Explode does you might want to pass it pack to all clients as well
    // Since currently this will only happen on the server itself!
    Explode (Mathf.Sign (col.attachedRigidbody.velocity.x));
    Network.Destroy(col);  
}

Требование, как сказано выше, состоит в том, что объект пули имеетNetworkIdentity компонент, но я предполагаю, что это уже тот случай, если это префаб, созданный в сети, как мне кажется.


Примечание

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

//local
void OnTriggerEnter2D(Collider col)
{
    if (col.gameObject.tag != "bullet") return;

    // Already get the value needed for the Explode method
    var value= Mathf.Sign (col.attachedRigidbody.velocity.x)

    // Also pass the value so we can provide it to all clients later      
    CmdOnTriggerEnter2D(col.gameObject, value);
} 

// This is executed only on the server
[Command]
void CmdOnTriggerEnter2D(GameObject col, float value)
{
    // Tell all clients to Explode using the passed value
    RpcExplode(value);
    Network.Destroy(col);  
}

// This is called by the server but executed by ALL clients
[ClientRpc]
void RpcExplode(float value)
{
    Explode (value);
}

Поскольку я не знаю, что вам нужно для работы Explode: Будьте осторожны с уничтожением объекта маркера, если он необходим для выполнения Explode;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...