Контролер 2D символів в єдності (намагається повернути старі шкільні платформи)


11

Цього дня я намагаюся створити двовимірний контролер символів з єдністю (використовуючи фізику). Я досить новачок у фізичних двигунах, і мені дуже важко отримати управління, яке я шукаю. Я був би дуже радий, якби хто-небудь міг запропонувати рішення проблеми, яку я знаходжу:

Це мій FixedUpdate прямо зараз:

public void FixedUpdate()
{
    Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
    _body.AddForce(v);

    v.y=0;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.velocity=v;

    Debug.Log("Velocity: "+_body.velocity);
}

Я намагаюся тут просто перемістити жорстке тіло, застосовуючи силу тяжіння та лінійну силу вліво і вправо. У мене встановлено фізичний матеріал, який не робить підстрибування та 0 тертя при русі та 1 тертя з нерухомим положенням. Основна проблема полягає в тому, що у мене є зіткнення зі схилами, і швидкість змінюється від підйому вгору (повільніше), спуску по схилу (швидше) і ходіння по прямому колайдеру (нормально). Як це можна було виправити? Як ви бачите, я застосовую завжди однакову швидкість для осі x.

Для гравця у мене це налаштування зі сферою на ногах, це жорстке тіло, до якого я застосовую сили.

Будь ласка, вітаємо будь-яку іншу пораду, яка могла б полегшити мені життя :).

П.Д. Приходячи додому, я помітив, що міг би це вирішити, застосовуючи постійну силу, паралельну поверхні, по якій грає ходити, але не знаю, чи це найкращий метод.


4
Старі шкільні платформи використовували ручну налаштовану «фізику мультфільмів» для механіки стрибків та прямого керування швидкістю (тобто взагалі немає фізики) для руху рухом. Якщо ви можете переписати контролер символів, зробіть це, тому що це буде важко тхнути і піддати хитромудрому фізичному моделюванню в чіткі рухи, які мали старі шкільні ігри.
Патрік Хьюз

Проблема написання на замовлення полягає в тому, що виявляється зіткнення. І відновити його непросто, не використовуючи радіомовлення (залежно від навколишнього середовища тощо ... це може бути купа). Як ви справляєтесь із цією ситуацією?
Нотбад

Ви можете мати сутички на речі, які все ще користуються анімацією - коли ви використовуєте кінематичні жорсткі тіла. Я б заперечував, що в більшості ситуацій ви не дуже хочете фізики / сил тощо у подібному застосуванні. Якщо ви шукаєте більш технічний кут, можливо, досліджуйте IK Human
Runonthespot

1
Захистіть фізику канави в цій ситуації.
Ray_Garner

Відповіді:


7

Якщо ви хочете наслідувати платформерів старої школи, перший крок - це взагалі кинути фізику. Ви закінчите боротися з системою фізики, щоб отримати рішуче нереалістичний рух платника старої школи. Погляньте на цю заміну CharacterController, яка взагалі викидає фізику, щоб отримати гарне уявлення про один із способів її здійснення.


3

Ви, мабуть, були б щасливішими з тим, що рекомендував меона. Але якщо ви збираєтесь використовувати фізику Unity, то, ймовірно, ви хочете використовувати ForceMode.VelocityChange.

Приклад:

public void FixedUpdate()
{
    var v = Vector3.zero;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

Ви також повинні застосувати глобальну гравітацію у налаштуваннях фізики вашого проекту, а до об'єктів, які ви хочете швидше падати, додайте компонент постійної сили .

ForceMode.Impulseподібний, але на нього впливає маса жорстких тіл. Складніше налаштовується.


2

Навіть якщо вам не подобається вбудований компонент Controller Controller (як я це роблю), подивіться на приклад коду Unity для 2D навчального посібника з ігрових процесів .

Код реалізує повний 2D геймплей з рухомими платформами, ворогами та коробками зіткненням, використовуючи контролер символів.

Але якщо ви навіть не хочете поглянути, я пропоную вам мінімізувати використання фізики і спробувати скопіювати її поведінку з власним кодом. Залежно від того, яку 2D гру ви плануєте, це може працювати досить добре. Наприклад, замість того, щоб застосувати силу для Rigidbody.velocityпереміщення свого персонажа, ви могли б возитися безпосередньо Transform.Translate(), який переміщує об’єкт Transform.positionна основі своєї осі. Ви можете визначити forwardі backпов'язаний із самим об'єктом або, можливо, майданчиком або підлогою Transform.up, тож ви дізнаєтесь, чи знає його пандус і наче його кут.

Крім того, якщо ви створюєте якусь функцію контролю швидкості (наприклад, тривалість натискання клавіші), ви можете застосувати її разом зі своїм напрямком під час перекладу, щоб запобігти тому, щоб ваш персонаж ходив щось надто нахилене без деякої швидкості, як це робилося на їжака Sonic для Genesis / Mega Drive.

Якщо ви вирішите продовжувати використовувати фізику, я вам взагалі не можу допомогти, тому що я не так добре в цьому, але майте на увазі, що це нормальна поведінка йти «на схил» повільніше, оскільки тілу потрібно більше сил, щоб не відставати , як справжнє життя.


Перше, що я прочитав, коли вступив в єдність, був цей підручник. Проблема полягає в тому, що почуття управління досить погано. Ось чому я хотів знайти власне рішення. З іншого боку, коли ви починаєте користуватися Transform.Translate (), робити нахили та інші речі не так просто. Ви повинні прокласти кілька разів (2 або 3 для підлоги, більше для напрямку, яким ви рухаєтесь, залежно від розміру героя). Для мобільних пристроїв радіомовлення не є корисним, і менше, якщо ви робите 5..n за ітерацію виявлення зіткнення. Можливо, я можу помилитися, але я не думаю.
Нотбад

1

Що ви хочете, це вбудований в контролер символів . Встановивши step offsetвластивість цього компонента, ви можете змусити гравця легко рухатися по схилах вгору та вниз.


Вибачте за те, що я не коментую, що знаю, що є Контролер символів в єдності, і що я використовував його кілька разів, але мені не подобається, як він веде себе. Він більше підходить просто для FPS, а не для платформних ігор, де механіка руху - одна з найбільш важливих речей.
Нотбад

Я думаю, що коли ви поспілкуєтесь з налаштуваннями на контролері символів, це добре працює. Чого вам не вистачало?
NoobsArePeople2

Перше, що мені не подобається, це те, що воно повільне відносно звичайних жорстких тіл з деяким відливом променів. Знаючи, як цього досягти, я думаю, що міг би зробити більш легкий контролер. Інша проблема полягає в тому, що бути незвичайною поведінкою капсули / сфери на краях платформи (це можна вирішити за допомогою декількох викидів променів). Ось чому я хочу скрутити своє.
Нотбад

0

введіть тут опис зображенняЯ гадаю, це тому, що сила не паралельна платформі, і результат закінчується меншим підйомом і вище за спуском.

Якщо ви застосуєте відносну силу до системи координат

AddRelativeForce

Ви хочете зберегти максимальну швидкість у «х» і порівняти її зі скаляром, пам’ятайте, що швидкість є вектором і складати vx і vy, у рівній місцевості vy дорівнює нулю, але обов’язково на схилах більше нуля.

Швидкість змінюється залежно від напрямку тіла, а його відносна vx змінюється відносно його загального vx

Це може змінити ваш V таким чином, щоб ви теж не хотіли:

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

збереження тієї ж глобальної Vx може здатися дивним для очей. (Небажані прискорення)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.