首页 > 解决方案 > 以 Unity (2D) 的速度将对象移动到某个位置

问题描述

我有 2 个在一个方向上基本运动的移动物体:

if(CircleMovement1.switchMovement1 == false)
        {
            if(scoreNumber.scoreCounter >= 0 && scoreNumber.scoreCounter < 10){
                speed = 0.3f;
                rb.velocity = new Vector2(speed * 1.7f, 0);
            }
}

成功时,即单击类型的事件,对象必须停止沿该方向移动并返回到相反方向的起始位置,其速度分量比它们在开始方向上移动时的速度分量要大一些。单击事件时只需更改“CircleMovement1.switchMovement1”的布尔值,以便对象可以沿相反方向移动:

else if(CircleMovement1.switchMovement1 == true)
        {
            if(scoreNumber.scoreCounter >= 0 && scoreNumber.scoreCounter < 10){
                rb.velocity = new Vector2(-speed * 25f, 0);
            }}

问题是:一旦对象再次到达起始位置,它们必须停止并再次向前移动,就像 CircleMovement1.switchMovement1 == false 一样,如第一个片段所示。我不知道如何标记他们到达起点并可以开始向相反方向移动的时刻。我尝试添加对撞机并检测与起点上的对象的碰撞:

public void OnTriggerEnter2D(Collider2D col){
    if (col.gameObject.tag == "mainCol")
    {
        CircleMovement1.switchMovement1 = false;
    }
}

但这并没有很好地转向,因为在更高的速度上,物体有时会穿透起点的对撞机并向后超过需要的程度(这不一致)。

我试图跟踪这样的对象的本地位置:

if(this.GetComponent<RectTransform>().localPosition.x == 30) {
        CircleMovement1.switchMovement1 = false;
    }

但这根本不起作用。

最后,我尝试使用 Lerp 函数将对象移动到这样的起始位置:

circ3.GetComponent<RectTransform>().localPosition = new Vector3(Mathf.Lerp(currPos3.x,-1,1f * Time.deltaTime),2,0);

这有效,但不是我希望它工作的方式。它只是立即在给定的矢量位置生成一个对象,并且与速度运动的外观不同。

如果有人知道如何检测物体到达他们需要的位置的点,请随时提供帮助。

提前致谢。

标签: c#unity3d

解决方案


您已显示此代码。x 位置很少或永远不会恰好达到 30,因为它是如何移动的并且它具有十进制数字。这就是它不起作用的原因。

if(this.GetComponent<RectTransform>().localPosition.x == 30) {
        CircleMovement1.switchMovement1 = false;
}

您可以尝试检查它到目标位置的距离,如下所示:

float distance = Vector3.Distance(GetComponent<RectTransform>().localPosition, targetPos);
if (distance < 1)
{
    CircleMovement1.switchMovement1 = false;
}

推荐阅读