我的场景中有两个球(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;
}
}
答案 0 :(得分:0)
这是由于脚本执行顺序所致。如果使用Update()进行了任何更改,则另一个脚本上的Update()可能会或可能不会“看到”当前框架的更改。解决此问题的一种方法是在播放器设置中手动更改ScriptExectutionOrder,但这很麻烦。
一种不太混乱的方法是使用一个鲜为人知的回调方法,称为LateUpdate(本质上可以保证它晚于其他更新运行)。
易于过度使用但有用