Перепробовал уже кучу скриптов приседания с разным подходом, но везде одна и та же проблема: когда перс встаёт (т.е. его коллайдер увеличивается), то сразу проваливается в пол ... Как устранить эту проблему ? Вот последний вариант скрипта
Код
var controller : CharacterController;
private var newPos;
private var newHeight: float;
private var check : boolean = false;
function Update () {
newPos = new Vector3(transform.position.x, transform.position.y + 0.6f, transform.position.z);
if (controller.isGrounded && Input.GetKey(KeyCode.LeftControl)) { if (check == false) crouchOn (); if (check == true && Input.GetKey(KeyCode.LeftControl)) crouchOff (); } }
Решил вопрос с провалом в пол, теперь осталось только выяснить как пускать луч вверх определённой длинны (знаю только как прямо) и выложу нормальный скрипт.
Сообщение отредактировал dostalition - Сб, 04 Янв 2014, 19:14
Благодарю Всем за ответы ! В числе прочего, а может и основной причиной проблем со скриптом приседания было то, что высоту поднятия для моего СС нужно было выставить не в 0,01F и даже не в 2, а аж в 7 ! Кстати , что заначит F в 0,01F ? Флоат переменную ? В итоге сообразил вот это
Код
var controller : CharacterController; var Height_Stoia; var Height_sidia: float = 0.5; var newPos; var SIDIT : boolean = false; var potolok = false; var n : float = 7; var n2 : float = 4;
transform.position = new Vector3(transform.position.x, transform.position.y + n, transform.position.z); controller.height = Height_Stoia; SIDIT = false; potolok = false; } }
Провалов не замечено, учитывается потолок и перс автоматически встаёт, если отжата клавиша и позволяет высота потолка ... Но есть один недостаток: перс встаёт очень резко (прямо выстреливает) и, видимо, в данном случает, это не исправить медленной сменой положения СС по Y , т.к. это должно происходить одновременно с увеличением высоты коллайдера, чтобы не было провала в пол ... Подскажите как это исправить ...
Сообщение отредактировал dostalition - Сб, 04 Янв 2014, 22:40
Попробовал заменить значение высоты поднятия коллайдера "var n : float = 7;" на "var n = Time.deltaTime * 7;" и это выдаёт такие ошибки : "ArgumentException: get_deltaTime can only be called from the main thread. Constructors and field initializers will be executed from the loading thread when loading a scene. Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function. prisedanie..ctor () (at Assets/_SCRIPTI/_IGROK/prisedanie.js:8)" и "get_deltaTime can only be called from the main thread. Constructors and field initializers will be executed from the loading thread when loading a scene. Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function." Если объявляю эту переменную в Старте, то появляется другая ошибка, а если в Апдейте - то вообще не срабатывает ...
Сообщение отредактировал dostalition - Вс, 05 Янв 2014, 19:30
Вы бы еще не в одну строку рассчитывали этот n. Нельзя вне функций что-то считать. Более того deltaTime по Вашему вообще что?- это время с последнего кадра. Какие вообще кадры в основном теле скрипта? 1. Почему Height_Stoia считается из высоты контроллера, а Height_sidia - нет? А если у Вас Height_Stoia = 1000? Представляете - была высота 1000, стала 0.5! Из великана - в лилипуты просто приседанием! 2. Аналогичный вопрос о переменной n2. Если высота контроллера 1000? А Вы проверяете потолок на высоте 4 - перс гарантированно пробъет потолок головой. 3. Зачем нужна переменная potolok и последний if?
Объясните вразумительно - почему Вы не хотите пользоваться чужими разработками? Вам на юнити.ру дали скрипт, который плавно опускает/поднимает персонажа. Почему Вы не хотите попробовать его?
Вам на юнити.ру дали скрипт, который плавно опускает/поднимает персонажа. Почему Вы не хотите попробовать его?
Потому , что он не работает , как надо ... Значения переменных подбирал по конкретной сцене с конкретным контроллером, может это и не лучших способ, но всё работает нормально ! Вопрос лишь в том, как сделать плавный подъём ... Я так понимаю, что нужно лишь плавно сместить высоту и плавно вернуть коллайдер в значение стоя, вроде и строчка правильная (смотрел в справке), но не пойму куда её прилепить ... А переменную потолок и н2 сделал потому , что перс не вставал автоматически при выходе из под низкого потолка, если контрол был уже отжат до того ....
Добавлено (05 Янв 2014, 20:42) --------------------------------------------- По поводу первого вопроса ... Теперь написал так
1. Почему Height_Stoia считается из высоты контроллера, а Height_sidia - нет? А если у Вас Height_Stoia = 1000? Представляете - была высота 1000, стала 0.5! Из великана - в лилипуты просто приседанием!
Сообщение отредактировал dostalition - Вс, 05 Янв 2014, 20:35
Именно. Я бы вообще все подобные переменные считал из размеров самого контроллера. Не увидел реакции по поводу переменной n. Вы поняли, что НЕЛЬЗЯ использовать deltaTime не в функциях? Желательно использовать ее в функциях, вызываемых каждый кадр, иначе теряется ее смысл. Вообще вне функций все расчеты - только с константами.
Цитата
Потому , что он не работает , как надо ...
Ну так проще же готовый скрипт немного под себя перестроить, чтобы работал как надо, чем писать все самому с нуля.
Ну так проще же готовый скрипт немного под себя перестроить, чтобы работал как надо, чем писать все самому с нуля.
Вот Я и взял один из "готовых" скриптов и переработал его так, чтобы он работал как надо, но осталась только загвоздка с плавностью подъёма ... Сейчас попробую разобраться с тем, что Левша подкинул
Он Вам подкинул тоже самое, что подкинули на форуме юнити.ру Левша: controller.height = Mathf.Lerp(controller.height, 1f, Time.deltaTime); Skript47 controller.height = Mathf.Lerp(controller.height, Height.x, Time.deltaTime * Height.z); // Двигать высоту коллайдера до 4 со скоростью 8
В итоге, плавно приседает и встаёт , но иногда, проваливается, если часто клацать контрол , потому, что не понял как сделать через анимацию подъем (чтобы коллайдер не опускался ниже пола при увеличении) не в определённую точку, а через y + n (текущая высота + число), а без подъёма, видимо, не обойтись. Подскажите, кто в курсе, есть ли возможность сделать его через анимацию или как прилепить кодом. Ни в одном из предложенных скриптов этого не нашел ... P.S. Мать их Лерпы уже вынесли мозг ! Ну не могу в них разобраться и всё ... В тех примерх всё хорошо, но относительно моего скрипта - трындец и всё ... Помогите, погибаю ...
Сообщение отредактировал dostalition - Вт, 07 Янв 2014, 01:51