是否可以添加 onClick() 事件动作(在 GameObject 下拉菜单中)而不在 Unity 中添加新脚本?

Posted

技术标签:

【中文标题】是否可以添加 onClick() 事件动作(在 GameObject 下拉菜单中)而不在 Unity 中添加新脚本?【英文标题】:Is it possible to add a onClick() Event action(in GameObject dropdown) without adding new script in Unity? 【发布时间】:2021-11-14 21:11:53 【问题描述】:

我有一个 MRTK Slate,它带有可关闭的按钮。

按下关闭按钮时,Slate 被禁用但不会被销毁。这是因为在Events部分>Interactable script>GameObject.SetActive()是默认设置的,如图:

我想在点击关闭按钮后销毁石板。

我知道我可以通过编写脚本、将 slate 预制件附加到脚本(或将按钮的父级直到我将 slate 作为父游戏对象)、调用函数并使用 GameObject.Destroy() 来做到这一点。

但我想了解 Interactable 脚本中的 GameObject 下拉菜单是如何填充的:

我了解其他下拉菜单(如变换、跟随我切换、Solverhandler 等)会显示,因为它们附加到 Slate。

但是如何使用 GameObject 选项?这似乎是一个基本的事情,但我想确定它是如何编码的。

如果可以在 Gameobject 下拉列表中添加我的新操作,如果可以,如何?

我花时间查看 Interactable 和其他的脚本,但我是 C# 的初学者,无法看到执行此操作的代码在哪里。

任何意见都会对我有所帮助。

【问题讨论】:

GameObject & Transform 下拉菜单是 Unity 内部脚本的一部分。它们将始终存在,因为游戏场景中的每个对象都是一个 GameObject 并且每个 GameObject 都需要一个 Transform 组件。 好的,如果我理解正确,我们无法编辑这些脚本,因为它们是内部的? 是的,我相信这是不可能的。 您的具体需求是什么?为什么要修改 GameObject 下拉菜单? 我想销毁石板而不是在按下关闭按钮时简单地禁用它。我想知道是否没有。通过添加似乎来自 GameObject 下拉列表的代码,可以将脚本的数量保持在最低限度并破坏石板。因此,我想知道是否可以在 MRTK 提供的脚本中对其进行编辑。 【参考方案1】:

不,您不能,因为Object.Destroy静态,而在UnityEventInteractable.OnClick 使用)中,您只能通过 Inspector 选择实例方法。

你至少需要一个最小的组件,比如

public class ObjectDestroyer : MonoBehaviour

    public void DestroyObject()
    
        Destroy(this.gameObject);
    

或者如果您不想通过 Inspector 自动执行此操作

public class ObjectDestroyer : MonoBehaviour

    // store the itneractable reference
    [Tootltip("If not provided uses the Interactable on this GameObject")]
    [SerialzieField] private Interactable _interactable;

    // Optionally provide a different target, otherwise destroys the Interactable
    [Tooltip("If not provided destroys the GameObject of the Interactable")]
    [SerializeField] private GameObject _targetToDestroy;

    private void Awake()
    
        // use get component as fallback if no Interactable was provided
        if(!_interactable) _interactable = GetComponent<Interactable>();

        // attach the callback on runtime (won't appear in the inspector)
        _interactable.OnClick.AddListener(DestroyObject);
    

    private void DestroyObject()
    
        // destroy the object of the interactable if no target was provided
        if(!_targetToDestroy) _targetToDestroy = _interactable.gameObject;

        Destroy(_targetToDestroy);
    

【讨论】:

以上是关于是否可以添加 onClick() 事件动作(在 GameObject 下拉菜单中)而不在 Unity 中添加新脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决onTouch和onClick事件冲突的问题

HTML中在a标签中添加onclick事件

android 的Button怎样自动触发按下的动作

如何解决blur事件和click事件冲突问题

js onclick="return test()"事件返回值,对有些事件,会影响默认动作的执行。如:onclick和onsubmit

如何解决控件的onTouch事件与onClick事件的冲突问题