Синхронизация спавна дочерних обьектов(Mirror)

Общие вопросы о Unity3D

Синхронизация спавна дочерних обьектов(Mirror)

Сообщение starleken 05 янв 2023, 18:01

Пытаюсь создать оружие из префаба и сделать его дочерним обьектом персонажа при создании самого персонажа.
Когда смотрю от сцены сервера, то всё верно создаётся и каждый персонаж бегает с оружием, но от лица игроков каждый новый игрок не видит оружие прошлых. Оно есть на сцене, но
висит просто в воздухе на нулевых координатах. Перепробовал множество способов
Вот код класса, в котором происходит создание оружия
Синтаксис:
Используется csharp
public class PlayerShooter : NetworkBehaviour
{
    [SerializeField] private GameObject _weaponPrefab;
    [SerializeField] private Transform _place;
   
    private Weapon weapon;

    [Command(requiresAuthority = false)]
    public void Init()
    {
        CmdCreateWeapon();
    }

    [Server]
    private void CmdCreateWeapon()
    {
        GameObject weaponObject = Instantiate(_weaponPrefab);
        NetworkServer.Spawn(weaponObject);
       
        SetWeaponAtPosition(weaponObject);

        RpcCreateWeapon(weaponObject);
    }

    [ClientRpc]
    private void RpcCreateWeapon(GameObject weaponObject)
    {
        SetWeaponAtPosition(weaponObject);

        weapon = weaponObject.GetComponent<Weapon>();
    }

    private void SetWeaponAtPosition(GameObject weaponObject)
    {
        weaponObject.transform.parent = _place.transform;
        weaponObject.transform.position = _place.transform.position;
        weaponObject.transform.rotation = _place.transform.rotation;
    }

    private void Update()
    {
        if (isLocalPlayer == false)
            return;

        if (Input.GetMouseButtonDown(0))
        {
            weapon.Shoot();
        }
    }
 
starleken
UNец
 
Сообщения: 2
Зарегистрирован: 05 янв 2023, 17:44

Re: Синхронизация спавна дочерних обьектов(Mirror)

Сообщение Alkos26Rus 05 янв 2023, 20:30

В Mirror что можно вот так просто передать объект, на клиентах что ошибок нет ?
Синтаксис:
Используется csharp
[ClientRpc]
    private void RpcCreateWeapon(GameObject weaponObject)


Сомневаюсь я что то, скорей всего нужно передать id а на клиенте найти объект по id
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Синхронизация спавна дочерних обьектов(Mirror)

Сообщение seaman 06 янв 2023, 01:28

С Миррор не работал, но по логике.
Вы устанавливаете позицию только у только что созданного объекта. Объекты других до того вошедших игроков, конечно, создаются. Но их положение на новом клиенте не устанавливается.
- Либо надо на новом клиенте пробегать все соединения и устанавливать положение всех уже существующих.
- Либо как-то использовать внутренние возможности фреймворка для верной синхронизации трансформов. Наверное должно быть что-то типа
[SyncObj]
public readonly SyncDictionary<int, PlayerData> players = new SyncDictionary<int, PlayerData>();
Ну и при изменении players устанавливать позицию игрока.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Синхронизация спавна дочерних обьектов(Mirror)

Сообщение starleken 06 янв 2023, 09:57

Alkos26Rus писал(а):В Mirror что можно вот так просто передать объект, на клиентах что ошибок нет ?
Синтаксис:
Используется csharp
[ClientRpc]
    private void RpcCreateWeapon(GameObject weaponObject)


Сомневаюсь я что то, скорей всего нужно передать id а на клиенте найти объект по id


Можно, если на обьекте висит сетевой компонент и заспавнены сервером(вторая строчка метода)
starleken
UNец
 
Сообщения: 2
Зарегистрирован: 05 янв 2023, 17:44

Re: Синхронизация спавна дочерних обьектов(Mirror)

Сообщение Alkos26Rus 06 янв 2023, 17:36

starleken писал(а):Можно, если на обьекте висит сетевой компонент и заспавнены сервером(вторая строчка метода)

Продебаж этот метод на клиенте, либо он не вызывается, либо будет ошибка нулреференс, что скорей всего как по мне
Синтаксис:
Используется csharp
    private void SetWeaponAtPosition(GameObject weaponObject)
    {
        weaponObject.transform.parent = _place.transform;
        weaponObject.transform.position = _place.transform.position;
        weaponObject.transform.rotation = _place.transform.rotation;
    }
 
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 17