2D-контроллер персонажа в единстве (пытается вернуть платформеры старой школы)

11

В эти дни я пытаюсь создать 2D-контроллер персонажа с единством (используя физику). Я довольно плохо знаком с физическими двигателями, и мне действительно сложно почувствовать, что я ищу. Я был бы очень рад, если бы кто-нибудь мог предложить решение для проблемы, которую я нахожу:

Это мое 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);
}

Я здесь пытаюсь просто переместить твердое тело, применяя гравитацию и линейную силу для левых и правых. У меня настроить PHYSIC материал, который не имеет никакого раскачивания и 0 трения при движении и 1 трение с подставкой еще. Основная проблема заключается в том, что у меня есть коллайдеров с наклонами и изменения скорости от подходя (медленнее), идя вниз по склону (быстрее) и ходить по прямой коллайдера (нормальный). Как можно это исправить? Как вы видите, я применяю Allways одинаковую скорость для оси х.

Для игрока у меня есть его установка со сферой в положении ног, что является Rigidbody я применяю силу к.

Любой другой совет, который мог бы сделать свою жизнь проще с этим приветствуются :).

PD В то время как возвращение домой, я заметил, что я мог бы решить эту проблему применения постоянной силы параллельно поверхности игрок ходит, но не знаю, если это лучший способ.

Неплохо
источник
4
Старая школа приставочные используются рука настроенного «физика мультфильма» для прыжков механики и прямого контроля скорости (то есть. Нет физики вообще) для прогулок движения. Если вы можете переписать контроллер персонажа, сделать это, потому что это будет трудно ткнуть и прод в болотистое моделирование физики в хрустящие движения, старые школьные игры были.
Патрик Хьюз
Проблема написания пользовательской является то , что обнаружение столкновения теряется. И это не так легко восстановить его без использования raycast ( в зависимости от окружающей среды, и т.д. ... это может быть куча из них). Как вы справляетесь с этой ситуацией?
Notbad
Вы можете иметь коллайдеров на вещи, которые до сих пор обычай animated- при использовании кинематических rigidbodies. Я гарантирую , что в большинстве случаев вы действительно не хотите реального мира физики / сил и т.д. для такого рода приложений. Если вы ищете более технической точки зрения, возможно , исследования человеческого IK
Runonthespot
1
Защита канавы физик в этой ситуации.
Ray_Garner

Ответы:

7

Если вы хотите мимических старой школы приставочных шаг один заключается в канаву физике в целом. Вы будете в конечном итоге борьба систему физики , чтобы получить решительно , не реалистичное движение старой школы платформер. Посмотрите на эту CharacterController замену , что физика канавы в целом , чтобы получить хорошее представление о том , один из способов его осуществления.

prime31
источник
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похоже, но зависит от массы твердого тела. Это усложняет настройку.

michael.bartnett
источник
2

Даже если вам не нравится встроенный компонент Character Controller (как и я), взгляните на пример кода Unity для учебника по 2D-игре .

Код реализует полноценный 2D-геймплей с движущимися платформами, врагами и ящиками при столкновении с использованием Контроллера персонажей.

Но если вы даже не хотите смотреть, я предлагаю вам свести к минимуму использование физики и попытаться скопировать ее поведение с вашим собственным кодом. В зависимости от того, какую 2D игру вы планируете, она может работать довольно хорошо. Например, вместо применения силы для Rigidbody.velocityперемещения вашего персонажа вы можете напрямую связываться Transform.Translate(), перемещая объект в Transform.positionзависимости от его оси. Вы можете определить forwardи backотносящийся к самому объекту или, может быть, платформу или пол Transform.up, так что вы будете знать, знает ли он наклон и своего рода угол его наклона.

Кроме того, если вы создаете какой-либо атрибут контроля скорости (например, как долго нажимается клавиша), вы можете применить его вместе с вашим направлением во время перевода, чтобы предотвратить перемещение вашего персонажа по чему-то слишком наклонному без некоторой скорости, так же, как это делали в ежике Sonic для Бытие / Мега Драйв.

Если вы решите продолжать использовать физику, я вам ничем не могу помочь, потому что я не очень хорош в этом, но помните, что это нормальное поведение - идти вверх по склону медленнее, поскольку телу нужно больше силы, чтобы не отставать. как в реальной жизни.

mheona
источник
Первое, что я прочитал, когда вступил в единство, это учебник. Проблема в том, что чувство контроля довольно плохое. Вот почему я хотел найти свое собственное решение. С другой стороны, когда вы начинаете использовать Transform.Translate (), не так просто делать уклоны и другие вещи. Вы должны использовать луч несколько раз (2 или 3 для пола, больше для направления движения в зависимости от размера героя). Для мобильных устройств raycast не очень хорош, и меньше, если вам нужно сделать 5..n за каждую итерацию обнаружения столкновений. Возможно, я могу ошибаться, но я так не думаю.
Notbad
1

Что вы хотите, это встроенный контроллер персонажей . Установив step offsetсвойство этого компонента, вы можете заставить игрока легко перемещаться вверх и вниз по склонам.

NoobsArePeople2
источник
Извините, что не комментирую. Я знаю, что есть контроллер персонажа в единстве и что я использовал его несколько раз, но мне не нравится, как он себя ведет. Он больше подходит для FPS, а не для игры на платформе, где механика движения - одна из самых важных вещей.
Notbad
Я думаю, что как только вы поиграете с настройками на контроллере персонажей, все будет хорошо. Чего тебе не хватало?
NoobsArePeople2
Первое , что мне не нравится то , что это происходит медленно по сравнению с обычными твердыми телами с некоторыми лучей гипсе. Зная , как достичь этого, я думаю , что я мог бы сделать более легкий контроллер. Другая проблема заключается в том что капсула / сферу странного поведения на краях платформы (она может быть решена с помощью некоторых более лучей слепков). Вот почему я хочу , чтобы катиться самостоятельно.
Notbad
0

введите описание изображения здесьЯ предполагаю, что это происходит потому, что сила не параллельно платформе, и результат заканчивает тем ниже в подъеме и выше по происхождению.

Если применить относительную силу к системе координат

AddRelativeForce

Вы хотите, чтобы сохранить максимальную скорость в «х» и сравнить ее с скаляр, помните, что скорость является вектором и составьте ух и уу, в плоской местности иу равна нулю, но обязательно на склонах больше нуля.

Скорость изменяется в соответствии с направлением тела, и его относительная vx изменяется относительно его общей vx

Это может изменить ваш V таким образом, вы не хотите, тоже:

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

поддержание того же глобального Vx может показаться странным для глаз. (Нежелательные Ускорения)

NorbyAriel
источник