UGUI源码之Selectable
Selectable是Button、InputField、Toggle、ScrollBar、Slider、Dropdown的基类。
Selectable的继承的类与接口如下:
public class Selectable
:
UIBehaviour,
IMoveHandler,
IPointerDownHandler, IPointerUpHandler,
IPointerEnterHandler, IPointerExitHandler,
ISelectHandler, IDeselectHandler
继承自UIBehaviour的函数:
Awake:获取了一个Graphic组件赋值给m_TargetGraphic。在选择的Transition是Color Tint时,当Selectable的状态变化,会调用Graphic的CrossFadeColor函数,使颜色渐变。在选择的Transition是Sprite Swap时,当Selectable的状态变化,会获取Image(m_TargetGraphic as Image),修改其sprite。
OnEnable:把本实例加入到一个静态的List<Selectable > s_List中,然后设置实例状态,最后调用InternalEvaluateAndTransitionToSelectionState函数(会判断是否是禁用状态,然后调用DoStateTransition函数,根据m_Transition执行对应的过渡效果)。
OnDisable:把本实例从s_List中移除,并且调用InstantClearState函数清除状态。
OnDidApplyAnimationProperties:调用OnSetProperty函数,OnSetProperty函数里最终还是调用InternalEvaluateAndTransitionToSelectionState函数。
OnCanvasGroupChanged:CanvasGroup变化时,会判断CanvasGroup的Interactable是否为false,如果是则break。如果CanvasGroup的ignoreParentGroups为true的话,也break。那么表示Selectable被禁用了。然后调用OnSetProperty函数。
继承自IMoveHandler的函数:
OnMove:根据移动方向,导航到下一个Selectable组件。
继承自IPointerDownHandler的函数:OnPointerDown:调用EventSystem.current.SetSelectedGameObject(gameObject, eventData)(在EventSystem文字中讲到过这个函数)函数将自身设为选中对象,将isPointerDown设为true,调用EvaluateAndTransitionToSelectionState函数更新状态。
继承自IPointerUpHandler的函数:
OnPointerUp:将isPointerDown设为false,调用EvaluateAndTransitionToSelectionState函数更新状态。
继承自IPointerEnterHandler的函数:OnPointerEnter:将isPointerInside设为true,调用EvaluateAndTransitionToSelectionState函数更新状态。
继承自IPointerExitHandler的函数:
OnPointerExit:将isPointerInside设为false,调用EvaluateAndTransitionToSelectionState函数更新状态。
继承自ISelectHandler的函数:
OnSelect:将hasSelection设为true,调用EvaluateAndTransitionToSelectionState函数更新状态。
继承自OnDeselect的函数:
OnDeselect:将hasSelection设为false,调用EvaluateAndTransitionToSelectionState函数更新状态。
讲一下EvaluateAndTransitionToSelectionState和InternalEvaluateAndTransitionToSelectionState函数
private void EvaluateAndTransitionToSelectionState(BaseEventData eventData)
{
if (!IsActive() || !IsInteractable())
return; UpdateSelectionState(eventData);
InternalEvaluateAndTransitionToSelectionState(false);
}
通过UpdateSelectionState决定当前状态m_CurrentSelectionState。然后调用InternalEvaluateAndTransitionToSelectionState函数。
private void InternalEvaluateAndTransitionToSelectionState(bool instant)
{
var transitionState = m_CurrentSelectionState;
if (IsActive() && !IsInteractable())
transitionState = SelectionState.Disabled;
DoStateTransition(transitionState, instant);
}
会判断是否是禁用状态,然后调用DoStateTransition函数。在DoStateTransition中会根据m_Transition执行对应的过渡效果。
protected virtual void DoStateTransition(SelectionState state, bool instant)
{
Color tintColor;
Sprite transitionSprite;
string triggerName; switch (state)
{
case SelectionState.Normal:
tintColor = m_Colors.normalColor;
transitionSprite = null;
triggerName = m_AnimationTriggers.normalTrigger;
break;
case SelectionState.Highlighted:
tintColor = m_Colors.highlightedColor;
transitionSprite = m_SpriteState.highlightedSprite;
triggerName = m_AnimationTriggers.highlightedTrigger;
break;
case SelectionState.Pressed:
tintColor = m_Colors.pressedColor;
transitionSprite = m_SpriteState.pressedSprite;
triggerName = m_AnimationTriggers.pressedTrigger;
break;
case SelectionState.Disabled:
tintColor = m_Colors.disabledColor;
transitionSprite = m_SpriteState.disabledSprite;
triggerName = m_AnimationTriggers.disabledTrigger;
break;
default:
tintColor = Color.black;
transitionSprite = null;
triggerName = string.Empty;
break;
} if (gameObject.activeInHierarchy)
{
switch (m_Transition)
{
case Transition.ColorTint:
StartColorTween(tintColor * m_Colors.colorMultiplier, instant);
break;
case Transition.SpriteSwap:
DoSpriteSwap(transitionSprite);
break;
case Transition.Animation:
TriggerAnimation(triggerName);
break;
}
}
}
UGUI源码之Selectable的更多相关文章
- 【UGUI源码分析】Unity遮罩之Mask详细解读
遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...
- 【UGUI源码分析】Unity遮罩之RectMask2D详细解读
遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...
- UGUI源码之EventSystem
今天研究下UGUI的源码,先从EventSystem入手.EventSystem是用来处理点击.键盘输入以及触摸等事件的. 1.BaseInputModule EventSystem开头声明了两个变量 ...
- uGUI源码调试
uGUI源代码地址:https://bitbucket.org/Unity-Technologies/ui 工具编译后转换位置{Unity3D_Vserion}\Editor\Data\UnityEx ...
- UGUI源码之Graphic
Graphic是用来显示图像的一个抽象类,是MaskableGraphic的父类,而MaskableGraphic是Image.RawImage.Text的父类. Graphic继承于UIBehavi ...
- Unity UGUI图文混排源码(一)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- [UGUI]图文混排(二):Text源码分析
UGUI源码: https://bitbucket.org/Unity-Technologies/ui/downloads/?tab=tags 首先下载一份UGUI源码,这里我下载的版本是5.3.2f ...
- Unity UGUI图文混排源码(三) -- 动态表情
这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
随机推荐
- 手把手教你用Python实现自动特征工程
任何参与过机器学习比赛的人,都能深深体会特征工程在构建机器学习模型中的重要性,它决定了你在比赛排行榜中的位置. 特征工程具有强大的潜力,但是手动操作是个缓慢且艰巨的过程.Prateek Joshi,是 ...
- 基于ThinkPHP与阿里大于的PHP短信验证功能
https://blog.csdn.net/s371795639/article/details/53381274 PHP阿里大鱼短信验证 第一步 登陆阿里大于注册账号,在用户管理中心创建应用,确定A ...
- js(一) 三大事件 实现注册验证
ps:小声比比,为什么一周多没更,因为js真的好难啊. 上一周做了一整周的jsp+sevlet+mysql做了一个MVC模式的最基本的新闻系统源码会有空搞出来的 好累 好多的. 三大事件 (鼠标事件. ...
- 2019年第二阶段我要变强个人训练赛第八场 B.序列(seq)
传送门 B.序列(seq) •题目描述 给出一个长度为n的序列a,每次对序列进行一下的某一个操作. •输入 第一行两个整数n,q表示序列长度和操作个数. 接下来一行n个数,表示序列a. 接下来q行表示 ...
- There is no PasswordEncoder mapped for the id "null"的解决办法
今日在SpringBoot项目中使用 Spring Security ,登录时发现报500错,报错信息如下: There is no PasswordEncoder mapped for the id ...
- 基于AutoIt3的运维工具
#Region ;**** 编译指令由 AutoIt3Wrapper 选项编译窗口创建 **** #AutoIt3Wrapper_Icon=favicon.ico #AutoIt3Wrapper_Co ...
- H3C 主动方式建立连接过程
- MVC3 学习笔记 之(ajax表单)
mvc 提供了一种ajax提交表单的方式.与普通表单不同的是,它是一个异步表单. 在开始使用之前,需要引用以下文件: <script src="@Url.Content("~ ...
- js三大框架出现的意义
解决了原始html,css,js的UI与数据状态之间同步的难题,避免了大量的操作DOM代码. 使用了React,Angular和Vue,我们只需要定义一次 UI 界面,不再需要为每个操作编写特定的 U ...
- jQuery 工具类函数-字符串操作函数
调用名为$.trim的工具函数,能删除字符串中左右两边的空格符,但该函数不能删除字符串中间的空格,调用格式为: $.trim (str); 参数str表示需要删除左右两边空格符的字符串. <bo ...