繁体   English   中英

Unity - 检测鼠标点击数组中的特定元素

[英]Unity - Detect mouse click on specific element in array

我来自 web dev,最近开始学习 Unity。 我正在尝试 map 一个二维游戏对象数组,并检测鼠标点击特定元素,返回其索引。

我正在努力统一复制“array.map”function,我可以在其中攻击每个元素的“点击”。 我正在寻找类似的东西:

  for (int i = 0; i < Column; i++)
    {
        for (int j = 0; j < Row; j++)
        {
            void onClickDetected()
            {
                Debug.Log(i + j);
            }
        }
    }

在这里的任何帮助将不胜感激!

编辑:我假设您将 GameObjects 与 UI Button 组件一起使用。 如果您正在使用带有碰撞器的游戏对象,请使用@Quickz 的答案。

欢迎来到统一!

有两种方法可以处理将 onClick 添加到按钮数组。 You can either add the onClick in the inspector, then assign the function as well as parameters for the onClick or you can add the onClick in code by adding listeners to your buttons.

对于您的用例,只需打印按下哪个按钮索引,我会发现在代码中自动执行此任务更容易。 这是我将如何处理它。

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

public class YourClassNameHere : MonoBehaviour
{
    [SerializeField] private List<Button> myButtons = new List<Button>();
    
    private void Start()
    {
        for(int x = 0; x < myButtons.Count; ++x)
        {
            myButtons[x].onClick.AddListener(delegate{ButtonClicked(x);});   
        }
    }
    
    private void ButtonClicked(int idx)
    {
        Debug.log("Button of index: " + idx " was clicked!");   
    }
}

如果您更喜欢使用数组,只需确保您具有恒定大小并将private List<Button> myButtons = new List<Button>()交换为private UnityEngine.UI.Button[] myButtons = new UnityEngine.UI.Button[YOUR_MAX_SIZE_HERE]; . 您还需要将迭代器条件更改为 YOUR_MAX_SIZE_HERE 或使用 myButtons.Length 而不是 Count。

将此脚本添加到管理器,我会选择您的按钮的父 object。 然后 select 所有按钮对象并将它们拖到检查器中的列表或数组字段中以流行它们。 您还可以通过使用foreach (Transform child in parent)来获取代码中的所有引用,但是在处理场景中的 static 数量的对象时,我更愿意手动拖动引用。

我假设您有一堆非 UI GameObject类型的元素,您希望在这些元素上有一个可用的事件,以便您可以监听对它们执行的鼠标点击。

一种解决方案是使用C# 委托创建一个单独的脚本,该委托将由OnMouseDown触发。 您需要将此脚本附加到每个可点击元素。 然后,包含您的可点击元素数组的脚本会将一个方法附加到每个实例的事件。

例子

using System;
using UnityEngine;

public class ClickableObject : MonoBehaviour
{
    public event Action<ClickableObject> MouseDown;

    // A collider component is required for OnMouseDown to work
    private void OnMouseDown()
    {
        MouseDown?.Invoke(this);
    }
}
using UnityEngine;

public class TestScript : MonoBehaviour
{
    [SerializeField]
    private ClickableObject[] clickableObjects = new ClickableObject[0];

    private void Start()
    {
        foreach (ClickableObject unit in clickableObjects)
            unit.MouseDown += OnClickableObjectMouseDown;
    }

    private void OnClickableObjectMouseDown(ClickableObject unit)
    {
        Debug.Log($"{unit.name} clicked!");
    }

    private void OnDestroy()
    {
        foreach (ClickableObject unit in clickableObjects)
            unit.MouseDown -= OnClickableObjectMouseDown;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM