Лаги 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!
|
|
| |
|