Unity - удаление указанного c игрового объекта при наведении на него мыши / указателя - PullRequest
0 голосов
/ 12 июля 2020

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class doubleClick : MonoBehaviour
{
    private float firstClickTime, timebetweenClicks;
    private bool coroutineAllowed;
    private int clickCounter;
    public GameObject toDelete;
   

    // Start is called before the first frame update
    void Start()
    {
        firstClickTime = 0f;
        timebetweenClicks = 0.2f;
        clickCounter = 0;
        coroutineAllowed = true;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonUp(0))
            clickCounter += 1;

        if (clickCounter == 1 && coroutineAllowed)
        {
            firstClickTime = Time.time;
            StartCoroutine(DoubleClickDetection());
        }
    }

    private IEnumerator DoubleClickDetection()
    {
        coroutineAllowed = false;
        while (Time.time < firstClickTime + timebetweenClicks)
        {
           
            if (clickCounter == 2)
                {
                    //Destroy(toDelete);
                    break;
                }
                yield return new WaitForEndOfFrame();           
        }
        clickCounter = 0;
        firstClickTime = 0f;
        coroutineAllowed = true;
    }
}

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Я не вижу ничего, что выскакивает из вашего кода. Однако ответ Падии на правильном пути. Обработку ввода с помощью мыши, когда вы хотите взаимодействовать с объектами, лучше всего выполнять из этого объекта / префаба. Таким образом, вам гарантируется взаимодействие только с этим объектом. Если нет, то, вероятно, с вашим кодом что-то еще происходит.

К сожалению, для меня уже немного поздно разработать полное решение. Но вот возможное решение.

  1. Вставьте в код префаба функцию OnMouseDown. В этой функции проверьте, запущен ли таймер двойного щелчка. Если нет, установите флаг, чтобы сообщить префабу, что необходимо запустить таймер двойного щелчка (назовите его WaitingForTimerStart). В качестве альтернативы вы можете использовать перечисление для хранения состояния таймера. В любом случае, пока не запускайте таймер.

  2. В коде префаба вставьте функцию OnMouseUp. Это должно проверить, установлен ли флаг запуска таймера (WaitingForTimerStart). Если это так, установите другой флаг таймера, чтобы он запускал таймер (RunTimer).

  3. В функции обновления префаба запустите таймер. Я уверен, что вы знаете, что здесь делать.

  4. В функции OnMouseDown префаба (той, которую вы добавили ранее) проверьте, работает ли таймер. Если это так, то вы знаете, что был выполнен двойной щелчок. Уничтожьте объект.

Таким образом, нет необходимости проверять имена, использовать raycasting или сопрограммы. У каждого объекта будет свой таймер, и они будут полностью независимы друг от друга.

0 голосов
/ 12 июля 2020

Попробуйте этот код:

    private float firstClickTime, timebetweenClicks;
    private bool coroutineAllowed;
    private int clickCounter;
    RaycastHit hit;

    // Start is called before the first frame update
    void Start()
    {
        firstClickTime = 0f;
        timebetweenClicks = 0.2f;
        clickCounter = 0;
        coroutineAllowed = true;
    }

    private void OnMouseUp()
    {
        clickCounter += 1;
    }

    // Update is called once per frame
    void Update()
    {
        if (clickCounter == 1 && coroutineAllowed)
        {
            firstClickTime = Time.time;
            StartCoroutine(DoubleClickDetection());
        }
    }

    private IEnumerator DoubleClickDetection()
    {
        coroutineAllowed = false;
        while (Time.time < firstClickTime + timebetweenClicks)
        {

            if (clickCounter == 2)
            {
                if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit))
                {
                    if (hit.collider.transform == this.transform)
                    {
                        Destroy(this.gameObject);
                    }
                }
                break;
            }
            yield return new WaitForEndOfFrame();
        }
        clickCounter = 0;
        firstClickTime = 0f;
        coroutineAllowed = true;
    }

В этом коде используется функция OnMouseDown () Unity для определения момента щелчка мыши по игровому объекту и добавления 1 к переменной clickCounter. Также вы можете использовать функцию OnMouseUp (), если предпочитаете обнаруживать щелчок, когда мышь поднята.

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