注:代码来源于unity源码
Scroll View对象
作用:滚动矩形与遮罩 (Mask) 相结合来创建滚动视图,在产生的视图中只有滚动矩形内的可滚动内容为可见状态。
使用 GameObject > UI > Scroll View 菜单选项时,默认情况下会采用此设置:
- 根游戏对象(Scroll View)具有滚动矩形(ScrollRect)组件。ScrollRect需要引用Viewport和Content的Rect Transform组件来获得相关属性。
- 视口(Viewport)具有遮罩(Mask)组件。
- 内容(Content)可添加布局组件。
- 滚动内容(Content Item)必须是Content的子项。
- 滚动条(如果使用)具有滚动条(Scrollbar)组件。请参阅滚动条页面了解有关滚动条设置的更多详细信息。
视口可以是根游戏对象,也可以是作为根的子项的单独游戏对象。如果使用自动隐藏的滚动条,则视口必须是子项。
滚动矩形(ScrollRect)组件
属性
- Content:对滚动内容(Content)的引用,当Content的大小大于Viewport的大小时才会产生遮罩和滚动。
- Horizontal:bool类型,选中表示启用水平滚动;
- Vertical:bool类型,选中表示启用垂直滚动;
- Movement Type:枚举类型,Unrestricted、Elastic 或 Clamped。
– Unrestricted模式:不受限制的运动。内容可以永远移动。
– Elastic 模式:弹性运动。允许内容暂时移出容器,但会有弹性地拉回。在内容到达滚动矩形边缘时弹回内容。Elasticity参数设置反弹量。
– Clamped 模式:加强运动。不能将内容移出其容器。
· 使用 Elastic 或 Clamped 可强制内容保持在滚动矩形的边界内。
· 目前只使用过Elastic 模式,还没遇到需要其他模式的情况。 - Inertia:如果设置 Inertia,则拖动指针再松开时内容将继续移动。如果未设置 Inertia,则只有进行拖动时内容才移动。
- Deceleration Rate:设置 Inertia 的情况下,减速率 (Deceleration Rate) 决定了内容停止移动的速度,每秒的速度 = 上一秒速度 * Deceleration Rate。速率为 0 将立即停止移动。值为 1 表示移动永不减速。
- Scroll Sensitivity:对滚轮和触控板滚动事件的敏感性。
- Viewport:对作为内容矩形变换父项的视口矩形变换的引用。
- Horizontal Scrollbar: 对水平滚动条元素的引用(可选)。
– Visibility:枚举类型,Permanent、AutoHide 和 AutoHideAndExpandViewport。滚动条是否应在不需要时自动隐藏以及是否还展开视口。
– Spacing:滚动条与视口之间的空间。 - Vertical Scrollbar 对垂直滚动条元素的引用(可选)。
– Visibility:滚动条是否应在不需要时自动隐藏以及是否还展开视口。
– Spacing:滚动条与视口之间的空间。
· 水平滚动条上的 (Scrollbar组件中)Direction 属性应设置为 Left To Right,而垂直滚动条上应设置为 Bottom To Top。
· 如果其中一个滚动条或两个滚动条的可见性行为都设置为 Auto Hide And Expand View,则在隐藏滚动条时会自动展开视口,以便占用滚动条原本使用的额外空间。如果使用此设置,视图的位置和大小将由滚动矩形决定,并且水平滚动条的宽度以及垂直滚动条的高度也由滚动矩形决定。使用此设置时,视口以及滚动条都必须是滚动矩形根游戏对象的子项。
· 使用内容 RectTransform 的轴心和锚点可以确定内容伸缩时在滚动视图内的对齐方式。如果内容应与顶部保持对齐,请将锚点设置为父项的顶部,并将轴心设置为顶部位置。
事件
On Value Changed:滚动矩形的滚动位置发生变化时调用的 UnityEvent。该事件可将当前滚动位置作为 Vector2 类型动态参数发送。
参数:
normalizedPosition:当前滚动位置,Vector2类型,位于(0,0)和(1,1)之间,(0,0)位于左下角。
定义:
public Vector2 normalizedPosition { get { return new Vector2(horizontalNormalizedPosition, verticalNormalizedPosition); } set { SetNormalizedPosition(value.x, 0); SetNormalizedPosition(value.y, 1); } }
使用示例:
using UnityEngine; using System.Collections; using UnityEngine.UI; // Required when Using UI elements. public class ExampleClass : MonoBehaviour { public ScrollRect myScrollRect; public Vector2 myPosition = new Vector2(0.5f, 0.5f); public void Start() { //Change the current scroll position. myScrollRect.normalizedPosition = myPosition; } }
定义 :
[Serializable]
/// <summary>
/// Event type used by the ScrollRect.
/// </summary>
public class ScrollRectEvent : UnityEvent<Vector2> {}
[SerializeField]
private ScrollRectEvent m_OnValueChanged = new ScrollRectEvent();
public ScrollRectEvent onValueChanged { get { return m_OnValueChanged; } set { m_OnValueChanged = value; } }
- onValueChanged用于监视ScrollRect对象中的更改。
- onValueChanged调用将使用UnityEvent.AddListener API来监视更改。 发生更改时,将调用用户提供的脚本代码。
- UI.ScrollRect._onValueChanged的UnityEvent.AddListener API使用Vector2。
- 注意:编辑器允许手动设置onValueChanged值。例如,可以将该值设置为仅在运行时运行。 这里还提供了要调用的对象和脚本函数。
- onValueChanged变量可以在运行时进行替代设置。下面的脚本示例(添加响应)展示了如何做到这一点。脚本已附加到ScrollRect对象。
添加响应:
using UnityEngine;
using UnityEngine.UI;
public class ExampleScript : MonoBehaviour
{
static ScrollRect scrollRect;
void Start()
{
scrollRect = GetComponent<ScrollRect>();
scrollRect.onValueChanged.AddListener(ListenerMethod);
}
public void ListenerMethod(Vector2 value)
{
Debug.Log("ListenerMethod: " + value);
}
}
脚本
- ScrollRect 不自行执行任何裁剪。在与 Mask 组件组合后,它可以变为滚动视图。
- 继承自:EventSystems.UIBehaviour
- 实现接口:IBeginDragHandler, ICanvasElement, IDragHandler, IEndDragHandler, IEventSystemHandler, IInitializePotentialDragHandler, ILayoutController, ILayoutElement, ILayoutGroup, IScrollHandler
- unity脚本API
变量(不可在组件中设置,可在外部调用):
//只读
var trans = ScrollRect.transform;
var obj = ScrollRect.gameObject;
//由布局系统调用
var floata = ScrollRect.flexibleHeight;
var floatb = ScrollRect.flexibleWidth;
var inta = ScrollRect.layoutPriority;//优先级
var floatc = ScrollRect.minHeight;
var floatd = ScrollRect.preferredHeight;
//继承自Behaviour
var bbola = ScrollRect.isActiveAndEnabled;
//可写
ScrollRect.normalizedPosition = new Vector2(horizontalNormalizedPosition, verticalNormalizedPosition); //(x,y):滚动位置,content相对于viewport的位置,(0,0)代表左下角
ScrollRect.verticalNormalizedPosition = 1f;
ScrollRect.horizontalNormalizedPosition = 1f;
ScrollRect.velocity = new Vector2();//content的移速,单位为每秒
ScrollRect.enabled = true;//继承自Behaviour,启用更新updated
ScrollRect.name = "";
ScrollRect.runInEditMode = true; //继承自MonoBehaviour,允许一个特定的MonoBehaviour实例在编辑模式下运行(仅在编辑器中可用)
ScrollRect.tag = ""; //继承自Component,The tag of this gameobject.
ScrollRect.useGUILayout = true; //继承自Component,禁用此功能可以跳过GUI布局阶段。
ScrollRect.hideFlags = HideFlags.HideAndDontSave;//继承自Object,对象应该被隐藏,保存在场景中,或用户是否可以修改
/*
public enum HideFlags
{
None = 0, //A normal, visible object. This is the default.
HideInHierarchy = 1, //The object will not appear in the hierarchy.
HideInInspector = 2, //It is not possible to view it in the inspector.
DontSaveInEditor = 4, //The object will not be saved to the Scene in the editor.
NotEditable = 8, //The object is not be editable in the inspector.<
DontSaveInBuild = 16, // 0x00000010,The object will not be saved when building a player.
DontUnloadUnusedAsset = 32, // 0x00000020,The object will not be unloaded by Resources.UnloadUnusedAssets.
DontSave = DontUnloadUnusedAsset | DontSaveInBuild | DontSaveInEditor, // 0x00000034,The object will not be saved to the Scene. It will not be destroyed when a new Scene is loaded. It is a shortcut for HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor | HideFlags.DontUnloadUnusedAsset.
HideAndDontSave = DontSave | NotEditable | HideInHierarchy, // 0x0000003D,The GameObject is not shown in the Hierarchy, not saved to to Scenes, and not unloaded by Resources.UnloadUnusedAssets.
}
*/
公共函数:
1)Rebuild(CanvasUpdate executing): void
- ICanvasElement(可以位于画布上的元素)接口中的回调,(网格重建)重新构建给定阶段的元素,在布局的时候被调用。
- 实现:
- if Prelayout:{UpdateCachedData:缓存数据,eg:m_HorizontalScrollbarRect};
- if PostLayout:{ UpdateBounds:调整边界;UpdateScrollbars;UpdatePrevData:更改ScrollRect中的数据之前保存PrevPosition,PrevViewBounds,PrevContentBounds}
2)LayoutComplete(): void
- ICanvasElement接口中的回调,此 ICanvasElement 完成布局时发送的回调。
3)GraphicUpdateComplete(): void
- ICanvasElement接口中的回调,此 ICanvasElement 完成 Graphic 重新构建时发送的回调。
4)IsActive(): bool
- 继承自UIBehaviour。
- 实现:是否处于激活状态且content不为空
5)StopMovement(): void 实现:将两个轴上的速度设置为零,以便内容停止移动。
6)OnScroll(PointerEventData data): void
- IScrollHandler接口中的回调。
- 实现:根据滚动轴的滚动偏移量更新ContentAnchoredPosition(content的枢轴相对于锚点参考点的位置)和Bounds。
7)OnInitializePotentialDrag(PointerEventData eventData): void
- IInitializePotentialDragHandler接口中的回调,当找到一个拖动目标开始拖动尚未生效前由 BaseInputModule 调用。
- 实现:初始化潜在阻力。
8)OnBeginDrag(PointerEventData eventData): void
- IBeginDragHandler接口中的回调,在拖动开始之前由 BaseInputModule (用于引发事件并将其发送到 GameObjects 的基本模块)调用,开始拖动时已选择控制柄。。
- 实现:
- UpdateBounds:调整边界,
- 将拖拽事件的点从世界坐标系转换为相对viewRect坐标系的点赋值给m_PointerStartLocalCursor,
- 将m_Content.anchoredPosition赋值给m_ContentStartPosition,
- 设置m_Dragging为true。
9)OnEndDrag(PointerEventData eventData): void
- IEndDragHandler接口中的回调,内容完成拖动后调用。
- 实现:m_Dragging = false;
10)OnDrag(PointerEventData eventData): void
- IDragHandler接口中的回调,在用户拖动UI元素时执行此操作,当发生拖动时,每次移动光标时都会调用此函数。
- 实现:
- 把当前拖拽事件的点从世界坐标系转换为viewRect坐标系上的点赋值给localCursor,
- UpdateBounds,使内容永远不会超出内容边界
- 计算从开始拖动起的拖动量 pointerDelta = localCursor - m_PointerStartLocalCursor;
- 计算content在viewRect坐标系下,与前一帧相比的相对偏移。offset = CalculateOffset(m_ContentStartPosition + pointerDelta - m_Content.anchoredPosition);
- position = m_ContentStartPosition + pointerDelta + offset;
- SetContentAnchoredPosition(position),设置content的position
11)CalculateLayoutInputHorizontal(): void
- ILayoutElement(如果组件实现 ILayoutElement,则自动布局系统会将它视为布局元素)接口中的回调,由布局系统调用。
- 布局系统会在查询 minWidth(可以向此布局元素分配的最小宽度)、preferredWidth(存在足够空间时,应向此布局元素分配的首选宽度) 和 flexibleWidth(存在额外的可用空间时,应向此布局元素分配的额外相对宽度) 之前调用 CalculateLayoutInputHorizontal。如果在调用 CalculateLayoutInputHorizontal 时缓存这些属性或许可以改善性能,这样无需在每次查询属性时重新计算它们。
- minWidth、preferredWidth 和 flexibleWidth 属性不应依赖于布局元素的 RectTransform 的任何属性,否则行为会不确定。
12)CalculateLayoutInputVertical(): void
- ILayoutElement接口中的回调,由布局系统调用。
- 布局系统会在查询 minHeight、preferredHeight 和 flexibleHeight 之前调用 CalculateLayoutInputVertical。如果在调用 CalculateLayoutInputVertical 时缓存这些属性或许可以改善性能,这样无需在每次查询属性时重新计算它们。
- minHeight、preferredHeight 和 flexibleHeight 属性可以依赖于 RectTransform 的水平方面,如宽度和位置的 X 分量。 可以始终依赖子布局元素上的 RectTransform 的任何属性。
13)SetLayoutHorizontal(): void
- ILayoutGroup(应驱动其子项的 RectTransform 的 ILayoutController)接口中的回调,由处理布局水平方面的自动布局系统调用。
- ILayoutGroup 派生自 ILayoutController(由控制 RectTransforms 布局的组件实现的基接口),需要实现相同的成员。
- 布局系统会首先调用 SetLayoutHorizontal,然后调用 SetLayoutVertical。
- 在 SetLayoutHorizontal 调用中,对其任何子项的 RectTransform 调用 LayoutUtility.GetMinWidth、LayoutUtility.GetPreferredWidth 和 LayoutUtility.GetFlexibleWidth 是有效的。
- 实现:
- 清空m_Tracker:DrivenRectTransformTracker(DrivenRectTransformTracker结构用来指定它驱动的是哪个RectTransforms,内含成员变量:List m_Tracked)。
- 如果m_HSliderExpand和m_VSliderExpand都是false,return。
- 添加一个需要驱动的RectTransform { 驱动属性的对象:ScrollRect;被驱动的RectTransform:viewRect;要驱动的属性:Anchors(包含AnchorMinX、AnchorMinY、AnchorMaxX、AnchorMaxY)| SizeDelta(包含SizeDeltaX、SizeDeltaY)| AnchoredPosition(包含AnchoredPositionY、AnchoredPositionX)}。
- 使视图全尺寸,看看内容是否适合。
- 重新计算此大小的内容布局,以查看在没有滚动条时是否合适。
- 根据内容是否需要滚动(在没有滚动条时是否合适,content的高度大于view的高度),重新计算viewRect的sizeDelta、m_ViewBounds和m_ContentBounds:
- (1)如果垂直方向需要滚动(m_VSliderExpand-可加垂直滚动条 && vScrollingNeeded-content的高度大于view的高度):启用垂直滚动条,水平收缩视图给垂直滚动条腾出空间,即计算viewRect.sizeDelta;重新计算content的布局,强制立即重建受计算影响的布局元素和子布局元素,解析子树的布局(当content小于viewport时,增加垂直滚动条收缩viewport时会同步收缩content使其更高,影响content的布局。为何要同步收缩content目的不明,但是这样启用垂直滚动条时不会影响到水平滚动条的启用);赋值m_ViewBounds和m_ContentBounds;
- (2)如果水平方向需要滚动(m_HSliderExpand-可加水平滚动条 && hScrollingNeeded-content的宽度大于view的宽度):启用水平滚动条,垂直收缩视图给水平滚动条腾出空间,即计算viewRect.sizeDelta;赋值m_ViewBounds和m_ContentBounds;(启用水平滚动条时并不会收缩content,所以不需要重新计算content的布局。但是可能会导致viewport缩小,变得小于content的大小,所以需要再次判断是否需要垂直滚动⇣。)
- (3)如果第一次判断时,垂直方向不需要滚动,但是水平方向需要滚动(垂直收缩了viewport,可能导致content的高度大于view的高度,变得垂直方向也需要滚动了),再次检查是否垂直滑块现在需要启动:启用垂直滚动条,水平收缩视图给垂直滚动条腾出空间,即计算viewRect.sizeDelta;
???为什么这里不用重新计算m_ViewBounds?加垂直滚动条时为什么不影响ViewBound?
14)SetLayoutVertical(): void
- ILayoutGroup接口中的回调,由处理布局垂直方面的自动布局系统调用。
- 在 SetLayoutVertical 调用中,对其任何子项的 RectTransform 调用 LayoutUtility.GetMinHeight、LayoutUtility.GetPreferredHeight 和 LayoutUtility.GetFlexibleHeight 是有效的。
- 实现:
- UpdateScrollbarLayout();//UpdateScrollbarLayout里将横向滚动条的宽度设置为ScrollRect的相同的值(如果有纵向滚动条,减掉其宽度及间隔),将纵向滚动条的高度设置为ScrollRect的相同的值(如果有横向滚动条,减掉其高度及间隔)。
- 并更新m_ViewBounds和m_ContentBounds。
继承的公共函数:
函数名 | 说明 |
---|---|
BroadcastMessage | 调用此游戏对象或其任何子项中的每个 MonoBehaviour 上名为 methodName 的方法。 |
CompareTag | 此游戏对象是否使用 tag 进行了标记? |
GetComponent | 如果游戏对象附加了类型为 type 的组件,则将其返回,否则返回 null。 |
GetComponentInChildren | 使用深度首次搜索返回 GameObject 或其任何子项中类型为 type 的组件。 |
GetComponentInParent | 返回 GameObject 或其任何父项中类型为 type 的组件。 |
GetComponents | 返回 GameObject 中类型为 type 的所有组件。 |
GetComponentsInChildren | 返回 GameObject 或其任何子项中类型为 type 的所有组件。 |
GetComponentsInParent | 返回 GameObject 或其任何父项中类型为 type 的所有组件。 |
SendMessage | 调用此游戏对象中的每个 MonoBehaviour 上名为 methodName 的方法。 |
SendMessageUpwards | 调用此游戏对象中的每个 MonoBehaviour 上或此行为的每个父级上名为 methodName 的方法。 |
CancelInvoke | 取消该 MonoBehaviour 上的所有 Invoke 调用。 |
Invoke | 在 time 秒后调用 methodName 方法。 |
InvokeRepeating | 在 time 秒后调用 methodName 方法,然后每 repeatRate 秒调用一次。 |
IsInvoking | 是否有任何待处理的 methodName 调用? |
StartCoroutine | 启动一个协同程序。 |
StopAllCoroutines | 停止在该行为上运行的所有协同程序。 |
StopCoroutine | 停止在该行为上运行的第一个名为 methodName 的协同程序或存储在 routine 中的协同程序。 |
GetInstanceID | 返回对象的实例 ID。 |
ToString | 返回 GameObject 的名称。 |
IsDestroyed | 如果行为的原生表示已被销毁,则返回 true。 |
继承的消息:
函数名 | 说明 |
---|---|
Awake | Awake 在加载脚本实例时调用。 |
FixedUpdate | 用于物理计算且独立于帧率的 MonoBehaviour.FixedUpdate 消息。 |
LateUpdate | 如果启用了 Behaviour,则每帧调用 LateUpdate。 |
OnAnimatorIK | 用于设置动画 IK(反向运动学)的回调。 |
OnAnimatorMove | 用于处理动画移动以修改根运动的回调。 |
OnApplicationFocus | 当玩家获得或失去焦点时,发送给所有 GameObject。 |
OnApplicationPause | 当应用程序暂停时,发送给所有 GameObject。 |
OnApplicationQuit | 在应用程序退出前,发送给所有游戏对象。 |
OnAudioFilterRead | 如果实现了 OnAudioFilterRead,Unity 将在音频 DSP 链中插入一个自定义滤波器。 |
OnBecameInvisible | OnBecameInvisible 在渲染器对任何摄像机都不可见时调用。 |
OnBecameVisible | OnBecameVisible 在渲染器变为对任意摄像机可见时调用。 |
OnCollisionEnter | 当该碰撞体/刚体已开始接触另一个刚体/碰撞体时,调用 OnCollisionEnter。 |
OnCollisionEnter2D | 当传入碰撞体与该对象的碰撞体接触时发送(仅限 2D 物理)。 |
OnCollisionExit | 当该碰撞体/刚体已停止接触另一个刚体/碰撞体时,调用 OnCollisionExit。 |
OnCollisionExit2D | 当另一个对象上的碰撞体停止接触该对象的碰撞体时发送(仅限 2D 物理)。 |
OnCollisionStay | 对应正在接触刚体/碰撞体的每一个碰撞体/刚体,每帧调用一次 :ref::OnCollisionStay。 |
OnCollisionStay2D | 在另一个对象上的碰撞体正在接触该对象的碰撞体时发送每个帧(仅限 2D 物理)。 |
OnConnectedToServer | 成功连接到服务器后在客户端上调用。 |
OnControllerColliderHit | 当该控制器在执行 Move 时撞到碰撞体时调用 OnControllerColliderHit。 |
OnDestroy | 销毁附加的行为将导致游戏或场景收到 OnDestroy。 |
OnDisconnectedFromServer | 当连接丢失或与服务器断开连接时,在客户端上调用。 |
OnDrawGizmos | 如果您想绘制能够选择并且始终绘制的辅助图标,则可以实现 OnDrawGizmos。 |
OnDrawGizmosSelected | 如果选择了对象,则实现 OnDrawGizmosSelected 来绘制辅助图标。 |
OnEnable | 该函数在对象变为启用和激活状态时调用。 |
OnFailedToConnect | 出于某种原因连接尝试失败时,在客户端上调用。 |
OnFailedToConnectToMasterServer | 在连接到 MasterServer 时发生问题的情况下,在客户端或服务器上调用。 |
OnGUI | 系统调用 OnGUI 来渲染和处理 GUI 事件。 |
OnJointBreak | 在附加到相同游戏对象的关节断开时调用。 |
OnJointBreak2D | 在附加到相同游戏对象的 Joint2D 断开时调用。 |
OnMasterServerEvent | 在从 MasterServer 报告事件时,在客户端或服务器上调用。 |
OnMouseDown | 当用户在 GUIElement 或 Collider 上按下鼠标按钮时,将调用 OnMouseDown。 |
OnMouseDrag | 当用户单击 GUIElement 或 Collider 并仍然按住鼠标时,将调用 OnMouseDrag。 |
OnMouseEnter | 当鼠标进入 GUIElement 或 Collider 时调用。 |
OnMouseExit | 当鼠标不再处于 GUIElement 或 Collider 上方时调用。 |
OnMouseOver | 当鼠标悬停在 GUIElement 或 Collider 上时,每帧调用一次。 |
OnMouseUp | 当用户松开鼠标按钮时,将调用 OnMouseUp。 |
OnMouseUpAsButton | 松开鼠标时,仅当鼠标在按下时所在的 GUIElement 或 Collider 上时,才调用 OnMouseUpAsButton。 |
OnNetworkInstantiate | 在已通过 Network.Instantiate 进行网络实例化的对象上调用。 |
OnParticleCollision | 当粒子击中碰撞体时,将调用 OnParticleCollision。 |
OnParticleSystemStopped | 系统中的所有粒子都死亡时,便会调用 OnParticleSystemStopped,然后将不再产生新粒子。在调用 Stop 之后,或者超过非循环系统的 Duration 属性时,将停止产生新粒子。 |
OnParticleTrigger | 粒子系统中的任何粒子满足触发模块中的条件时,将调用 OnParticleTrigger。 |
OnPlayerConnected | 每当有新玩家成功连接,就在服务器上调用。 |
OnPlayerDisconnected | 每当有玩家与服务器断开连接,就在服务器上调用。 |
OnPostRender | 在摄像机完成场景渲染后,将调用 OnPostRender。 |
OnPreCull | 在摄像机剔除场景前,将调用 OnPreCull。 |
OnPreRender | 在摄像机开始渲染场景前,将调用 OnPreRender。 |
OnRenderImage | OnRenderImage 在图像的所有渲染操作全部完成后调用。 |
OnRenderObject | 在摄像机渲染场景后,将调用 OnRenderObject。 |
OnSerializeNetworkView | 用于在网络视图监视的脚本中自定义变量同步。 |
OnServerInitialized | 每当调用 Network.InitializeServer 并且完成时,对该服务器调用该函数。 |
OnTransformChildrenChanged | 当 GameObject 的变换的子项列表发生更改时,将调用该函数。 |
OnTransformParentChanged | 当 GameObject 的变换的父属性发生更改时,将调用该函数。 |
OnTriggerEnter | GameObject 与另一 GameObject 碰撞时,将调用 OnTriggerEnter。 |
OnTriggerEnter2D | 当另一个对象进入附加到该对象的触发碰撞体时发送(仅限 2D 物理)。 |
OnTriggerExit | 当 Collider other 已停止接触该触发器时调用 OnTriggerExit。 |
OnTriggerExit2D | 当另一个对象离开附加到该对象的触发碰撞体时发送(仅限 2D 物理)。 |
OnTriggerStay | 对于接触触发器的每一个 Collider /other/,每次物理更新调用一次 OnTriggerStay。 |
OnTriggerStay2D | 在另一个对象位于附加到该对象的触发碰撞体之内时发送每个帧(仅限 2D 物理)。 |
OnValidate | 加载脚本后或 Inspector 中的值发生更改时,将调用该函数(只能在 Editor 中调用)。 |
OnWillRenderObject | 如果对象可见并且不是 UI 元素,则为每个摄像机调用 OnWillRenderObject。 |
Reset | 重置为默认值。 |
Start | 在首次调用任何 Update 方法之前启用脚本时,在帧上调用 Start。 |
Update | 如果启用了 MonoBehaviour,则每帧调用 Update。 |
补充,摘自:https://zhuanlan.zhihu.com/p/340598873
LateUpdate()
ScrollRect还重写了LateUpdate,这个方法是在所有组件Update调用完之后,每一帧都会被调用。在这个方法里,调用EnsureLayoutHasRebuilt确保Layout已经被重建,接着UpdateBounds更新边界。
如果m_Dragging为false,且content已经超出了可滚动范围(如果是Horizontal方向,计算当contentBounds的最小值的x大于viewBounds的最小值的x或contentBounds的最大值的x小于viewBounds的最大值的x时的offset偏移。如果offset不为0,就判定超出了可滚动范围。Vertical方向同理),且m_Velocity速度不为0,当ScrollRect设置为MovementType.Elastic,如果m_Inertia(惯性)为true,便根据m_DecelerationRate计算出一个新的惯性速度m_Velocity,否则应用弹簧物理的阻尼效果。便根据速度逐渐将content的坐标修正为合理的值。当ScrollRect设置为MovementType.Clamped,在ScrollRect原来位置的基础上直接加上Offset偏移。
如果在拖动中m_Dragging为true且m_Inertia(惯性)为true便根据content的当前位置和m_PrevPosition计算出一个新的惯性速度m_Velocity。
然后判断如果m_ViewBounds、m_ContentBounds、m_Content.anchoredPosition和旧数据不同,则更新Scrollbar的位置,发送OnValueChanged,并保存当前数据为旧数据。
最后,调用UpdateScrollbarVisibility更新ScrollBar的可见性。
补充知识点sizeDelta:
RectTransform.sizeDelta RectTransform的大小相对于锚点的距离。
如果锚点相同,sizeDelta的大小与RectTransform大小相同,如果锚点在四个父项的四个角中,sizeDelta的大小表示该RectTransform相比于父项的大小多少。
补充知识点RectTransform变换:
定位矩形变换时,首先确定它是否具有任何伸展行为,这很有用。当anchorMin和anchorMax属性不相同时会出现拉伸行为。
对于非拉伸Rect变换,通过设置anchoredPosition和sizeDelta属性可以非常容易地设置位置。anchoredPosition指定枢轴相对于锚点的位置。sizeDelta与没有拉伸时的大小相同。
对于拉伸Rect变换,使用offsetMin和offsetMax属性可以更简单地设置位置。offsetMin属性指定相对于左下角锚点的矩形的左下角。offsetMax属性指定相对于右上角锚点的矩形右上角。
补充知识点RectTransform:
RectTransform.GetWorldCorners 获取RectTransform的四个角的世界坐标。
遮罩(Mask)组件
遮罩(Mask) 不是可见的 UI 控件,而是一种修改控件子元素外观的方法。遮罩将子元素限制(即“掩盖”)为父元素的形状。因此,如果子项比父项大,则子项仅包含在父项以内的部分才可见。
Show Mask Graphic :是否应在子对象上使用 Alpha 绘制遮罩(父)对象的图形,就是是否显示该对象的Image。
遮罩的常见用法:
1)使用面板 (Panel) 对象作为“框架”显示大型图像的一小部分。为实现此目的,可先将图像设置为面板对象的子项。应调整图像的位置,使应该可见的区域直接位于面板区域的后面。
2)将一个遮罩组件添加到面板。面板外面的子图像区域将变得不可见,因为这些区域被面板的形状所掩盖。
3)如果图像随后移动,则只有面板暴露的部分可见。可通过滚动条来控制移动,从而创建可滚动的地图查看器之类的效果。
实现: 应使用 GPU 的模板缓冲区来实现遮罩。
第一个遮罩元素将 1 写入模板缓冲区。 遮罩下面的所有元素在渲染时进行检查,仅渲染到模板缓冲区中有 1 的区域。 *嵌套的遮罩会将增量位掩码写入缓冲区,这意味着可渲染的子项需要具有要渲染的逻辑和模板值。
Unity脚本API