【问题标题】:How do I create a model that functions as a button in unity?如何创建一个统一用作按钮的模型?
【发布时间】:2019-11-26 01:06:56
【问题描述】:

我是 Unity 新手。我创建了一个带有一些功能的按钮。我也有一个 3D 模型。我想将功能分配给我的模型而不是我的按钮。这样你可以点击模型,它会激活我的脚本。

最好的方法是什么?

我正在使用 Unity 2019.2.12f1 和 Visual Studio。

【问题讨论】:

    标签: c# unity3d button


    【解决方案1】:

    仅仅通过向模型添加脚本不会调用OnMouseDown() 函数。你需要先做以下事情:

    (a) 为您的模型添加一个盒子碰撞器 (b) 缩放盒子碰撞器,使其覆盖整个模型(包括边缘),您将看到绘制为盒子的绿线 (c) 将以下函数添加到您的脚本并将此脚本附加到您的模型:

    public void OnMouseDown()
      {
         Debug.Log("Model Clicked");
      }
    

    (d) 现在当你点击模型时,函数会被调用

    【讨论】:

      【解决方案2】:

      使用OnMouseDown() 函数。只要在 3D 模型上注册点击事件,就会激活此功能。以下是更多文档:https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html

      【讨论】:

      • 我将脚本添加到我的模型中,但单击模型时它仍然没有激活 OnMouseDown() 函数。请注意,我的模型只是 Canvas 中的标准模型。会不会是我遗漏了什么?
      • @TimMG 您的模型是否附加了对撞机?
      • @Saif 解释了你必须经历的过程,尝试按照他的步骤。
      【解决方案3】:

      我不会使用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 对象,则需要在场景中使用 ColliderEventSystem,并在相机中使用 PhysicsRaycaster 组件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-20
        • 2023-03-24
        • 2020-08-29
        • 2017-04-13
        相关资源
        最近更新 更多