Почему при наведении курсора мыши на объект в unity он называет его неправильным объектом?

#c# #unity3d #events

Вопрос:

Я решил попробовать создать простую игру-кликер для файлов cookie в качестве своего первого сольного проекта без каких-либо уроков или курсов, мне удалось дойти до того, что я могу нажать на свой «Cookie», и он добавляет 1 в счетчик cookieCounter, однако unity, похоже, думает, что все мои файлы cookie…

Не уверен, что это мой код или что-то в unity настроено неправильно, но я уверен, что кто-то здесь мог бы указать мне правильное направление.

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

public class cookieCounter : MonoBehaviour
{

    public TextMeshProUGUI countText;
    public GameObject Cookie;
    private int count = 0;
    private Rigidbody rb;
    private string Object;


    // Start is called before the first frame update
    void Start()
    {
        count = 0;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) // On left click
        {
            Debug.Log(gameObject.name); //Returns the Object of which was clicked on
            OnMouseOver();
            countText.text = count.ToString("Cookies: 0"); // Updates the cookie counter on screen
            Debug.Log(count); // Returns Final Count
        }

        

    }
    private void OnMouseOver() // Looks at mouse and what it is hovering
    {

        Object = (gameObject.name); // Detects what the mouse is hovering over

        if (Object == "Cookie") // Makes sure the object mouse is hovering is the "Cookie"
        {
            count  ; // Adds 1 to the cookie counter.
        }
    }

} 
 

Пожалуйста, игнорируйте неэффективный код, который я не делал раньше.

Ответ №1:

Вы проверяете , нажата ли мышь и есть ли текущий объект "Cookie" , но не проверяете, где произошел щелчок. Если Cookie объект использует те же Update / OnMouseOver методы, что и в коде вопроса, он будет увеличиваться count независимо от того, где был щелчок.

Вы можете исправить это, приняв во внимание положение мыши. Если файл cookie является пользовательским интерфейсом, вы можете позволить Button классу обрабатывать все, что связано с обнаружением щелчка мыши(простой способ).

Если Cookie-это 2D SpriteRenderer -объект(или 3D), то вы можете использовать EventSystem (возможно, уже включенный в ваш проект) и реализовать IPointerClickHandler в классе Cookie. Вы можете найти подробное решение в Интернете, например https://forum.unity.com/threads/solved-detecting-mouse-click-on-an-object-in-2d-game.478514/ .

Ответ №2:

Я думаю, что вместо этого вы можете использовать функцию OnMouseDown () (Ввод.GetMouseButtonDown(0)). https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html

Разница в том, что OnMouseDown будет вызываться при нажатии на объект (у объекта должен быть коллайдер). Ввод.GetMouseButtonDown(0) будет вызван, когда вы нажмете везде на экране.