首页 > 其他 > 详细

从 Toggleable 讲解如何拆分 MonoBehaviour

时间:2020-07-13 23:16:58      阅读:68      评论:0      收藏:0      [点我收藏+]

假如我们需要实现一个用 Toggle 控制 Button 是否可点击的功能,简单情况下我们可以直接实现一个 ToggleableButton,代码如下

public class TogglableButton : MonoBehaviour
{
    public Button button;
    public Toggle toggle;

    private void Awake()
    {
        toggle.onValueChanged.AddListener(OnToggle);
    }

    private void OnToggle(bool value)
    {
        button.interactable = value;
    }
}

到这里,我们这个组件也就可以用了,如果仅仅只是通过 Toggle 来控制,到这里也就可以结束了。

现在我们的需求发生了变化,需要点击屏幕任何位置控制 Button 是否可点击,那么我们修改一下 ToogleableButton,代码如下

public class TogglableButton : MonoBehaviour
{
    public Button button;
    public bool toggleValue;

    private void Update()
    {
        if (IsTap())
        {
            toggleValue = !toggleValue;
            OnToggle(toggleValue);
        }
    }

    private bool IsTap()
    {
        return Input.touchCount == 1 || Input.GetMouseButtonUp(0);
    }

    private void OnToggle(bool value)
    {
        button.interactable = value;
    }
}

到了这里,我们就开始要考虑,如果我们不仅仅只有 Button 这一种组件需要控制,控制的方式也不限于 Toggle 和 Tap 两种方式,这时我们改如何修改我们的代码呢。

首先,我们提取一个 Toggleable 的接口,表示该组件可以 Toggle 状态。

public interface Toggleable
{
    void OnToggle(bool value);
}

然后,我们对不同的组件实现具体的 Togglable 类,例如:

public class ToggleableButton : MonoBehaviour, Toggleable
{
    public Button button;

    public void OnToggle(bool value)
    {
        button.interactable = value;
    }
}
public class ToggleableGameObject : MonoBehaviour, Toggleable
{
    // 不能将 target 设置为自己,因为 GameObject 被禁用了之后将不再接受 Message
    public GameObject target;

    public void OnToggle(bool value)
    {
        target.SetActive(value);
    }
}

现在我们还需要增加一个控制器来触发 OnToggle 方法,这里我们用 Unity 的 SendMessage 功能来实现这个触发,先增加一个 ToggleController 的虚类。

public abstract class ToggleController : MonoBehaviour
{
    protected void OnToggleValueChanged(bool value)
    {
        SendMessage("OnToggle", value);
    }
}

当然此处你也可以不用 SendMessage,毕竟官方也不推荐我们继续使用 SendMessage,你可以用 GetComponents() 获取到 GameObject 上所有的 Toggleable 组件,遍历调用它们的 OnToggle 方法,代码就不在这里贴了。

然后实现不同类型的控制器,例如:

public class ToggleToggleController : ToggleController
{
    public Toggle toggle;

    private void Awake()
    {
        toggle.onValueChanged.AddListener(OnToggleValueChanged);
    }
}
public class TapToggleController : ToggleController
{
    public bool toggleValue;

    void Update()
    {
        if (IsTap())
        {
            toggleValue = !toggleValue;
            OnToggleValueChanged(toggleValue);
        }
    }

    private bool IsTap()
    {
        return Input.touchCount == 1 || Input.GetMouseButtonUp(0);
    }
}

这样,我们就可以在同一个 GameObject 上添加需要的 Toggleable 和 ToggleController 组件实现不同的控制方式了,例如:

通过 Toggle 控制 Button 是否可交互

技术分享图片

通过点击屏幕任意位置控制 Button 是否可交互

技术分享图片

通过点击屏幕任意位置控制 Image 的显示或隐藏

技术分享图片

从 Toggleable 讲解如何拆分 MonoBehaviour

原文:https://www.cnblogs.com/forhot2000/p/13296222.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!