UnityDynamicScrollRect
An optimized approach to lists with dozens of elements and a Pooling system
Install / Use
/learn @Mukarillo/UnityDynamicScrollRectREADME
UnityDynamicScrollRect
An optimized approach to lists with dozens of elements.
<p align="center"> <img src="https://github.com/Mukarillo/UnityDynamicScrollRect/blob/master/ReadmeAssets/dynamic_list_example.gif?raw=true" alt="Example"/> </p>How to use
you can find a pratical example inside this repository in DynamicScrollScene scene
1 - Create a class to store all the information that each element of the list will need.
public class ExampleData
{
public int postId;
public int id;
public string name;
public string email;
public string body;
}
2 - Create a class that extends DynamicScrollObject<ExampleData> and implement its abstract members (make sure to call base.updateScrollObject(item, index);) and set the object width and height in currentWidth and currentHeight.
public class ExampleDynamicObject : DynamicScrollObject<ExampleData>
{
public override float currentHeight { get; set; }
public override float currentWidth { get; set; }
private Text idText;
private Text nameEmailText;
private Text bodyText;
public void Awake()
{
currentHeight = GetComponent<RectTransform>().rect.height;
currentWidth = GetComponent<RectTransform>().rect.width;
idText = transform.Find("PostId").GetComponent<Text>();
nameEmailText = transform.Find("NameEmail").GetComponent<Text>();
bodyText = transform.Find("Body").GetComponent<Text>();
}
public override void updateScrollObject(ExampleData item, int index)
{
base.updateScrollObject(item, index);
idText.text = item.id.ToString();
nameEmailText.text = string.Format("{0} ({1})", item.name, item.email);
bodyText.text = item.body;
}
}
3 - Create a class to initiate the DynamicList (use DynamicScrollRect instead of ScrollRect)
public class ExampleScroll : MonoBehaviour
{
public DynamicScrollRect verticalScroll;
public GameObject referenceObject;
private DynamicScroll<ExampleData, ExampleDynamicObject> mVerticalDynamicScroll = new DynamicScroll<ExampleData, ExampleDynamicObject>();
public IEnumerator Start()
{
WWW www = new WWW(@"https://jsonplaceholder.typicode.com/comments");
yield return www;
var data = JsonHelper.getJsonArray<ExampleData>(www.text);
mVerticalDynamicScroll.spacing = 5f;
mVerticalDynamicScroll.Initiate(verticalScroll, data, 0, referenceObject);
}
}
DynamicScroll<T, T1> public overview
Properties
|name |type |description |
|--|--|--|
|spacing |float |Value that represent the spacing between elements of the list |
|centralizeOnStop |bool |If the list should centralize the closest element to the center of the viewport after stop moving |
|objectPool |readonly Pooling < T1 > |The elements of the list |
|OnDragEvent |Action < Vector2 > |Event that triggers whenever the user scrolls the list, the parameter represent the velocity of the drag |
|OnBeginDragEvent |UnityEvent < PointerEventData > |Event that triggers in the first frame of dragging |
|OnEndDragEvent |UnityEvent < PointerEventData > |Event that triggers in the last frame of dragging |
Methods
dynamicScroll.Initiate
-
Description: Initiate the scroll rect with
objReferenceobjects applyinginfoListdata. -
Parameters:
|name |type |description |
|--|--|--|
|scrollRect |ScrollRect |a reference to the scroll rect |
|infoList |T[] |the list with the data information |
|startIndex |int |the item of index startindex will be the first element of the list |
|objReference |GameObject |a reference of the object that will be inside the list |
|createMoreIfNeeded |bool |if the list needs more itens, it will create more if createMoreIfNeeded == true |
|forceAmount |int? |if setted, it will force forceAmount objects to be created at start |
dynamicScroll.ChangeList
-
Description: Change the current list of the scroll rect.
-
Parameters :
|name |type |description |
|--|--|--|
|infoList |T[] |the list with the data information |
|startIndex |int |the item of index startindex will be the first element of the list. If -1, the current index will be setted. |
|resetContentPosition |bool |reset list position |
dynamicScroll.RefreshPosition
- Description: Repaint the whole scroll rect. This is useful if any item inside the scroll rect changes the size (
currentWidthandcurrentHeight).
dynamicScroll.ToggleScroll
-
Description: Enable or Disable the ability to scroll the list.
-
Parameters :
|name |type |description |
|--|--|--|
|active |bool |enable or Disable the ability to scroll the list |
dynamicScroll.CanMove
-
Description: Returns true if all directions send thro parameter are available.
-
Parameters :
|name |type |description |
|--|--|--|
|directions |ScrollDirection |Enum flag with all the directions you want to know if are available |
dynamicScroll.MoveToIndex
-
Description: Tweens the content to centralize the object of index specified in the parameters.
-
Parameters :
|name |type |description |
|--|--|--|
|i |int |Index of the element to be centralized |
|totalTime |float? |Total time to the animation happen (if you choose to input this value, the next one will be ignored) |
|timePerElement |float? |This value will be multiplied by the difference between the current centralized element and the target element to get the totalTime |
dynamicScroll.GetCentralizedObject
- Description: Returns the closest element to the center of the viewport.
dynamicScroll.GetLowest
- Description: Returns the most left (if horizontal scroll) or most bottom (if vertical scroll) T1 object.
dynamicScroll.GetHighest
- Description: Returns the most right (if horizontal scroll) or most upper (if vertical scroll) T1 object.
Related Skills
node-connect
346.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
107.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
346.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
346.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
