博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unity3d自定义Toggle组件,解决设置isOn自动调用方法
阅读量:6371 次
发布时间:2019-06-23

本文共 4545 字,大约阅读时间需要 15 分钟。

当我们在使用unity自带的Toggle组件的时候,我们是通过Toggle组件上的isOn属性得知是开启我们的功能面板还是关闭,这时候通常我们会给toggle绑定一个方法,当我们点击toggle的时候,调用方法,同时播放点击音效,可是有些时候,需要我们在切换界面的时候通过其它方法来关闭我们的属性isOn为false,方便我们下次点击的时候,isOn为true,这时候,我们单独对toggle的isOn属性赋值时会调用一次我们的方法,同时还会播放一次声音,恶心的事情就此发生,所以在项目中不得不重写了此组件,以方便项目中多处使用,下面是MyToggle脚本,挂载到对象身上即可,和unity自带的Toggle用法一样,只是在手动设置isOn属性的时候不会自动调用方法。

using System;using UnityEditor;using UnityEngine;using UnityEngine.Events;using UnityEngine.EventSystems;using UnityEngine.Serialization;using UnityEngine.UI;/// /// 自定义Toggle组件/// [RequireComponent(typeof(RectTransform))]public class MyToggle : Selectable, IEventSystemHandler, IPointerClickHandler, ISubmitHandler, ICanvasElement{    ///     /// toggle为true时切换显示的底图    ///     public Graphic m_ChangeImage;    [SerializeField]    [FormerlySerializedAs("m_IsActive")]    private bool m_IsOn;    public MyToggle.ToggleTransition toggleTransition = MyToggle.ToggleTransition.Fade;    public Toggle.ToggleEvent onValueChanged = new Toggle.ToggleEvent();        ///     /// 设置ison属性(自动调用一次方法)    ///     public bool isOn    {        get        {            return this.m_IsOn;        }        set        {            this.Set(value);        }    }    ///     /// 设置ison属性(不会自动调用方法)    ///     public bool IsOn    {        get        {            return this.m_IsOn;        }        set        {            this.Set(value, value, value);        }    }    protected MyToggle()    {    }    public virtual void Rebuild(CanvasUpdate executing)    {        if (executing != CanvasUpdate.Prelayout)            return;        this.onValueChanged.Invoke(this.m_IsOn);    }    public virtual void LayoutComplete()    {    }    public virtual void GraphicUpdateComplete()    {    }    protected override void OnEnable()    {        base.OnEnable();        this.PlayEffect(true);        this.IsOn = false;    }    protected override void OnDisable()    {        base.OnDisable();        this.IsOn = false;    }    private void Set(bool value)    {        this.Set(value, true);    }    private void Set(bool value, bool sendCallback)    {        if (this.m_IsOn == value)            return;        this.m_IsOn = value;        this.PlayEffect(this.toggleTransition == MyToggle.ToggleTransition.None);        if (!sendCallback)            return;        this.onValueChanged.Invoke(this.m_IsOn);    }    private void Set(bool value, bool sendCallback, bool call)    {        if (this.m_IsOn == value)            return;        this.m_IsOn = value;        this.PlayEffect(this.toggleTransition == MyToggle.ToggleTransition.None);        if (!sendCallback)            return;    }    private void InternalToggle()    {        if (!this.IsActive() || !this.IsInteractable())            return;        this.isOn = !this.isOn;    }    ///     /// 点击事件    ///     /// Current event.    public virtual void OnPointerClick(PointerEventData eventData)    {        if (eventData.button != PointerEventData.InputButton.Left)            return;        this.InternalToggle();    }    public virtual void OnSubmit(BaseEventData eventData)    {        this.InternalToggle();    }         public enum ToggleTransition    {        None,        Fade,    }    [Serializable]    public class ToggleEvent : UnityEvent
{ } protected override void OnDidApplyAnimationProperties() { if ((UnityEngine.Object)this.m_ChangeImage != (UnityEngine.Object)null) { bool flag = !Mathf.Approximately(this.m_ChangeImage.canvasRenderer.GetColor().a, 0.0f); if (this.m_IsOn != flag) { this.m_IsOn = flag; this.Set(!flag); } } base.OnDidApplyAnimationProperties(); } private void PlayEffect(bool instant) { if ((UnityEngine.Object)this.m_ChangeImage == (UnityEngine.Object)null) return; if (!Application.isPlaying) this.m_ChangeImage.canvasRenderer.SetAlpha(!this.m_IsOn ? 0.0f : 1f); else this.m_ChangeImage.CrossFadeAlpha(!this.m_IsOn ? 0.0f : 1f, !instant ? 0.1f : 0.0f, true); } protected override void Start() { this.PlayEffect(true); } protected override void OnValidate() { base.OnValidate(); this.Set(this.m_IsOn, false); this.PlayEffect(this.toggleTransition == MyToggle.ToggleTransition.None); if (PrefabUtility.GetPrefabType((UnityEngine.Object)this) == PrefabType.Prefab || Application.isPlaying) return; CanvasUpdateRegistry.RegisterCanvasElementForLayoutRebuild((ICanvasElement)this); } }

转载地址:http://hxyqa.baihongyu.com/

你可能感兴趣的文章
C# 属性事件一些设置说明
查看>>
去除UITableViewheader footer黏性
查看>>
windows2003 iis6.0不能显示asp.net选项
查看>>
xen MacOS
查看>>
如何学好C和C++
查看>>
Gitlab通过custom_hooks自动更新服务器代码
查看>>
python 如何判断调用系统命令是否执行成功
查看>>
Lesson10 vSphere 管理特性
查看>>
memcache 扩展和 memcached扩展安装
查看>>
好程序员的查克拉---自信
查看>>
获取设备列表
查看>>
Django使用网上模板做个能展示的博客
查看>>
基于同IP不同端口,同端口不同Ip的虚拟主机 基于FQDN的虚拟主机
查看>>
项目软件集成三方模块,编译中int32和uint32定义冲突解决方法
查看>>
StretchDIBits速度测试(HALFTONE)
查看>>
在.NET Workflo“.NET研究”w 3.5中使用多线程提高工作流性能
查看>>
验证Oracle处理速度
查看>>
自己写一个jquery
查看>>
艾伟:C#中抽象类和接口的区别
查看>>
Flink - NetworkEnvironment
查看>>