Удаление объекта по сети

Сеть в Unity3D

Удаление объекта по сети

Сообщение Angel 07 23 июл 2011, 21:34

Здравствуйте, вроде бы простая операция, но что-то не могу разобраться. Итак, есть отдельное приложение - сервер, и отдельное приложение - клиент. Хочется, чтобы когда клиент подсоединяется к серверу, то создавался некий объект (вроде игрока), а потом, когда клиент отключается, чтобы объект удалялся. Объект создаю с помощью метода Network.Instantiate. Причем для пущего контроля происходит так: клиент подсоединился, говорит серверу: "хочу игрока создать". Сервер смотрит на параметры этого клиента, и если все нормально, говорит: "даю добро!", и вызывает у клиента соответствующую RPC-функцию.

Синтаксис:
Используется csharp
[RPC]
        void SpawnCharOnClient(NetworkPlayer player)
        {
                if(player == Network.player)
                {
                        Network.Instantiate(playerprefab, new Vector3(0, 1.5f, 0), new Quaternion(0, 0, 0, 0), 0);
                        Network.DestroyPlayerObjects(Network.player);
                }
        }


Второй строчкой идет удаление созданного объекта, которое не работает (ну это для теста так сделано). Ошибок не выдает, но пишет, что No objects for the given player ID were deleted 1. Наверное надо как-то иначе удалять объекта.

Пробовал с помощью Network.Destroy, но там свои сложности. Если ему в качестве аргумента подавать view ID, то он такое впечатление, что всю сеть удаляет. А подать ему в качестве аргумента конкретный объект, который надо удалить не получается, так как нужен объект класса GameObject, а при создании получается просто Object. После приведения типов все равно не работает.

Вот такая проблема. И еще, созданный с помощью Network.Instantiate объект появляется не только во всех клиентах, но и в серверном приложении (для этого пришлось туда prefab закинуть). Это конечно же несуразица, не нужны на сервере эти объекты. Может быть есть другой способ организовать одновременное порождение объектов во всех клиентах?
_ttp://shekn.deviantart.com/
Аватара пользователя
Angel 07
UNIверсал
 
Сообщения: 367
Зарегистрирован: 02 окт 2010, 18:58

Re: Удаление объекта по сети

Сообщение corrozian 23 июл 2011, 21:48

По поводу чтоб на сервер не создавало, надо бы глянуть на ваш код вызова рпц, а так там можно указать other в функции вызова, или установить условие isServer или isClient и тому подобные случаи...
Про удаление почему бы просто не написать Network.Destroy(playerprefab).
Можно сказать это мое "имхо" по данным вопросам...
corrozian
UNец
 
Сообщения: 16
Зарегистрирован: 10 июн 2011, 12:47

Re: Удаление объекта по сети

Сообщение gnoblin 23 июл 2011, 22:02

В m2h tutorial это всё хорошо расписано для юнити-сети.
На сервере - можно просто удалить ненужные компоненты по условию isServer
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Удаление объекта по сети

Сообщение Angel 07 24 июл 2011, 11:14

Что-то все равно не работает. При просто вызове Network.Destroy(playerprefab) выдается ошибка, дескать аргумент не тот. На сервере работает следующий кусок:

Синтаксис:
Используется csharp
void Update ()
        {
                if(needspawn)
                {
                        needspawn = false;
                        networkView.RPC("SpawnCharOnClient", RPCMode.Others, playertospawninfo.sender);
                }
        }


Как видно, при поднятии флага needspawn, один раз удаленно вызывается функция SpawnCharOnClient, которая у всех клиентов одинаковая и написана в первом посте. Это в общем-то понятно. Проблема в том, что объект все-так не удаляется.

В M2H уроке про сеть написано следующее:

Синтаксис:
Используется javascript
function OnPlayerDisconnected(player: NetworkPlayer) {
        Debug.Log("Clean up after player " + player);
        Network.RemoveRPCs(player);
        Network.DestroyPlayerObjects(player);
}


То есть метод Network.DestroyPlayerObjects удаляет все объекты, которые ранее создавал текущий игрок. А у меня почему-то говорится, что нечего удалять, и объект по-прежнеиу висит во всех клиентах.
_ttp://shekn.deviantart.com/
Аватара пользователя
Angel 07
UNIверсал
 
Сообщения: 367
Зарегистрирован: 02 окт 2010, 18:58


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4