@Senture

Как синхронизировать GameObject(пулю) в мультиплеере на Unity?

Здравствуйте, подскажите пожалуйста как синхронизировать пулю со всеми подключенными клиентами? В мультиплеерном шутере на Unity (использую UnityNetwork). может есть у кого примерчик?
  • Вопрос задан
  • 379 просмотров
Решения вопроса 1
GavriKos
@GavriKos Куратор тега Unity
Может еще листики на кустах будете синхронизировать? Для синхронизации пули достаточно передать всем клиентам: время вылета, координаты вылета, направление. А дальше хай сами рисуют
А вообще - никто обычно пули не визуализирует моделями. Сильно дорого.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Griboks
@Griboks Куратор тега Unity
Прочитайте оф. туториал по сетевой игре.
Ответ написан
@Senture Автор вопроса
Реализовал вот так:
spoiler
[SyncVar] Vector3 syncBulletStartPosition;
    [SyncVar] Quaternion syncBulletStartRotation;
    [SyncVar] bool syncTrueFire;

    /// <summary>
    /// Метод для осуществления стрельбы
    /// </summary>
    private void Update()
    {
        if(isLocalPlayer)
        {
            if (Input.GetButton("Fire1"))
            {
                //CmdShoot();

                int weapon = 0;
                // Create the Bullet from the Bullet Prefab
                GameObject bullet = (GameObject)Instantiate(
                    bulletPref[weapon],
                    bulletPivot[weapon].position,
                    bulletPivot[weapon].rotation);


                CmdSendBullet(bulletPivot[weapon].position, bulletPivot[weapon].rotation);
            }
        }
    }

    [Command]
    void CmdSendBullet(Vector3 startPosition, Quaternion startRotation)
    {
        syncBulletStartPosition = startPosition;
        syncBulletStartRotation = startRotation;
        syncTrueFire = true;
    }

    /// <summary>
    /// Вызов всех еобходимых методов для смены и синхронизации оружия
    /// </summary>
    void FixedUpdate()
    {
        SpawnBulletToAllClients();
    }

    void SpawnBulletToAllClients()
    {
        if (!isLocalPlayer)
        {
            if (syncTrueFire == true)
            {
                int weapon = 0;

                GameObject bullet = (GameObject)Instantiate(
                    bulletPref[weapon],
                    bulletPivot[weapon].position,
                    bulletPivot[weapon].rotation);

                CmdSyncTrueFire();
                syncTrueFire = false;
            }
        }
    }

    [Command]
    void CmdSyncTrueFire()
    {
        syncTrueFire = false;
    }



P.S. Спасибо большое всем, отдельное спасибо GavriKos
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы