假如我们需要实现一个用 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
然后实现不同类型的控制器,例如:
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