📌  相关文章
📜  如何统一单击游戏对象 - C# (1)

📅  最后修改于: 2023-12-03 14:53:14.759000             🧑  作者: Mango

如何统一单击游戏对象 - C#

在游戏开发中,我们经常需要对多个游戏对象进行统一的单击处理,比如玩家选择多个单位进行操作。本文将介绍如何使用 C# 实现这一功能,代码片段将按 markdown 标明。

实现思路

我们需要实现的是对多个游戏对象的单击事件进行统一处理,可以通过以下步骤来实现:

  1. 创建一个 GameObject 类型的列表,用于存储需要进行单击处理的游戏对象。
  2. 在每个游戏对象上添加一个组件,该组件继承自 MonoBehaviour,并实现单击处理的方法。
  3. 在该组件中使用射线检测(Raycast)来判断鼠标是否在游戏对象上单击,并在单击时调用该游戏对象的单击处理方法。
  4. 在程序中创建一个管理类,用于管理所有需要进行单击处理的游戏对象。
  5. 在管理类中使用事件(Event)来实现多个游戏对象的单击事件统一处理。
代码实现
添加单击处理组件

首先,我们需要为需要进行单击处理的游戏对象添加一个单击处理组件,该组件继承自 MonoBehaviour。在该组件中,我们需要实现单击处理方法。

public class ClickHandler : MonoBehaviour
{
    public void OnClick()
    {
        // 实现单击处理逻辑
    }
}
射线检测

在单击处理组件中,我们需要实现射线检测,来判断鼠标是否在游戏对象上单击。射线检测需要使用 Camera 类的 ScreenPointToRay 方法将屏幕坐标转换为射线,并使用 Physics 类的 Raycast 方法来检测射线与游戏对象是否相交。

public class ClickHandler : MonoBehaviour
{
    private Camera _mainCamera;

    private void Awake()
    {
        _mainCamera = Camera.main;
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = _mainCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;

            if (Physics.Raycast(ray, out hitInfo))
            {
                if (hitInfo.collider.gameObject == gameObject)
                {
                    OnClick();
                }
            }
        }
    }

    public void OnClick()
    {
        // 实现单击处理逻辑
    }
}
管理器类

接下来,我们需要在程序中创建一个管理器类,用于管理所有需要进行单击处理的游戏对象。在管理器类中,我们可以使用 List 来存储所有游戏对象,并使用事件来实现单击事件的统一处理。

public class ClickManager
{
    public static event Action<GameObject> OnClick;

    private static List<GameObject> _clickableObjects = new List<GameObject>();

    public static void AddClickableObject(GameObject obj)
    {
        ClickHandler clickHandler = obj.AddComponent<ClickHandler>();
        _clickableObjects.Add(obj);
    }

    public static void RemoveClickableObject(GameObject obj)
    {
        ClickHandler clickHandler = obj.GetComponent<ClickHandler>();

        if (clickHandler != null)
        {
            _clickableObjects.Remove(obj);
            Destroy(clickHandler);
        }
    }

    private static void HandleClick(GameObject obj)
    {
        if (OnClick != null)
        {
            OnClick(obj);
        }
    }
}
统一单击事件处理

最后,在管理器类中,我们可以使用事件来实现多个游戏对象的单击事件统一处理。在处理单击事件时,我们可以遍历所有需要进行单击处理的游戏对象,判断是否鼠标在游戏对象上单击,并调用对应的单击处理方法。

public static void HandleClickEvents()
{
    if (Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitInfo;

        if (Physics.Raycast(ray, out hitInfo))
        {
            if (_clickableObjects.Contains(hitInfo.collider.gameObject))
            {
                HandleClick(hitInfo.collider.gameObject);
            }
        }
    }
}
结论

通过以上步骤,我们可以实现对多个游戏对象的单击事件进行统一处理。我们可以使用管理器类来管理所有需要进行单击处理的游戏对象,并使用单击处理组件来实现单击处理逻辑。在处理单击事件时,我们可以使用事件来实现多个游戏对象的单击事件统一处理。