Как отменить триггер щелчка мышью, если она переместилась после щелчка? - PullRequest
0 голосов
/ 29 февраля 2020

Я почти 24 часа пытался решить эту проблему.

У меня есть объект в моей сцене, который при щелчке вызывает переход к другой сцене. Я бы хотел, чтобы поведение этого объекта было похоже на кнопку пользовательского интерфейса.

В настоящее время я использую Input.GetMouseButtonUp (0), чтобы вызвать это событие. Проблема в том, что у меня есть сценарий, прикрепленный к основной камере, который позволяет вращать, масштабировать и перемещаться по сцене. Если пользователь случайно заканчивает отпускание мыши на этом объекте после перемещения камеры, это вызовет событие, так как объект считается нажатым.

Я бы хотел предотвратить это. Я думал об отмене события в случае обнаружения движения мыши, я не мог выполнить его. Или, может быть, был бы лучший подход для решения проблемы.

Буду очень признателен за помощь

Мой код ниже:

private void LateUpdate()
{

    //When mouse button is released
    if (Input.GetMouseButtonUp(0))
    {


            RaycastHit hit;
            //Create a ray that projects at the position of the clicked mouse position
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            //If the ray hits the target object
            if (Physics.Raycast(ray, out hit, 100.0f))
            {
            //Load the scene that corresponds to the clicked object
            LoadScene(hit.transform.gameObject);
            }

    }
}


public void LoadScene(GameObject go)
{
    //Load the level that corresponds to the clicked object
    SceneManager.LoadScene(go.name);
    //Print the name of the clicked object
    print(go.name);
}

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Большинство реализаций щелчков обнаруживают события как мыши, так и мыши, чтобы определить, был ли нажат объект.

Я бы предложил что-то вроде этого ...

if(Input.GetMouseButtonDown(0)) {
    mouseWasPressedOverObject = IsMouseOverObject();
} else if(Input.GetMouseButtonUp(0)) {
    if(mouseWasPressedOverObject && IsMouseOverObject()) {
        //Object clicked
    }
    mouseWasPressedOverObject = false;
}
0 голосов
/ 29 февраля 2020

Полагаю, я только что нашел решение, я добавил термин, что если мышь ничего не делает, мой новый код:

private void LateUpdate () {

    //When mouse button is released
    if (Input.GetMouseButtonUp(0))
    {

        //If the mouse moves after clicking
        if (Input.GetAxis("Mouse X") < 0 || (Input.GetAxis("Mouse X") > 0))
        {
            //Do nothing
        }
        else {
            //If no movement is detected, then send ray to object and trigger event
            RaycastHit hit;
            //Create a ray that projects at the position of the clicked mouse position
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            //If the ray hits the target object
            if (Physics.Raycast(ray, out hit, 100.0f))
            {
                //Load the scene that corresponds to the clicked object
                LoadScene(hit.transform.gameObject);
            }
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...