Как оставить объекты которые инстантились photon cloud?

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение jimmm 30 ноя 2016, 19:01

юnity писал(а):Вот с ткаой ошибкой как бороться? Я пытаюсь отослать RPC в событии OnLeftRoom().Cannot send messages when not connected. Either connect to Photon OR use offline mode! Так то id пересылаются другому клиенту, при нажатии на кнопку в апдейте, но когда их отправить лучше что бы мастерклайнт вышел, успев отослать? Вот такая функция
Синтаксис:
Используется csharp
        [PunRPC]
        void RewriteId(int id, string str)
        {
                foreach (GameObject go in arr) {
                        if(go.name == str)
                                go.GetComponent<PhotonView>().viewID = id;
                }
        }

:p А то получается что у обоих клиентов объекты с одинаковыми айди. На сервере непонятно что произойдёт. :))



Я так делал лимит для сессии раунда, то есть чтоб все покинули игру одновременно,
Я отсылал зарание, до выхода, то есть нужно сделать так чтоб рпс отправилось перед тем как игроку дадут выйти.
Или отправлять rpc AllBufferedViaServer
jimmm
UNIверсал
 
Сообщения: 417
Зарегистрирован: 23 янв 2013, 22:57

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение ikhtd 30 ноя 2016, 22:27

на событии OnLeftRoom() уходящий игрок, как параметр передет только объект, на котором необходимо поменять id и передает его только одному игроку(PhotonTargets.Server), например мастерклиенту.(но вреале будет передаваться лист объектов а не один объект). то есть этот объект помещается в переменную на нашем мастерклиенте. далее он с этого скрипта который на нем, обращается к этому объекту (go.SendMessage "SpawnMyPlayerEverywhere") , и инициирует выполнение вот этого скрипта уже на самом объекте
Синтаксис:
Используется csharp
void SpawnMyPlayerEverywhere()
{        
    //Manually allocate PhotonViewID
    PhotonViewID id1 = PhotonNetwork.AllocateViewID();
    photonView.RPC("SpawnOnNetwork", PhotonTargets.AllBuffered, transform.position,
        transform.rotation, id,);
}

[PunRPC]
void SpawnOnNetwork(Vector3 pos, Quaternion rot, PhotonViewID id1)
{
 
    //Set the PhotonView
    PhotonView[] nViews = go.GetComponent<PhotonView>();
    nViews[0].viewID = id1;
}


//в результате этот объект будет принадлежать уже другому игроку и не удалиться
 


то есть этот скрипт висит на том объекте который мы хотим сохранить в сцене. соответственно он находится и на всех объектах , который наинстансил наш уходящий игрок. суть в том, чтобы к этим объектам обратился мастерклиент, перед тем как тот игрок вышел. и главное успеть выполнить эту команду перед тем как объекты делитнуться
онлефт рум- да дерьмовое событие - на нем ниче не успеет сработать
Скрытый текст:
Объективная реальность это - что в жизни не может быть более одного пути, который в свою очередь обусловлен максимальным существующим давлением. (второй _ttp://habrahabr.ru/post/202654/)
ikhtd
Адепт
 
Сообщения: 1124
Зарегистрирован: 24 мар 2014, 12:20

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение юnity 01 дек 2016, 09:24

Ну принцып понятен.
Как из сцены гейм вызвать такое событие?Надо же туда послать на сервер что то с параметром. Я не понял. Тоже rpc?
Синтаксис:
Используется csharp
RPC("моя функция", PhotonTargets.MasterClient, id);
//и выходить из комнаты?

Так?
Give exact coordinates of the decision of the problems
Аватара пользователя
юnity
UNITрон
 
Сообщения: 290
Зарегистрирован: 21 июл 2015, 18:30

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение ikhtd 01 дек 2016, 11:12

я ж сказал послать gameObect

RPC("моя функция", PhotonTargets.MasterClient, gameObect);

//и выходить из комнаты
Скрытый текст:
Объективная реальность это - что в жизни не может быть более одного пути, который в свою очередь обусловлен максимальным существующим давлением. (второй _ttp://habrahabr.ru/post/202654/)
ikhtd
Адепт
 
Сообщения: 1124
Зарегистрирован: 24 мар 2014, 12:20

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение юnity 01 дек 2016, 11:23

Я вам буду очень признателен, если вы мне скажете как из неё выйти потом . ^:)^
Дак как выходить? Айди меняется и меняется, а выйти не могу.
Синтаксис:
Используется csharp
ApplicationQuit();//что ли?
Give exact coordinates of the decision of the problems
Аватара пользователя
юnity
UNITрон
 
Сообщения: 290
Зарегистрирован: 21 июл 2015, 18:30

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение jimmm 01 дек 2016, 17:18

ikhtd писал(а):на событии OnLeftRoom() уходящий игрок, как параметр передет только объект, на котором необходимо поменять id и передает его только одному игроку(PhotonTargets.Server), например мастерклиенту.(но вреале будет передаваться лист объектов а не один объект). то есть этот объект помещается в переменную на нашем мастерклиенте. далее он с этого скрипта который на нем, обращается к этому объекту (go.SendMessage "SpawnMyPlayerEverywhere") , и инициирует выполнение вот этого скрипта уже на самом объекте
Синтаксис:
Используется csharp
void SpawnMyPlayerEverywhere()
{        
    //Manually allocate PhotonViewID
    PhotonViewID id1 = PhotonNetwork.AllocateViewID();
    photonView.RPC("SpawnOnNetwork", PhotonTargets.AllBuffered, transform.position,
        transform.rotation, id,);
}

[PunRPC]
void SpawnOnNetwork(Vector3 pos, Quaternion rot, PhotonViewID id1)
{
 
    //Set the PhotonView
    PhotonView[] nViews = go.GetComponent<PhotonView>();
    nViews[0].viewID = id1;
}


//в результате этот объект будет принадлежать уже другому игроку и не удалиться
 


то есть этот скрипт висит на том объекте который мы хотим сохранить в сцене. соответственно он находится и на всех объектах , который наинстансил наш уходящий игрок. суть в том, чтобы к этим объектам обратился мастерклиент, перед тем как тот игрок вышел. и главное успеть выполнить эту команду перед тем как объекты делитнуться
онлефт рум- да дерьмовое событие - на нем ниче не успеет сработать


То есть по идее можно поменять мастера у объекта во время игры?
jimmm
UNIверсал
 
Сообщения: 417
Зарегистрирован: 23 янв 2013, 22:57

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение jimmm 01 дек 2016, 17:19

юnity писал(а):Я вам буду очень признателен, если вы мне скажете как из неё выйти потом . ^:)^
Дак как выходить? Айди меняется и меняется, а выйти не могу.
Синтаксис:
Используется csharp
ApplicationQuit();//что ли?

