在我的项目中,我有 一个垂直的数字表盘,数字在0到9之间。我可以上下拖动这个拨号盘(X位置被锁定)。当我放下它时,它会检查它的当前位置。如果它在两个数字之间,如3和4,它将移动(tween)到最接近的数字。
我想 每当我通过其中一个数字时,在我拖动表盘时,都会发出咔嚓声,使其感觉像一个锁定系统。
我试过 以此来移动转盘 Vector3.MoveTowards(curPos, toPos, speed);
并且在Update()中,我检查了我的当前位置是否等于我的触发位置。但正如预期的那样,这并不奏效。我的对象在触发位置上移动,但由于它从来没有完全等于它,所以它没有触发我的点击声。
播放声音时,我 掉 转盘是没有问题的。但我如何做到这一点,而我 拖拽 它?
这是我的解决方案。 如果你把这个脚本附加到一个游戏对象(GO)上,GO会移动到点击位置。如果它移动到某个触发位置上 (triggerPositions
)在y轴上,在这个例子中y=1,2或5,控制台返回 "TRIGGER"。
它的工作原理是这样的。 点击屏幕后,我们保存点击位置(toPos
),我们保存当前位置(curPos
). 如果当前位置与上一个位置不相等(lastPos
),然后我们通过检查GO的最后位置是否小于我们的触发位置来检查GO是否移动到了触发位置之上 (tp
) 和触发位置是否小于我们的当前位置?我们也检查相反的情况)THEN "触发器!"因为它通过了触发位置。
我们把上一个位置保存为当前位置,然后移动GO。重复。
tp
可以是任何flaot值。通过我的解决方案,你可以通过向数组中添加或删除数值来添加任意数量的触发位置。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;
}
}