Как показывают ваши выходные данные, вы не можете передать ссылку на компонент 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
;)