c# - 以 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);
这有效,但不是我希望它工作的方式。它只是立即在给定的矢量位置生成一个对象,并且与速度运动的外观不同。
如果有人知道如何检测物体到达他们需要的位置的点,请随时提供帮助。
提前致谢。
解决方案
您已显示此代码。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;
}
推荐阅读
- amazon-web-services - AWS S3 对象 - 写入 ACL 权限虽然无效但返回
- ios - Xcode Git 停止提交个人方案,但在存储库中保留“默认”方案
- reactjs - 如果没有使用 Typescript 传递给 NextJS 中的功能组件,如何设置道具的默认值
- javascript - 在同一点击中创建和拖动
- database - Wordpress 插件将数据添加到数据库,然后调用数据
- go - 如何缓存一个 TCP 反向代理数据传输?
- scala - ScalaJs + ZIO:程序适用于 sbt 1.2.8 但不是 >= 1.3
- swift - 如何在 Swift 中设置计时器?
- python - 无法在使用 selenium 和 python 的谷歌会议中点击“要求加入”
- javascript - 解密使用 javascript:void(0) 隐藏的 href 链接