Unet. Проблема с Local Player Authorit, нужна помощь.

Сеть в Unity3D

Unet. Проблема с Local Player Authorit, нужна помощь.

Сообщение valera0141 04 янв 2016, 13:08

Привет. Не могу решить одну проблему. НА игроке висит NetworkIdentity, стоит галочка Local Player Authorit, в скриптах работает условие if (isLocalPlayer). Если повесить скрипт на дочерний объект игрока, то уже не работает. Проверил дебаг логом, получается что на игроке определяет, что я это я и выполняет это условие (ну или как тома сказать), а на дочерних объектах не определяет, что это я.
valera0141
UNец
 
Сообщения: 27
Зарегистрирован: 04 май 2014, 21:14

Re: Unet. Проблема с Local Player Authorit, нужна помощь.

Сообщение ~AvA~ 04 янв 2016, 17:57

Привет, это походу ограничение
Manual
Constraints
[*]A NetworkIdentity must be on the root game object of a spawnable prefab
[*]NetworkBehaviour scripts must be on the same game object as the NetworkIdentity, not on child game objects
Аватара пользователя
~AvA~
UNIверсал
 
Сообщения: 396
Зарегистрирован: 17 фев 2015, 13:09

Re: Unet. Проблема с Local Player Authorit, нужна помощь.

Сообщение valera0141 04 янв 2016, 19:06

~AvA~ писал(а):Привет, это походу ограничение
Manual
Constraints
[*]A NetworkIdentity must be on the root game object of a spawnable prefab
[*]NetworkBehaviour scripts must be on the same game object as the NetworkIdentity, not on child game objects

Блин, тогда косяк. А как то можно это обойти? А то скрипт оружия весит на сомом оружии, а не на игроке. И с худом будут проблемы, если это не решить.
valera0141
UNец
 
Сообщения: 27
Зарегистрирован: 04 май 2014, 21:14

Re: Unet. Проблема с Local Player Authorit, нужна помощь.

Сообщение valera0141 05 янв 2016, 00:39

Нашёл путь решения. Но теперь вот с чем столкнулся, на дочерних объектах скрипт не может послать команду на серв, в лог выводит:
Trying to send command for object without authority.
UnityEngine.Networking.NetworkBehaviour:SendCommandInternal(NetworkWriter, Int32, String)
PlayerSyncPos:CallCmdPlayerSync(Vector3, Single, Single)
PlayerSyncPos:FixedUpdate() (at Assets/Scripts/Player/PlayerSyncPos.cs:20)

20 строка в коде: CmdPlayerSync(transform.position, transform.localEulerAngles.y, cameraGO.transform.localEulerAngles.x);
valera0141
UNец
 
Сообщения: 27
Зарегистрирован: 04 май 2014, 21:14

Re: Unet. Проблема с Local Player Authorit, нужна помощь.

Сообщение zomgzufall 06 янв 2016, 09:06

Такие дела: локал плеер будет только на основном первом ГО, но можно это слегка обойти и проверять на hasAuthority а не localPlayer. Но нужно спавнить объекты(оружие, юниты - не суть), только с основного префаба.
При этом если ты таким способом заспавнишь оружие, то скрипт который будет на оружии уже не сможет создавать пули даже hasAuthority, а не то что localPlayer.
Схема такая:
1. Первый префаб - hasAuthority+localPlayer (cmd могут отправлять все)
2. Созданный объект во время игры - hasAuthority (cmd может отправить только хост)
3. Созданный объект из ранее созданного объекта - ни то, ни то

Могу ошибаться. Если что поправьте.

Добавлю: команды с таких объектов может отправлять только хост. Из-за этого ошибка скорее всего.
zomgzufall
UNец
 
Сообщения: 47
Зарегистрирован: 19 июл 2013, 09:49

Re: Unet. Проблема с Local Player Authorit, нужна помощь.

Сообщение igor_ch 15 фев 2016, 15:42

Привет всем, подскажите кто разобрался с UNET

Есть персонаж CharacterController - тот самый player.
Есть самолет AirplanceController, изначально на сцене или созданный с помощью NetworkServer.Spawn()

