Страница 2 из 2

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

СообщениеДобавлено: 30 ноя 2016, 19:01
jimmm
ю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

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

СообщениеДобавлено: 30 ноя 2016, 22:27
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;
}


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


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

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

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

Так?

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

СообщениеДобавлено: 01 дек 2016, 11:12
ikhtd
я ж сказал послать gameObect

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

//и выходить из комнаты

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

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

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

СообщениеДобавлено: 01 дек 2016, 17:18
jimmm
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;
}


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


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


То есть по идее можно поменять мастера у объекта во время игры?

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

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

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



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

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

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

СообщениеДобавлено: 01 дек 2016, 19:30
юnity
Да у меня не успевает перехватить 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 сек

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

СообщениеДобавлено: 13 мар 2017, 13:44
Aleksey
ю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.

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

СообщениеДобавлено: 14 мар 2017, 18:54
юnity
Алексей, с этого места можно поподробнее. Я разбирался с Методами 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 этого объекта ?
Как это используется?

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

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

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

по поводу ботов. А для какой конкретно цели тебе надо менять владельца объекта сцены? чтобы им управлял не мастер клиент, а другой игрок. Это для чего тебе нужно?

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

СообщениеДобавлено: 14 мар 2017, 21:01
юnity
Всё, вопрос снимается.