unity笔记--Scroll View对象

注:代码来源于unity源码

Scroll View对象

作用:滚动矩形与遮罩 (Mask) 相结合来创建滚动视图,在产生的视图中只有滚动矩形内的可滚动内容为可见状态。
Scroll View
使用 GameObject > UI > Scroll View 菜单选项时,默认情况下会采用此设置:

  • 根游戏对象(Scroll View)具有滚动矩形(ScrollRect)组件。ScrollRect需要引用Viewport和Content的Rect Transform组件来获得相关属性。
  • 视口(Viewport)具有遮罩(Mask)组件。
  • 内容(Content)可添加布局组件。
  • 滚动内容(Content Item)必须是Content的子项。
  • 滚动条(如果使用)具有滚动条(Scrollbar)组件。请参阅滚动条页面了解有关滚动条设置的更多详细信息。

视口可以是根游戏对象,也可以是作为根的子项的单独游戏对象。如果使用自动隐藏的滚动条,则视口必须是子项。

滚动矩形(ScrollRect)组件

ScrollRect组件

属性

  1. Content:对滚动内容(Content)的引用,当Content的大小大于Viewport的大小时才会产生遮罩和滚动。
  2. Horizontal:bool类型,选中表示启用水平滚动;
  3. Vertical:bool类型,选中表示启用垂直滚动;
  4. Movement Type:枚举类型,Unrestricted、Elastic 或 Clamped。
      – Unrestricted模式:不受限制的运动。内容可以永远移动。
      – Elastic 模式:弹性运动。允许内容暂时移出容器,但会有弹性地拉回。在内容到达滚动矩形边缘时弹回内容。Elasticity参数设置反弹量。
      – Clamped 模式:加强运动。不能将内容移出其容器。
      · 使用 Elastic 或 Clamped 可强制内容保持在滚动矩形的边界内。
      · 目前只使用过Elastic 模式,还没遇到需要其他模式的情况。
  5. Inertia:如果设置 Inertia,则拖动指针再松开时内容将继续移动。如果未设置 Inertia,则只有进行拖动时内容才移动。
  6. Deceleration Rate:设置 Inertia 的情况下,减速率 (Deceleration Rate) 决定了内容停止移动的速度,每秒的速度 = 上一秒速度 * Deceleration Rate。速率为 0 将立即停止移动。值为 1 表示移动永不减速。
  7. Scroll Sensitivity:对滚轮和触控板滚动事件的敏感性。
  8. Viewport:对作为内容矩形变换父项的视口矩形变换的引用。
  9. Horizontal Scrollbar: 对水平滚动条元素的引用(可选)。
      – Visibility:枚举类型,Permanent、AutoHide 和 AutoHideAndExpandViewport。滚动条是否应在不需要时自动隐藏以及是否还展开视口。
      – Spacing:滚动条与视口之间的空间。
  10. 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。

继承的消息:

函数名说明
AwakeAwake 在加载脚本实例时调用。
FixedUpdate用于物理计算且独立于帧率的 MonoBehaviour.FixedUpdate 消息。
LateUpdate如果启用了 Behaviour,则每帧调用 LateUpdate。
OnAnimatorIK用于设置动画 IK(反向运动学)的回调。
OnAnimatorMove用于处理动画移动以修改根运动的回调。
OnApplicationFocus当玩家获得或失去焦点时,发送给所有 GameObject。
OnApplicationPause当应用程序暂停时,发送给所有 GameObject。
OnApplicationQuit在应用程序退出前,发送给所有游戏对象。
OnAudioFilterRead如果实现了 OnAudioFilterRead,Unity 将在音频 DSP 链中插入一个自定义滤波器。
OnBecameInvisibleOnBecameInvisible 在渲染器对任何摄像机都不可见时调用。
OnBecameVisibleOnBecameVisible 在渲染器变为对任意摄像机可见时调用。
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。
OnRenderImageOnRenderImage 在图像的所有渲染操作全部完成后调用。
OnRenderObject在摄像机渲染场景后,将调用 OnRenderObject。
OnSerializeNetworkView用于在网络视图监视的脚本中自定义变量同步。
OnServerInitialized每当调用 Network.InitializeServer 并且完成时,对该服务器调用该函数。
OnTransformChildrenChanged当 GameObject 的变换的子项列表发生更改时,将调用该函数。
OnTransformParentChanged当 GameObject 的变换的父属性发生更改时,将调用该函数。
OnTriggerEnterGameObject 与另一 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组件
遮罩(Mask) 不是可见的 UI 控件,而是一种修改控件子元素外观的方法。遮罩将子元素限制(即“掩盖”)为父元素的形状。因此,如果子项比父项大,则子项仅包含在父项以内的部分才可见。

Show Mask Graphic :是否应在子对象上使用 Alpha 绘制遮罩(父)对象的图形,就是是否显示该对象的Image。

遮罩的常见用法:
1)使用面板 (Panel) 对象作为“框架”显示大型图像的一小部分。为实现此目的,可先将图像设置为面板对象的子项。应调整图像的位置,使应该可见的区域直接位于面板区域的后面。

2)将一个遮罩组件添加到面板。面板外面的子图像区域将变得不可见,因为这些区域被面板的形状所掩盖。

3)如果图像随后移动,则只有面板暴露的部分可见。可通过滚动条来控制移动,从而创建可滚动的地图查看器之类的效果。

实现: 应使用 GPU 的模板缓冲区来实现遮罩。

第一个遮罩元素将 1 写入模板缓冲区。 遮罩下面的所有元素在渲染时进行检查,仅渲染到模板缓冲区中有 1 的区域。 *嵌套的遮罩会将增量位掩码写入缓冲区,这意味着可渲染的子项需要具有要渲染的逻辑和模板值。

Unity脚本API

滚动条(Scrollbar)组件

Scrollbar组件
unity手册
Unity脚本API

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity Mega-Fiers是一款强大的Unity插件,它为开发者提供了许多功能和工具,以帮助他们创建优秀的游戏体验。 首先,Unity Mega-Fiers具有强大的形变功能。开发者可以通过该插件实现各种形状的变换,包括弯曲、挤压、拉伸等。这为游戏中的人物、物体和环境提供了更多的自由度和个性化选项,使其更具动态和真实感。 其次,Unity Mega-Fiers还提供了高度的粒子系统控制能力。开发者可以使用该插件来创建更加逼真的粒子效果,并具有更准确的控制。这包括粒子的大小、颜色、速度等方面,使游戏中的特效更加出色。 另外,Unity Mega-Fiers还支持可编程网格。这意味着开发者可以通过脚本来控制网格的生成和变形,从而实现各种复杂的效果。无论是地形生成、水体模拟还是其他物体的变形,都可以通过该插件实现,并使游戏更加逼真和具有个性化。 除了以上功能,Unity Mega-Fiers还提供了其他诸多辅助工具,如动画控制、特效编辑等,为开发者提供了更丰富的开发选项和提升游戏质量的手段。 总结而言,Unity Mega-Fiers是一款功能强大的Unity插件,为开发者提供了丰富的形变、粒子系统控制和可编程网格等功能。它能够大幅提升游戏的真实感和品质,并为开发者提供更多的创作空间和个性化选项。无论是初学者还是有经验的开发者,都能够从中受益,并创造出出色的游戏作品。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值