Пользовательские функции спавна
Вы можете использовать функции обработчика спавна, чтобы настроить поведение объектов при спавне созданных игровых объектов на клиенте. Функции обработчика спавна гарантируют, что у вас есть полный контроль над тем, как вы создаете игровой объект, а также как вы его уничтожаете.
Используйте NetworkClient.RegisterSpawnHandler
или NetworkClient.RegisterPrefab
чтобы регистрировать функции для спавна и уничтожения игровых объектов на клиенте. Сервер спавнит игровые объекты напрямую, а затем спавнит их на клиентах с помощью этой функции. Эти функции принимает либо asset ID, либо prefab и две функции делегата: одна обрабатывает создание объекта на клиенте, и одна обрабатывает уничтожение объекта на клиенте. Asset ID может быть динамичным, или просто найденным на prefab'е игрового объекта который вы хотите заспавнить.
Делегаты Spawn / Unspawn будут выглядеть примерно так:
Spawn Handler
или
UnSpawn Handler
Когда prefab сохраняется, его поле assetId
будет назначено автоматически. Если вы хотите создавать prefab'ы во время выполнения, вам придется сгенерировать новый GUID.
Генерация Prefab'а в реальном времени
Использование существующего prefab'а
Spawn on Server
Сами функции спавна реализуются с помощью подписки делегата. Вот это спавнер монет. The SpawnCreature
would look the same, but have different spawn logic:
При использовании пользовательских функций спавна иногда полезно иметь возможность отменять спавн игровых объектов, не уничтожая их. Это можно сделать, вызвав NetworkServer.UnSpawn
. Это приводит к тому, что объект становится Reset
на сервере и отправляет ObjectDestroyMessage
клиентам. ObjectDestroyMessage
приведет к вызову пользовательской функции unspawn на клиентах. Если нет функции unspawn, то вместо этого объект будет уничтожаться (Destroy
)
Обратите внимание, что на хосте игровые объекты не создаются для локального клиента, поскольку они уже существуют на сервере. Это также означает, что никакие функции spawn или unspawn-обработчика не будут вызываться.
Чтобы избежать таких методов как Instantiate и Destroy часто используя GameObjects, вместо этого может быть полезно отправить их в пул.
Вот пример того, как вы могли бы настроить простую систему пула игровых объектов с пользовательскими обработчиками появления. При появлении и отмене появления игровые объекты помещаются в пул или извлекаются из него.
Чтобы использовать пул, добавьте компонент PrefabPool
(приведенный выше код) к NetworkManager'у. Затем перетащите prefab, который вы хотите создать несколько раз, в поле Prefab.
Убедитесь что вы удалили Prefab из списка NetworkManager'а spawnable prefabs. Должен быть только один способ заспавнить его. В противном случае Mirror выдаст предупреждение.
Мы можем модифицировать наш пример Tanks чтобы продемонстрировать вам систему пулинга.
Откройте Tank.cs и найдите функцию CmdFire:
Вместо функции Instantiate, вытащите Prefab из пула:
Projectile.cs в данный момент самоуничтожаются посредством GameObject.Destroy:
Вместо этого мы можем просто задеспанить объект, вернув его в наш пул:
Нажмите кнопку "играть" и выпустите несколько снарядов. Обратите внимание, что ничего не создается (Instantiate). Вместо этого, NetworkManager имеет пул отключенных объектов-детей, которые он использует когда они нужны.
Last updated