Для души, да и настраивать поведение автомобиля легче, когда ты знаешь, как всё работает
Добавлено (04 Февраля 2019, 18:31) --------------------------------------------- Проблема заключалась в том, что Rigidbody.AddForce(...) добавляет силу не сразу, а, скорее всего, по окончанию FixedUpdate. В результате чего сила трения колеса рассчитывалась на основе предыдущих значений, что, соответственно, вызывало дрожание.
Здравствуйте. Недавно я начал писать свою физику автомобиля с нуля в Unity, но столкнулся с одной проблемой и прошу вашей помощи. Дело в том, что, несмотря на то, что я прикладываю четверть силы трения от каждого колеса на автомобиль (0.25 * 4 = 1), силы трения не хватает, чтобы удержать его на месте при углах наклона дороги, отличных от нуля. Видео самой проблемы: RGhost (flv, 1.35mb) Код колеса:
if (Mathf.Approximately(load, 0f) || hit.collider == null) return;
var groundForward = Vector3.ProjectOnPlane(transform.parent.forward, hit.normal).normalized; var groundRight = Vector3.ProjectOnPlane(transform.parent.right, hit.normal).normalized;
var vel = (transform.position - prevPos) / deltaTime; prevPos = transform.position; var groundVel = Vector3.ProjectOnPlane(vel, hit.normal);
// Forward friction var forwardAccel = Vector3.zero;
Rinat1191, кстати, у меня тоже был Lg, а конкретнее P725. Может быть это проблема чисто старых lg?
Добавлено (03 декабря 2016, 20:45) --------------------------------------------- Я крутил практически все настройки в практически всех комбинация и результат был одним и тем же, а конкретно - никаким (в Unity 5, в 4.6 всё работало идеально)
Сообщение отредактировал SkorpyX - Суббота, 03 Декабря 2016, 20:46
У меня была такая же проблема, причём игры, сделанные на Unity 4.x запускаются нормально. Скорее всего разработчики сделали что то с поддержкой старых смартфонов. Проблема решилась покупкой нового смартфона
Barbatos, А вдруг ко мне присоединится ещё один программист в команду и ему в своём скрипте захочется напрямую изменить speed, хотя скрипт также должен учитывать другие модификаторы, такие как текущий уровень усталости и т.д. + сломаннные конечности + вес в рюкзаке и т.д. Я хочу написать модульную систему, чтобы скрипты могли сосуществовать отдельно друг от друга, например для движения могут существовать не только HumanMovement, но и HumanAiMovement, KuritzaMovement (на всякий случай скажу я знаю, что они могут наследоваться от одного интерфейса, но мне интересно узнать как лучше обеспечить само их взаимодействие). Также, например, к любому объекту можно было бы добавить LifeSystem, и если у этого объекта есть Movement, то он начинает учитывать состояние из LifeSystem. Или, например, добавить к объекту компонент HumanAnimator, который получал скорость от HumanMovement или HumanAiMovement в зависимости от того, что есть.
По идее можно создать интерфейс ICharacter, который содержит IMovement movement, IAnimator anim, ILifeSystem lifeSystem и т.д. Допустим мы создали скрипты Human, HumanMovement, HumanAnimator, HumanLifeSystem наследующие данные интерфейсы, тогда если HumanMovement нужно получить значение усталости из HumanLife System и значение веса из HumanInventory, то можно написать в HumanMovement:
Код
CharacterController controller = GetComponent<CharacterController> (); ICharacter character = GetComponent<ICharacter> ();
if (life != null) speed *= life.GetStamina() / life.GetMaxStamina(); // Если нужны ещё такие модификаторы, как сломанная нога, то : (в LifeSystem создаём метод который перемножает массив модификаторов) // speed *= life.GetModifiersCoefficient()
Здравствуйте! Допустим у меня есть персонаж с повешенными на него скриптами HumanMovement, HumanInventory, HumanLifeSystem, HumanAnimator и т.д. Каждый скрипт может обращаться друг к другу, так, например, HumanMovement на основе значения усталости и наложенных эффектов (сломанная нога и т.д.) в HumanLifeSystem рассчитывает скорость бега, или, например, HumanAnimator изменяет анимацию на основе текущего состояния и скорости в HumanMovement. Как мне лучше организовать такое взаимодействие? Может создать скрипт Human со ссылками на остальные компоненты и обращаться как human.movement.GetCurrentSpeed(), или создать скрипт Human и обращаться как human.GetCurrentSpeed() или human.GetValue<Vector3> ( HumanValues.Speed)? Или есть какой нибудь другой более красивый способ?
Способ должен быть легко расширяемый, чтобы можно было добавлять новые фичи
Сообщение отредактировал SkorpyX - Воскресенье, 23 Октября 2016, 15:26