Создание эластичного объекта Unity3D - PullRequest
1 голос
/ 14 июня 2019

У меня есть два шара (A и B) в моей сцене, у них есть некоторые движения во время игры. Я хочу связать их с помощью цилиндра, поэтому верхняя часть цилиндра должна прилипать к шару А, а нижняя должна прилипать к шару В. И когда шарики движутся, цилиндр должен двигаться и масштабироваться вверх и вниз в зависимости от расстояния между шариками. Так что это дает упругий эффект.

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

Сценарий цилиндра:

public Transform ball1;
public Transform ball2;
Vector3 scale0;
Vector3 scale;


 void Start()
    {
        scale0 = transform.localScale;
    }

 void Update()
    {
        var pA = ball1.position;
        var pB = ball2.position;

        transform.position = (pA + pB) / 2;
        transform.LookAt(pB); 

        scale = scale0;
        scale.z = scale0.z * Vector3.Distance(pA, pB) * 2;
        transform.localScale = scale;
    }

Ball A Скрипт:

GameObject ActualBase;
GameObject NextBase;
float Speed = 20;

void Update () {

        if (Input.GetMouseButtonDown(0))
        {
            StopAllCoroutines();
            StartCoroutine(Move());
        }
    }

public IEnumerator MoveCylinder()
    {
        Vector3 Ball1Destination = new Vector3(NextBase.transform.position.x, transform.position.y, NextBase.transform.position.z);
        while (Vector3.Distance(transform.localPosition, Ball1Destination) > 0)
        {
            float currentMovementTime = Time.deltaTime;
            transform.position = Vector3.MoveTowards(transform.position, Ball1Destination, currentMovementTime * Speed);
            yield return null;
        }
}

1 Ответ

0 голосов
/ 15 июня 2019

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

Немного менее грязный способ - использовать менее известный обратный вызов, называемый LateUpdate (который гарантированно будет запущен позже, чем другие обновления, по сути).

Легко использовать, но полезно

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