Его каждый игрок должен уметь брать покататься.
Так вот как правильно это делать ?

я делаю так
CharacterController
Синтаксис:
Используется csharp
                    if (Input.GetKeyDown(KeyCode.R) && airplane)
                    {
                        airplane.GetComponent<AirplaneController>().SetAuthority();
                        gameObject.SetActive(false);
                    }
 




AirplaneController

Синтаксис:
Используется csharp
                public void SetAuthority()
                {
                        Debug.Log("On Airplane called SetAuthority");
                        CmdSetAuthority ();
                }

                [Command]
                public void CmdSetAuthority()
            {
                        Debug.Log("On Airplane called Command CmdSetAuthority");
                        //GetComponent<NetworkIdentity>().AssignClientAuthority(GetComponent<NetworkIdentity>().connectionToClient);
            }
 


команда даже не вызывается, так как ее можно вызывать только с хоста.
как быть ?
igor_ch
UNец
 
Сообщения: 1
Зарегистрирован: 15 фев 2016, 14:10

Re: Unet. Проблема с Local Player Authorit, нужна помощь.

Сообщение Elledan 05 июл 2016, 12:37

valera0141 писал(а):Нашёл путь решения. Но теперь вот с чем столкнулся, на дочерних объектах скрипт не может послать команду на серв, в лог выводит:
Trying to send command for object without authority.
UnityEngine.Networking.NetworkBehaviour:SendCommandInternal(NetworkWriter, Int32, String)
PlayerSyncPos:CallCmdPlayerSync(Vector3, Single, Single)
PlayerSyncPos:FixedUpdate() (at Assets/Scripts/Player/PlayerSyncPos.cs:20)

20 строка в коде: CmdPlayerSync(transform.position, transform.localEulerAngles.y, cameraGO.transform.localEulerAngles.x);



а поделиться можешь, как решил? тема старая, наверняка решение уже нашлось
Elledan
UNец
 
Сообщения: 35
Зарегистрирован: 05 июн 2013, 08:54

Re: Unet. Проблема с Local Player Authorit, нужна помощь.

Сообщение indimions 24 авг 2016, 22:29

решение простое, в документации написано, что дочерние обьекты не могут иметь компонент networkIdentify поэтому спавнить можно только основным геймобьектом, т.е. если вам надо пули что бы стреляли с оружия то спавнить эти пули будет плеер и уже координаты спавна подставлять оружия...
indimions
UNец
 
Сообщения: 3
Зарегистрирован: 24 авг 2016, 22:15

Re: Unet. Проблема с Local Player Authorit, нужна помощь.

Сообщение hottabych 10 июл 2018, 20:14

igor_ch писал(а):Привет всем, подскажите кто разобрался с UNET

Есть персонаж CharacterController - тот самый player.
Есть самолет AirplanceController, изначально на сцене или созданный с помощью NetworkServer.Spawn()

Его каждый игрок должен уметь брать покататься.
Так вот как правильно это делать ?

я делаю так
...

команда даже не вызывается, так как ее можно вызывать только с хоста.
как быть ?


Привет. Прошло уже два года, но вдруг мой ответ будет полезным.
Первое. В CharacterController обязательно поставь условие if(!isLocalPlayer) return. В противном случае код будет срабатывать на всех игроках, а не только на твоем.
Второе. Чтобы брать самолет покататься, ты должен назначать на него ClientAuthority. Но самолет сам себе не может назначить авторити, т.к. он не может отправлять команды (команду может отправить либо Player, либо объект, на котором уже есть ClientAuthority). Единственный способ обойти это -- сделать скрипт с командой на игроке, а с самолета обращаться к игроку: Player.CmdSetAuthority(this.networkIdentity). Если другой игрок (другой клиент) пытается взять самолет, то снять с предыдущего владельца авторити, и назначить на нового. Надеюсь, понятно объяснил.
hottabych
UNITрон
 
Сообщения: 161
Зарегистрирован: 20 апр 2015, 12:52
Откуда: Тверь


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

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

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