当游戏对象移动到特定位置时触发

Trigger when gameobject moves over a specific position

在我的项目中,我有一个 垂直数字刻度盘,数字介于 0 和 9 之间。我可以上下拖放此刻度盘(x 位置已锁定)。当我放下它时,它会检查其当前位置。如果它在两个数字之间,例如 3 和 4,它将移动(补间)到最接近的数字。

我希望每次我通过其中一个数字时播放咔嗒声,同时我拖动表盘,让它感觉像一个锁定系统。

我尝试Vector3.MoveTowards(curPos, toPos, speed); 移动表盘,并在 Update() 中检查我的当前位置是否等于我的触发位置。但不出所料,这不起作用。我的对象移动到触发位置上,但由于它永远不会完全等于它,所以它不会触发我的点击声音。

当我放下拨号时播放声音是没有问题的。但是,当我 拖动 时,我该怎么做呢?

这是我的解决方案。 如果将此脚本附加到游戏对象 (GO),GO 将移动到单击位置。如果它移过 y 轴上的触发位置之一 (triggerPositions),在此示例中 y = 1、2 或 5,控制台 returns "TRIGGER".

是这样的,点击屏幕后,我们保存点击位置(toPos)和我们保存当前位置(curPos ).如果当前位置不等于最后一个位置 (lastPos),那么我们通过检查 GO 的最后一个位置是否小于我们的触发位置 (tp) 来检查 GO 是否移过触发位置触发位置是否小于我们当前的位置? (我们也检查相反的情况)THEN "TRIGGER!",因为它通过了触发位置。

我们将上一个位置保存为当前位置,然后移动 GO。重复。

tp 可以是任何浮点值。使用我的解决方案,您可以通过向数组 triggerPositions.

添加或删除值来添加任意数量的触发位置
using UnityEngine;

public class MoveTowardsClick : MonoBehaviour
{
    [SerializeField] private float speed = 0.1f;
    [SerializeField] private Vector2 toPos = new Vector2(0, 0);

    [SerializeField] private Vector2 curPos = new Vector2();
    [SerializeField] private Vector2 lastPos = new Vector2();


    private void Start()
    {
        curPos = transform.position;
        lastPos = curPos;
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            toPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        }

        curPos = transform.position;

        if(curPos != lastPos)
        {
            float[] triggerPositions = new float[3] { 1, 2, 5 };

            foreach (float p in triggerPositions)
            {
                if ((lastPos.y < p && p <= curPos.y) ||
                    (lastPos.y > p && p >= curPos.y))
                {
                    // Do something when moving over trigger position
                    Debug.Log("TRIGGER!");
                }
            }
        }

        lastPos = curPos;

         this.transform.position = Vector3.MoveTowards(curPos, toPos, speed);
        // or move with this.transform.position = toPos;
    }
}