Единство - создание ховеркара, противодействуя гравитации - PullRequest
1 голос
/ 17 октября 2019

Я хочу реализовать способ создания ховербайка. мой текущий код для зависания -

readonly float yForce = 80;
Physics.Raycast(hoverbike.transform.position, Vector3.down, out hit);
Debug.Log(hit.distance);
if (hit.distance < 10 && hit.distance > 0)
{
   if (hoverbike.velocity.y < 0.1)
    {
        hoverbike.AddForce(0, yForce, 0, ForceMode.Acceleration);
        Debug.Log("applying force!");
    }
}

. Это работает, но не очень хорошо, автомобиль отскакивает вверх и вниз. Я также попытался вычесть ту же самую силу, что и у мотоцикла y velocity, но машина медленно сместилась вниз и не поднялась до желаемой высоты в 10 единиц от земли. Как мне этого добиться? Простое противодействие его текущей скорости легко, но как мне заставить его всплыть обратно вверх до желаемой высоты?

Ответы [ 3 ]

1 голос
/ 17 октября 2019

Гораздо проще просто отключить гравитацию, чем постоянно бороться с ней;эта частая переналадка, вероятно, является причиной вашего бодрости. После активации велосипеда вы можете полностью взять расчеты объекта y velocity в свои руки следующим образом:

public class Bike : MonoBehaviour
{
    private Rigidbody hoverbike;
    private bool isBikeActive = false;

    [SerializeField] private float verticalSpeedMultiplier = 1f;
    [SerializeField] private float hoverHeight = 10f;
    [SerializeField] private float hoverTolerance = 0.5f;
    [SerializeField] private float maximumVerticalVelocity = 10f;

    private void Awake()
    {
        hoverbike = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) { ToggleBike(); }

        if (isBikeActive)
        {
            Physics.Raycast(hoverbike.transform.position, Vector3.down, out RaycastHit hit);

            Vector3 modifiedVelocity = hoverbike.velocity;

            if ((hit.distance > hoverHeight - hoverTolerance) && (hit.distance < hoverHeight + hoverTolerance))
            {
                modifiedVelocity.y = 0f;
            }
            else
            {
                modifiedVelocity.y = -(hit.distance - hoverHeight) * verticalSpeedMultiplier;
                modifiedVelocity.y = Mathf.Clamp(modifiedVelocity.y, -maximumVerticalVelocity, maximumVerticalVelocity);
            }

            Debug.Log($"Distance from ground: {hit.distance}, Bike Velocity.y: {modifiedVelocity}");
            hoverbike.velocity = modifiedVelocity;
        }
    }

    private void ToggleBike()
    {
        isBikeActive = !isBikeActive;
        hoverbike.useGravity = !isBikeActive;
    }
}

Теперь ваш мотоцикл всегда будет пытаться двигаться к точке hoverHeight единицнад объектом под ним, пока он не окажется в пределах hoverTolerance от этой точки. Он также будет двигаться более плавно к этой точке, двигаясь тем быстрее, чем дальше от заданной высоты.

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

1 голос
/ 17 октября 2019

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

readonly float yForce = 80f; // requires tuning
readonly float dampenFactor = 0.8f; // requires tuning
readonly float offsetFactor = 0.5f; // requires tuning

readonly float targetHeight = 10f

Physics.Raycast(hoverbike.transform.position, Vector3.down, out hit);
Debug.Log(hit.distance);
if (hit.distance < targetHeight && hit.distance > 0)
{
    float availableForce = yForce;

    // cancel out downward velocity
    if (hoverbike.velocity.y < 0)
    {
        // Cap out upward force based on yForce
        float cappedDampenForce = Mathf.Min(dampenFactor * -hoverbike.velocity.y,
                availableForce);

        // How much force is available for the offset?
        availableForce -= cappedDampenForce;

        hoverbike.AddForce(Vector3.up * cappedDampenForce, ForceMode.Acceleration);
        Debug.Log("applied dampening force");
    }

    // Find upward force scaled by distance left to target height, and cap that amount
    float cappedOffsetForce = Mathf.Min(offsetFactor * (targetHeight - hit.distance), 
            availableForce);

    hoverbike.AddForce(Vector3.up * cappedOffsetForce, ForceMode.Acceleration);
    Debug.Log("applied offset force");
}
1 голос
/ 17 октября 2019

Наведение - это (по сути) визуальный эффект

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...