Вы вызываете две функции, скачала передаете, права на photonView инфу об ади, а потом уже тот кто станет мастером вызывает у себя фунцкцию присваивания новых айди,
photonView.RPC("newId", PhotonTargets.allViaServer, id);



If(photonNetwork.isMasterClient){
photonView.RPC("SpawnOnNetwork", PhotonTargets.allViaServer, id);
}
LeveRoom(); // а после выходить.

Насколько я понял.
Я еще добавлял таймер на выход, что выход происходил позже на пару сек, что команда успела проскочить, но это я переустанавливал таймер на конец сессии у других игроков, если мастер выйдет
jimmm
UNIверсал
 
Сообщения: 417
Зарегистрирован: 23 янв 2013, 22:57

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение юnity 01 дек 2016, 19:30

Да у меня не успевает перехватить viewшки, так удаляется нужный игрок, нужный остаётся. Всё делал как сказали. Юзаю LeaveRoom давно уже.
варнинги
PhotonNetwork.room is null. You don't have to call LeaveRoom() when you're not in one. State: ConnectingToMasterserver
UnityEngine.Debug:LogWarning(Object)
PhotonNetwork:LeaveRoom() (at Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonNetwork.cs:2184)
<TimerLeave>c__Iterator9:MoveNext() (at Assets/Scripts/Spherre.cs:57)

с помощью WaitForSeconds делаю задержку на 1 сек
Give exact coordinates of the decision of the problems
Аватара пользователя
юnity
UNITрон
 
Сообщения: 290
Зарегистрирован: 21 июл 2015, 18:30

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение Aleksey 13 мар 2017, 13:44

юnity писал(а):А по теме вопрос можно? А если всем клиентам компоненты PhotonView объектов сцены собрать в массив, обращаться к ним можно будет после смены мастерклайнта?

Ну вот например у нас есть боты (объекты сцены)
на геймобджекте бота префабе прописываем следующие -
Синтаксис:
Используется csharp
  void OnPhotonInstantiate(PhotonMessageInfo info)
    {
        EnemyManager.bots.Add(transform);
    }

Потом на объекте сцены прописываем такую функцию еще.Удаляем через rpc.allbufered
Синтаксис:
Используется csharp
    [PunRPC]
    void del()
    {
        EnemyManager.bots.Remove(transform);
        if (PhotonNetwork.isMasterClient)
            PhotonNetwork.Destroy(gameObject);
    }
 


Вот тебе к примеру массив объектов сцены без файндов по фотонвиев. Файндить по фотонвиев нежелательно. Т.к. у тебя фотонвиев может быть не только на объектах сцены но и на фотон инстантиэйте(игроки) и порождаемые им объекты с помощью инстансов от фотона. Файндить лучше по нэймам типа скриптов объектов сцены если уж так надо.

Переключение мастер клиента не влияет на потерю структуры данных из массива объектов сцены в методе в котором я тебе предложил.

jimmm писал(а):а как это можно сделать примерно, не подскажете?
то есть если я уже знаю объект, как отправить команду у нового мастера? AllBufferedViaServer, я так понимаю?
как на другом устройстве инициировать скрипт смены id?

