当游戏对象移动到特定位置时触发
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;
}
}
在我的项目中,我有一个 垂直数字刻度盘,数字介于 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;
}
}