当游戏对象在特定位置上移动时触发。

问题描述 投票:0回答:1

在我的项目中,我有 一个垂直的数字表盘,数字在0到9之间。我可以上下拖动这个拨号盘(X位置被锁定)。当我放下它时,它会检查它的当前位置。如果它在两个数字之间,如3和4,它将移动(tween)到最接近的数字。

我想 每当我通过其中一个数字时,在我拖动表盘时,都会发出咔嚓声,使其感觉像一个锁定系统。

我试过 以此来移动转盘 Vector3.MoveTowards(curPos, toPos, speed); 并且在Update()中,我检查了我的当前位置是否等于我的触发位置。但正如预期的那样,这并不奏效。我的对象在触发位置上移动,但由于它从来没有完全等于它,所以它没有触发我的点击声。

播放声音时,我 转盘是没有问题的。但我如何做到这一点,而我 拖拽 它?

c# unity3d position
1个回答
1
投票

这是我的解决方案。 如果你把这个脚本附加到一个游戏对象(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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.