Предотвращение дрожания твердого тела при завершении сопрограммы MovePosition - PullRequest
0 голосов
/ 25 февраля 2020

Я делаю систему, возможно, лучше всего описанную как телекинез. Игрок щелкает, чтобы подобрать ближайшее подвижное твердое тело, которое затем переходит в якорное преобразование (которое подпрыгивает вверх и вниз по синусоиде, поэтому кажется, что твердое тело плавает вверх и вниз). Эта часть работает нормально. Однако когда я снова щелкаю левой кнопкой мыши, жесткое тело должно просто упасть на место. Проблема в том, что он делает это странное дрожание, как будто не может решить, следует ли ему следовать за якорем или упасть на землю.

Мой код выглядит примерно так.

Сначала проверьте правильность ввода:

            if (holding == false && keyDown == false && abilitySwitch.disabling == false)
            {
                //Right click picks up the closest dragable.
                if (Input.GetMouseButtonDown(1))
                {
                    PickupClose();
                }

...

            else if (holding == true && keyDown == true && abilitySwitch.disabling == false)
            {
                //Right click while holding executes an indirect attack.
                if (Input.GetMouseButtonDown(1))
                {
                    AttackIndirect();
                }

Функция срабатывания выглядит следующим образом:

    public void PickupClose()
    {
        dragTarget = ClosestDragable();
        if (ClosestDragable() != null)
        {
            Debug.Log("Pickup close has run.");
            Debug.Log(dragTarget);

            holding = true;
            keyDown = true;

            dragTarget.GetComponent<Rigidbody>().useGravity = false;
            startCo = true;
        }
        else
        {
            Debug.Log("No dragable object in range.");
        }
    }

startCo проверено в FixedUpdate и, если он включен, то вызывается следующая сопрограмма:

    private IEnumerator MoveTargetToPosition(Vector3 target)
    {
        float t = 0f;
        Vector3 start = dragTarget.transform.position;

        while (t <= 1)
        {
            t += Time.fixedDeltaTime / baseSpeed;
            dragTarget.GetComponent<Rigidbody>().MovePosition(Vector3.Slerp(start, target, t));

            yield return null;
        }
    }

Когда функция атаки запущена:

    public void AttackIndirect()
    {
        Debug.Log("Attack indirectly has run.");

        holding = false;
        keyDown = false;
        isHeld = false;

        startCo = false;
        dragTarget.GetComponent<Rigidbody>().useGravity = true;
        dragTarget.GetComponent<Rigidbody>().velocity = Vector3.zero;
    }

Преобразование изменения синусоидальной волны / положения якоря обрабатывается отдельный скрипт на пустом игровом объекте:

    void Update()
    {
        Vector3 pos = bobber.transform.position;
        float newY = (Mathf.Sin(Time.time * speed)/4);
        transform.position = new Vector3(pos.x, newY + 2, pos.z);
    }

Вот видео о том, как выглядит проблема.

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

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

1 Ответ

0 голосов
/ 26 апреля 2020

Это никогда не получало никакой тяги, но ради других людей, которые могли бы иметь эту проблему:

Эта ссылка упоминает использование 1 - Mathf.Exp(-20 * Time.deltaTime) вместо обычного Time.deltaTime - у меня отлично работает.

А для записи проблема такая же в FixedUpdate().

...