制作弹性对象Unity3D

时间:2019-06-14 16:59:47

标签: c# unity3d

我的场景中有两个球(A和B),比赛时它们有一些运动。我想通过圆柱体将它们链接起来,所以圆柱体的顶部应该粘在球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 :(得分:0)

这是由于脚本执行顺序所致。如果使用Update()进行了任何更改,则另一个脚本上的Update()可能会或可能不会“看到”当前框架的更改。解决此问题的一种方法是在播放器设置中手动更改ScriptExectutionOrder,但这很麻烦。

一种不太混乱的方法是使用一个鲜为人知的回调方法,称为LateUpdate(本质上可以保证它晚于其他更新运行)。

易于过度使用但有用