【发布时间】:2019-11-26 01:06:56
【问题描述】:
我是 Unity 新手。我创建了一个带有一些功能的按钮。我也有一个 3D 模型。我想将功能分配给我的模型而不是我的按钮。这样你可以点击模型,它会激活我的脚本。
最好的方法是什么?
我正在使用 Unity 2019.2.12f1 和 Visual Studio。
【问题讨论】:
我是 Unity 新手。我创建了一个带有一些功能的按钮。我也有一个 3D 模型。我想将功能分配给我的模型而不是我的按钮。这样你可以点击模型,它会激活我的脚本。
最好的方法是什么?
我正在使用 Unity 2019.2.12f1 和 Visual Studio。
【问题讨论】:
仅仅通过向模型添加脚本不会调用OnMouseDown() 函数。你需要先做以下事情:
(a) 为您的模型添加一个盒子碰撞器 (b) 缩放盒子碰撞器,使其覆盖整个模型(包括边缘),您将看到绘制为盒子的绿线 (c) 将以下函数添加到您的脚本并将此脚本附加到您的模型:
public void OnMouseDown()
{
Debug.Log("Model Clicked");
}
(d) 现在当你点击模型时,函数会被调用
【讨论】:
使用OnMouseDown() 函数。只要在 3D 模型上注册点击事件,就会激活此功能。以下是更多文档:https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html。
【讨论】:
我不会使用OnMouseDown,而是使用类似于IPointerXYHandler 的接口实现您自己的按钮类
public class CustomButtom : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler
{
public enum ButtonState
{
Normal,
Hover,
Pressed,
Disabled
}
public UnityEvent onClick;
private bool _isDisabled;
public bool IsDisabled
{
get => _isDisabed;
set
{
SetState(value ?ButtonState.Disabled : ButtonState.Normal);
}
}
public void OnPointerEnter (PointerInputEvent eventData)
{
if(_isDisabled) return;
SetState(ButtonState.Hover);
}
public void OnPointerExit (PointerInputEvent eventData)
{
if(_isDisabled) return;
SetState(ButtonState.Normal);
}
public void OnPointerDown (PointerInputEvent eventData)
{
if(_isDisabled) return;
SetState(ButtonState.Pressed);
onClick.Invoke();
}
public void OnPointerUp(PointerInputEvent eventData)
{
If(_isDisabled) return;
SetState(ButtonState.Normal);
}
private void SetState(ButtonState state)
{
// TODO: handle states to change styles etc as feedback
_isDisabled = state == ButtonState.Disabled;
}
}
这必须放置在 3D/2D 对象上。如果它是一个 UI 元素,你很好。如果是 3D 对象,则需要在场景中使用 Collider、EventSystem,并在相机中使用 PhysicsRaycaster 组件。
【讨论】: