Тема: Кастомна фізика персонажа Unity3d
Прів.
Надумав був гру зробити, в котрій ми управляємо колобком. Я планую зробити її красивою та динамічною, аби було багацько екшону, гра буде нагадувати консольну гру Sonic.
Вбудована в Unity фізика мені не підійшла, тому що в моєму світі будуть свої закони фізики.
Озьдо деяка інфа про те, як має рухатись персонаж:
1. Швидко рухатись по всіляким горбам та ямам
2. Гнучке налаштування інерції, персонаж повинен вміти швидко змінювати напрямок руху, але в деяких моментах він буде буксувати
3. Гнучке налаштування моментів, в котрих персонаж відривається від землі. Наприклад, коли на великій швидкості забігає на гірку.
4. Персонаж повинен мати змогу рухатись по вертикальним стінам, та навіть стелям. Наприклад, коли забігає на петлю, ну як в Sonic'у.
5. Ще щось, чого я не знаю.
Поки що я більш-менш зробив наступне:
1. Персонаж не відривається від землі коли на великій швидкості забігає на гірку
2. Швидкість лінійно змінюється. Спочатку персонаж має швидкість n, а через секунду вона досягає максимуму на поточній "поверхні"
a) на пласкій землі вона трошки збільшується на одну секунду
б) коли персонаж забігає на гірку, то швидкість починає зменшуватись
в) коли персонаж біжить з гірки, то швидкість збільшується
Оце поки що все, що я зробив.
Але в мене виникла проблема з:
1. Коректністю швидкості (при переході з пласкої поверхні на гірку - швидкістю підскакує)
2. Положенням персонажа на гірках (деяка частина персонажа провалюється в гірку)
3. Рухом по вертикальним стінам (воно просто нікуди не їде, або проходить через стіну)
4. Великими швидкостями (проходить через стіни/гірки)
Основною проблемою я вважаю те, як знаходиться наступне положення персонажа.
Зараз алгоритм працює так:
1. Обираємо напрямок в котрому рухається персонаж (право, чи ліво)
2. Множимо вектор напрямку на змінну швидкості
3. Додаємо отриманий раніше вектор до позиції персонажа
4. З отриманої позиції пускаємо прямо вниз промінь
5. Беремо точку, в котрій промінь потрапив в якусь поверхню
6. Додаємо до отриманої раніше точки радіус персонажа (ну воно ж коло) та отримуємо нову позицію для персонажа
7. За допомогою нормалі до площини, в котру потрапив проміню, обраховуємо нахил поверхні
8. За допомогою нахилу поверхні та часу руху персонажа після останної зупинки обраховуємо нову швидкість
В кого які ідеї, як покращити цей алгоритм?