Независимая от частоты кадров pushForce?

Я работаю с CharacterController и добавил возможность нажимать Rigidbody. Проблема, однако, в том, что нажатие зависит от частоты кадров. Как я могу сделать его независимым от частоты кадров? Я пробовал добавить Time.deltatime, но это делает невозможным продвижение, хотя, возможно, я добавляю его неправильно.

Вот код, который добавляет силы твердым телам;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    Rigidbody body = hit.collider.attachedRigidbody;

    if (body == null || body.isKinematic)
        return;

    if (hit.moveDirection.y < -.3f)
        return;

    Vector3 pushDirection = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);
    body.velocity = pushForce * pushDirection;
}

Насколько я знаю, это как-то связано с двумя последними строками кода.

Изменить (код для нажатия):

public void PushStates() {
    // Creating the raycast origin Vector3's
    Vector3 forward = transform.TransformDirection(Vector3.forward) * distanceForPush;
    Vector3 middle = controller.transform.position - new Vector3(0, -controller.height / 2, 0);

    // Inspector bool
    if (pushRay)
    {
        Debug.DrawRay(middle, forward, Color.cyan);
    }

    // Force the pushForce and movementSpeed to normal when the player is not pushing
    pushForce = 0f;
    movementSpeed = walkSpeed;

    // Draws a raycast in front of the player to check if the object in front of the player is a pushable object
    if (Physics.Raycast(middle, forward, out hit, distanceForPush))
    {
        if (InputManager.BButton() && playerIsInPushingTrigger)
        {
            PushableInfo();

            playerIsPushing = true;
            anim.SetBool("isPushing", true);

            if (hit.collider.tag == "PushableLight")
            {
                pushForce = playerPushForceLight;
                movementSpeed = pushSpeedLight;
            }
            else if (hit.collider.tag == "PushableHeavy")
            {
                pushForce = playerPushForceHeavy;
                movementSpeed = pushSpeedHeavy;
            }

            // Checks the players speed now instead off movement. This is neccesary when the player is pushing a pushable into a collider. 
            // The player and pushable never stop moving because of force.
            if (currentSpeed < 0.15f)
            {
                //Removes all remaining velocity, when the player stops pushing
                pushableObjectRB.velocity = Vector3.zero;
                pushableObjectRB.angularVelocity = Vector3.zero;

                anim.SetFloat("pushSpeedAnim", 0f);
            }
            else
            {
                // Calls a rotation method
                PushingRot();
                if (hit.collider.tag == "PushableLight")
                {
                    anim.SetFloat("pushSpeedAnim", pushSpeedAnimLight);
                }
                else if (hit.collider.tag == "PushableHeavy")
                {
                    anim.SetFloat("pushSpeedAnim", pushSpeedAnimHeavy);
                }
            }
        }
        else
        {
            anim.SetBool("isPushing", false);
            pushForce = 0f;
            movementSpeed = walkSpeed;
            playerIsPushing = false;
        }
    }
    else
    {
        anim.SetBool("isPushing", false);
        playerIsPushing = false;
    }

    // Setting the time it takes to rotate when pushing
    AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0);
    if (stateInfo.fullPathHash == pushStateHash)
    {
        turnSmoothTime = maxTurnSmoothTimePushing;
    }
    else
    {
        turnSmoothTime = 0.1f;
    }
} 

person Quincy Norbert    schedule 21.02.2019    source источник


Ответы (1)


Вы были правы, вам нужно умножить на Time.deltaTime, которое представляет собой время, прошедшее с момента последнего визуализированного кадра. Поскольку это число действительно мало (если у вас 60+ кадров в секунду), вам также необходимо увеличить значение (умножьте его на 100, 1000 ...)

person Jichael    schedule 21.02.2019
comment
Вы имеете в виду, что мне нужно увеличить силу нажатия? А как насчет умножения на Time.deltaTime, если я могу спросить? - person Quincy Norbert; 21.02.2019
comment
Просто сделайте body.velocity = pushForce * pushDirection * Time.deltaTime * someValueToAdjust Однако вы не делаете это в обновлении, цикле или чем-то еще, поэтому это не должно зависеть от частоты кадров в первую очередь? - person Jichael; 21.02.2019
comment
Что такое someValueToAdjust? И действительно, это не непосредственно в функции обновления, но когда CharacterController сталкивается с твердым телом, не означает ли это, что он автоматически запускается в Update? - person Quincy Norbert; 21.02.2019
comment
Я думаю, что значение, которое нужно отрегулировать, составляет * 100, верно? Я тестировал это всего несколько секунд, но, похоже, он работает. Однако после отключения v-sync по какой-то причине он все еще зависит от частоты кадров? - person Quincy Norbert; 21.02.2019
comment
Да, используйте someValue, чтобы получить желаемый эффект. Но опять же, если вы не делаете это в цикле или при обновлении, это не должно зависеть от частоты кадров. Если это так, я не знаю почему, извините: x - person Jichael; 21.02.2019
comment
Я должен сказать, что остальная механика толкания сделана через обновление. Я обновил вопрос добавленным кодом. Может быть, в этом есть смысл? - person Quincy Norbert; 21.02.2019
comment
multiply it by 100, 1000...) более или менее 60 будет достаточно? ;) - person derHugo; 21.02.2019
comment
Привет, да, я умножаю на 50 атм, и это кажется неплохим. Вы хоть представляете, почему при нажатии сохраняется зависимость от частоты кадров? - person Quincy Norbert; 21.02.2019