AllBufferedViaServer это вообще про другое.
оллвиасервер и оллвиабуфередсервер означает то что функции рпц всем будут рассылаться всегда в строгой определенной последовательности.
пример - если рпц олл функцию мастер клиентом рассылаем четверым игрокам то может быть так - сначала получил функцию второй игрок потом чевертый ,1 ,3 . Или может быть другая последовательность получения стека вызовов в комнате например 3,4,2,1 . А вот в рпц олл виа сервер последовательность получения всегда одинаковая.Правда Такой вариант рассылки методов немного медленней чем обычный рпц олл .

unity писал(а):Вот с ткаой ошибкой как бороться? Я пытаюсь отослать RPC в событии OnLeftRoom().Cannot send messages when not connected. Either connect to Photon OR use offline mode! Так то id пересылаются другому клиенту, при нажатии на кнопку в апдейте, но когда их отправить лучше что бы мастерклайнт вышел, успев отослать? Вот такая функция

Это адовый костыль) Это неправильная практика сетевого программирования) - отправлять сетевые данные во время выхода из комнаты.Всегда держи в голове что любые данные которые мы передаем по сети могут быть не быстрей секунды, а дольше секунды.Нету точных цифр.Нету стабильности.Логично что ты иногда можешь тупо не успеть разослать рпц всем до своего выхода из комнаты.Даже если ты сначала отправляешь сетевые данные и потом идет строчка фотоннетворклеаверум ты все равно можешь не успеть отослать их всем кому надо(например тому у кого в этой точке скакнул пинг с 60 до 150-200 а если еще и у нескольких скакнул то еще дольше рассылаешь рпц ).
Сначала отправляешь. Узнаешь что получил тот кому отправил и только потом выходишь(это в идеале). Но это так себе байда(крупно толсто получается). Для таких целей стабильней использовать лучше вот это OnPhotonPlayerDisconnected(PhotonPlayer otherPlayer) { ... } этот кулбек вызывается всем кроме того кто выходит. Выходит otherPlayer. Грубо говоря это и есть нечто похожее - "отправляю рпц всем когда я выхожу")).

Важно поймите следующие что в фотонкладуде работать с айди это плохой тон.Особенно там что то переприсваивать в айди постоянно. Это как бы не нужно.У фотон клауда высокая абстракция с айдишками. По поводу смены владельца фотонвиева есть спец. метод - https://doc.photonengine.com/en-us/pun/ ... p-transfer.
Продукты на тему онлайна в Ассет Сторе
_https://www.assetstore.unity3d.com/en/# ... sher:21589
Аватара пользователя
Aleksey
UNIт
 
Сообщения: 56
Зарегистрирован: 17 фев 2015, 16:09

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение юnity 14 мар 2017, 18:54

Алексей, с этого места можно поподробнее. Я разбирался с Методами TransferOwnership() и OnOwnershipRequest(), как это работает не нашёл ни в одной теме в интернете, а так как я в Английском почти полый ноль. Прошу вас по русски объяснить.
Вот у меня есть бот. Я вешаю на него скрипт
Синтаксис:
Используется csharp
public void OnOwnershipRequest(object[] viewAndPlayer)
{
    PhotonView view = viewAndPlayer[0] as PhotonView;
    PhotonPlayer requestingPlayer = viewAndPlayer[1] as PhotonPlayer;
 
    Debug.Log("OnOwnershipRequest(): Player " + requestingPlayer + " requests ownership of: " + view + ".");
    if (this.TransferOwnershipOnRequest)
    {
        view.TransferOwnership(requestingPlayer.ID);//значит ли этот скрипт то , что я могу поменять объекту владельца?
    }
}

В другом объекте я хочу выполнить команду
Синтаксис:
Используется csharp
OnOwnershipRequest()

и тот бот на котором висит верхний скрипт, получает viewID этого объекта ?
Как это используется?
Give exact coordinates of the decision of the problems
Аватара пользователя
юnity
UNITрон
 
Сообщения: 290
Зарегистрирован: 21 июл 2015, 18:30

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение Aleksey 14 мар 2017, 19:41

Алексей, с этого места можно поподробнее. Я разбирался с Методами TransferOwnership() и OnOwnershipRequest(), как это работает не нашёл ни в одной теме в интернете, а так как я в Английском почти полый ноль. Прошу вас по русски объяснить.

https://doc.photonengine.com/en-us/pun/ ... p-transfer
эту демку в бесплатном паке фотонклауда в асет сторе разбирал? и ничего не понял?

по поводу ботов. А для какой конкретно цели тебе надо менять владельца объекта сцены? чтобы им управлял не мастер клиент, а другой игрок. Это для чего тебе нужно?
Продукты на тему онлайна в Ассет Сторе
_https://www.assetstore.unity3d.com/en/# ... sher:21589
Аватара пользователя
Aleksey
UNIт
 
Сообщения: 56
Зарегистрирован: 17 фев 2015, 16:09

Re: Как оставить объекты которые инстантились photon cloud?

Сообщение юnity 14 мар 2017, 21:01

Всё, вопрос снимается.
Give exact coordinates of the decision of the problems
Аватара пользователя
юnity
UNITрон
 
Сообщения: 290
Зарегистрирован: 21 июл 2015, 18:30

Пред.

Вернуться в Photon

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

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