Пятница, 29 Марта 2024, 09:59

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Лаги NetworkManager Unet
Лаги NetworkManager Unet
FediДата: Вторник, 27 Сентября 2016, 13:30 | Сообщение # 1
был не раз
Сейчас нет на сайте
Проблема
Скрипт интерполяции:
Код
public class PlayerSync : NetworkBehaviour {

    [SyncVar]
    private Vector3 syncPos;

    [SerializeField] Transform myTransform;
    [SerializeField] float lerpRate = 20;

    private Vector3 lastpos;
    private float threshold = 0.5f;


    void Update(){
    
        LerpPos ();
    
    }

    void FixedUpdate(){
    
        TransmitPos ();


    }


    void LerpPos(){


        if (!isLocalPlayer) {
            myTransform.position = Vector3.Lerp (myTransform.position, syncPos, Time.deltaTime + lerpRate);

        }
    }
    

    [Command]

    void CmdSync(Vector3 pos){
    
        syncPos = pos;


    }


    [ClientCallback]
    void TransmitPos(){
    
        if (isLocalPlayer && Vector3.Distance(myTransform.position,lastpos) < threshold) {
            CmdSync (myTransform.position);
            lastpos = myTransform.position;

        }
    }

}


Избиватель лохов, поедатель пирогов, новатор, бровиподниматор, и народный чемпион The Rock!
LertmindДата: Вторник, 27 Сентября 2016, 18:54 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Я не разбираюсь в Unet, но у тебя есть ошибка в этой строчке:
Код
myTransform.position = Vector3.Lerp (myTransform.position, syncPos, Time.deltaTime + lerpRate);
при условии, что в lerpRate значения больше 1, в результате всегда будет возвращаться syncPos.

Это условие будет выполняться постоянно:
Код
Vector3.Distance(myTransform.position,lastpos) < threshold
потому что myTransform.position будет уходить на маленькое расстояние, а если выйдет на большое, то условие вообще не будет работать.

Внимательно почитай ответ и код от lukas8 здесь https://community.unity.com/t5....2531451. Хотя у него в Lerp используется число с потолка - 0.1, так что наверно стоит использовать логику похожую здесь http://stackoverflow.com/questio....eobject, только не запутаться в deltaTime и fixedDeltaTime.

Твоё видео, судя по курсору, тоже тормозит.


Сообщение отредактировал Lertmind - Вторник, 27 Сентября 2016, 18:59
FediДата: Среда, 28 Сентября 2016, 13:45 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата Lertmind ()
Я не разбираюсь в Unet, но у тебя есть ошибка в этой строчке:
Код
myTransform.position = Vector3.Lerp (myTransform.position, syncPos, Time.deltaTime + lerpRate);
при условии, что в lerpRate значения больше 1, в результате всегда будет возвращаться syncPos.

Это условие будет выполняться постоянно:
Код
Vector3.Distance(myTransform.position,lastpos) < threshold
потому что myTransform.position будет уходить на маленькое расстояние, а если выйдет на большое, то условие вообще не будет работать.

Внимательно почитай ответ и код от lukas8 здесь https://community.unity.com/t5....2531451. Хотя у него в Lerp используется число с потолка - 0.1, так что наверно стоит использовать логику похожую здесь http://stackoverflow.com/questio....eobject, только не запутаться в deltaTime и fixedDeltaTime.

Твоё видео, судя по курсору, тоже тормозит.


Спасибо большое!
Если кому надо то вот код
Код
myTransform.position = Vector3.Lerp (myTransform.position, syncPos,0.1f);

Узнал что Lerp от 0f до 1f работает как интерполяция А свыше 1f как экстраполяция.


Избиватель лохов, поедатель пирогов, новатор, бровиподниматор, и народный чемпион The Rock!
robertonoДата: Среда, 28 Сентября 2016, 14:00 | Сообщение # 4
Чокнутый Кот
Сейчас нет на сайте
Цитата Fedi ()
как экстраполяция.

Разве ? Функция Lerp перед самой интерполяцией делает Math.Clamp01 - никакой экстраполяции тут быть не может.
Самое простое, если представить эту переменную как "процент между A и B".
FediДата: Среда, 28 Сентября 2016, 18:07 | Сообщение # 5
был не раз
Сейчас нет на сайте
Цитата robertono ()
Разве ? Функция Lerp перед самой интерполяцией делает Math.Clamp01 - никакой экстраполяции тут быть не может.
Самое простое, если представить эту переменную как "процент между A и B".

Не знаю в другом форуме мне так сказали

Добавлено (28 сентября 2016, 18:07)
---------------------------------------------
Ещё одни вопрос, возможен ли соединение комп-телефон не изменяя код?


Избиватель лохов, поедатель пирогов, новатор, бровиподниматор, и народный чемпион The Rock!
robertonoДата: Среда, 28 Сентября 2016, 18:11 | Сообщение # 6
Чокнутый Кот
Сейчас нет на сайте
Fedi, практически да. Возможно что то подправить придется, всё же. Настройки подключения, в частности. Но может и текущие сработают. Пробуйте)
FediДата: Среда, 28 Сентября 2016, 18:19 | Сообщение # 7
был не раз
Сейчас нет на сайте
robertono, Сделал управление под телефон запустил когда захожу машины к 0,0,0 притягиваются. Вроде ничего не изменял...
Код
public class PlayerSync : NetworkBehaviour {

    [SyncVar]
    private Vector3 syncPos;

    [SerializeField] Transform myTransform;

    private Vector3 lastpos;
    private float threshold = 0.5f;

    void Update(){

  LerpPos ();

    }

    void FixedUpdate(){

  TransmitPos ();

    }

    void LerpPos(){

  if (!isLocalPlayer) {
   myTransform.position = Vector3.Lerp (myTransform.position, syncPos, 0.1f);

  }
    }

    [Command]

    void CmdSync(Vector3 pos){

  syncPos = pos;

    }

    [ClientCallback]
    void TransmitPos(){

  if (isLocalPlayer && Vector3.Distance(myTransform.position,lastpos) < threshold) {
   CmdSync (myTransform.position);
   lastpos = myTransform.position;

  }
    }

}


Избиватель лохов, поедатель пирогов, новатор, бровиподниматор, и народный чемпион The Rock!

Сообщение отредактировал Fedi - Среда, 28 Сентября 2016, 18:56
LertmindДата: Среда, 28 Сентября 2016, 21:01 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
Цитата Fedi ()
Не знаю в другом форуме мне так сказали
При чём здесь форум, открываем документацию Vector3.Lerp:
Interpolates between the vectors a and b by the interpolant t. The parameter t is clamped to the range [0, 1].
Если нужна экстраполяция используй Vector3.LerpUnclamped.

Добавлено (28 сентября 2016, 21:01)
---------------------------------------------
Кстати, попробуй убрать условие "&& Vector3.Distance(myTransform.position,lastpos) < threshold".

FediДата: Четверг, 29 Сентября 2016, 16:15 | Сообщение # 9
был не раз
Сейчас нет на сайте
Lertmind, Всё работает!Спасибо большое!

Избиватель лохов, поедатель пирогов, новатор, бровиподниматор, и народный чемпион The Rock!
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Лаги NetworkManager Unet
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг