Прыгающий мяч в Unity без контроллера персонажей - PullRequest
0 голосов
/ 24 марта 2011

Я хотел бы знать, как заставить мяч прыгать в Unity без использования контроллера персонажа.Шар должен иметь твердое тело для гравитации и сценарий, чтобы заставить его прыгать в относительной ориентации шара.Может кто-нибудь помочь, пожалуйста.

1 Ответ

0 голосов
/ 28 марта 2011

As skovacs1 указывает на ответы Unity :

Простой ответ - настроить значение inAirControlAcceleration и это должно дать вам нечто похожее на то, что вы себе представляете. Для еще большего контроль, вы также можете заменить составное назначение movement.inAirVelocity с

movement.inAirVelocity +=
    movement.direction * Time.deltaTime *
    movement.inAirControlAcceleration 

, чтобы значение масштабировалось сумма ввода ч.

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

//move horizontally as calculated in UpdateSmoothedMovementDirection * speed
//+ vertically by the speed calculated in ApplyGravity or ApplyJumping
//+ horizontally + vertically by the inAirMovement calculated in ApplyJumping
//+ horizontally by the adjustment to inAirMovement calculated in
//UpdateSmoothedMovementDirection 
var currentMovementOffset = movement.direction * movement.speed
                            + Vector3(0,movement.verticalSpeed,0)
                            + movement.inAirVelocity;
currentMovementOffset *= Time.deltaTime;
movement.collisionFlags = controller.Move (currentMovementOffset);

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

Часть, которая выполняет работу:

function UpdateSmoothedMovementDirection() { //called by Update every frame
    //...irrelevant stuff
    //move direction is *always* (canControl is never changed in this script)
    //the horizontal input when the absolute horizontal input is greater than 0.1
    if (movement.isMoving) movement.direction = Vector3 (h, 0, 0);

    //calculate the speed change only when on the ground
    if (controller.isGrounded) {
        var curSmooth = movement.speedSmoothing * Time.deltaTime;
        var targetSpeed = Mathf.Min (Mathf.Abs(h), 1.0);
        if(Input.GetButton("Fire2") && canControl)
            targetSpeed *= movement.runSpeed;
        else
            targetSpeed *= movement.walkSpeed;

        movement.speed = Mathf.Lerp (movement.speed, targetSpeed, curSmooth);
        //...irrelevant stuff
    }
    //inAirVelocity is going to be adjusted horizontally by Time.deltaTime
    //in the direction of horizontal input
    else {
        //...irrelevant stuff
        if (movement.isMoving)
            movement.inAirVelocity += Vector3(Mathf.Sign(h),0,0) * Time.deltaTime
                                      * movement.inAirControlAcceleration;
    }
}

Часть, которая устанавливает начальную inAirVelocity:

function ApplyJumping() { //called by Update every frame
    //...irrelevant stuff
    //When on the ground and we can jump, the inAirVelocity will be 
    //the motion of the platform we're on
    if (controller.isGrounded) {
        if (jump.enabled && Time.time < jump.lastButtonTime + jump.timeout) {
            //...irrelevant stuff
            movement.inAirVelocity = lastPlatformVelocity;
            //...irrelevant stuff
        }
    }
}

Что, вероятно, не то, что вы ожидаете, что вы только когда-либо рассчитывать скорость, когда на земле.

Оказавшись в воздухе, вы двигаетесь со скоростью вы двигались, когда вы были в последний раз на земле на входе направление (movement.direction) + некоторая регулировка зависит от входа направление (inAirVelocity).

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

Чтобы получить правильное направление по инерции, вам необходимо переместить перейти на движение.направление в блок if(Controller.isGrounded) что следует. Чтобы получить фактическое инерционное замедление, вы бы вычесть из скорости в операторе else с некоторой скоростью сглаживания до это 0 и держите lastPlatformVelocity отдельно от inAirVelocity, добавьте это как отдельный термин и также замедлите его.

Чтобы обеспечить полный контроль скорости в воздухе, я рекомендую вам переместить ускорить процесс из блока if (в этом случае inAirVelocity может не необходимо изменить в UpdateSmoothedMovementDirection).

С другой стороны, Вы можете изменить то, что вы используете для расчета движения при прыжке делать что-то вроде

if(!controller.isGrounded) movement.speed = inAirSpeed;

но это приведет к неестественному поведению, и вы Скорее всего, придется сделать некоторые настройки в воздухе.

...