是否可以添加 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
是静态,而在UnityEvent
(Interactable.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 中添加新脚本?的主要内容,如果未能解决你的问题,请参考以下文章
js onclick="return test()"事件返回值,对有些事件,会影响默认动作的执行。如:onclick和onsubmit