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

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

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

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

СообщениеДобавлено: 04 янв 2016, 17:57
~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

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

СообщениеДобавлено: 04 янв 2016, 19:06
valera0141
~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

Блин, тогда косяк. А как то можно это обойти? А то скрипт оружия весит на сомом оружии, а не на игроке. И с худом будут проблемы, если это не решить.

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

СообщениеДобавлено: 05 янв 2016, 00:39
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);

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

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

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

Добавлю: команды с таких объектов может отправлять только хост. Из-за этого ошибка скорее всего.

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

СообщениеДобавлено: 15 фев 2016, 15:42
igor_ch
Привет всем, подскажите кто разобрался с 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);
            }
 


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

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

СообщениеДобавлено: 05 июл 2016, 12:37
Elledan
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);



а поделиться можешь, как решил? тема старая, наверняка решение уже нашлось

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

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

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

СообщениеДобавлено: 10 июл 2018, 20:14
hottabych
igor_ch писал(а):Привет всем, подскажите кто разобрался с UNET

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

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

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

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


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