添加虚拟列表插件

This commit is contained in:
2025-07-19 20:29:55 +08:00
parent 656e0b0652
commit 645d57c7c9
42 changed files with 233 additions and 4263 deletions

View File

@@ -0,0 +1,169 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2144746790689463245
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4433487652878264011}
- component: {fileID: 4598575638834120631}
- component: {fileID: 979075320078913737}
m_Layer: 5
m_Name: Text (Legacy)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4433487652878264011
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2144746790689463245}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 180925369222541037}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 200, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4598575638834120631
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2144746790689463245}
m_CullTransparentMesh: 1
--- !u!114 &979075320078913737
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2144746790689463245}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 30
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 3
m_MaxSize: 40
m_Alignment: 4
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: New Text
--- !u!1 &3291374494798134796
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 180925369222541037}
- component: {fileID: 8800204140203976600}
- component: {fileID: 7345399528756125477}
- component: {fileID: 6862961716912536255}
m_Layer: 5
m_Name: Item
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &180925369222541037
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3291374494798134796}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 4433487652878264011}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 100, y: -360}
m_SizeDelta: {x: 200, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &8800204140203976600
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3291374494798134796}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: 200
m_PreferredHeight: 50
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!114 &7345399528756125477
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3291374494798134796}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d7f07a01cdb5c7c4aa72a3a420035842, type: 3}
m_Name:
m_EditorClassIdentifier:
entries:
- key: MainItem
prefab: {fileID: 2144746790689463245}
selectedComponentName: Text
--- !u!114 &6862961716912536255
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3291374494798134796}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 391eb6d877254380bf561b14e4be836f, type: 3}
m_Name:
m_EditorClassIdentifier:
text: {fileID: 979075320078913737}

View File

@@ -1,7 +1,6 @@
fileFormatVersion: 2
guid: b10ceda9bec25b14ea5e190eb9bb0341
folderAsset: yes
DefaultImporter:
guid: 6c9bacbab1aa5fd449644937705dee17
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:

View File

@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using CreatGame.UI;
using Unity.VisualScripting;
using UnityEditor;
using UnityEditorInternal;
@@ -47,6 +48,7 @@ public class UIExportToolEditor : Editor
List<string> uguiComponentNames = new List<string>();
if (prefab != null)
{
var components = prefab.GetComponents<Component>();
uguiComponentNames = prefab.GetComponents<Component>()
.Where(c => c != null && IsUGUIComponent(c))
.Select(c => c.GetType().Name)
@@ -110,7 +112,8 @@ public class UIExportToolEditor : Editor
|| component is Slider
|| component is ScrollRect
|| component is Dropdown
|| component is InputField;
|| component is InputField
|| component is UILoopList;
}
/// <summary>
/// 导出代码
@@ -131,7 +134,7 @@ public class UIExportToolEditor : Editor
sb.AppendLine();
sb.AppendLine("namespace CreatGame.UI");
sb.AppendLine("{");
sb.AppendLine($" public class {className} : UIViewBase");
sb.AppendLine($" public partial class {className} : UIViewBase");
sb.AppendLine(" {");
sb.AppendLine($" public override string PrefabPath => \"Prefabs/UI/{target.GameObject().name}\";");

View File

@@ -300,7 +300,7 @@ Camera:
m_GameObject: {fileID: 291576390}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 3
m_ClearFlags: 2
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
m_projectionMatrixMode: 1
m_GateFitMode: 2

View File

@@ -131,7 +131,7 @@ namespace CreatGame.AssetBundle
/// <returns></returns>
private AssetBundleData CacheAssetBundles(string bundleName, GameObject bundle = null)
{
var data = new AssetBundleData(){assetBundleName = bundleName, assetBundle = GameObject.Instantiate(bundle)};
var data = new AssetBundleData(){assetBundleName = bundleName, assetBundle = bundle};
assetBundles.Add(bundleName, data);
return data;
}

View File

@@ -0,0 +1,20 @@
using UnityEngine;
using UnityEngine.UI;
namespace CreatGame.UI
{
public class MainItem : MonoBehaviour
{
public Text text;
void ScrollCellIndex (int idx)
{
string name = "Cell " + idx.ToString ();
if (text != null)
{
text.text = name;
}
gameObject.name = name;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 391eb6d877254380bf561b14e4be836f
timeCreated: 1752925668

View File

@@ -1,4 +1,5 @@
using UnityEngine;
using System.Collections.Generic;
using UnityEngine;
namespace CreatGame.UI
{

View File

@@ -1,311 +0,0 @@
using UnityEditor;
using UnityEditor.AnimatedValues;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;
namespace UnityEditor.UI
{
[CustomEditor(typeof(LoopScrollRectBase), true)]
public class LoopScrollRectInspector : Editor
{
SerializedProperty m_Content;
SerializedProperty m_Horizontal;
SerializedProperty m_Vertical;
SerializedProperty m_MovementType;
SerializedProperty m_Elasticity;
SerializedProperty m_Inertia;
SerializedProperty m_DecelerationRate;
SerializedProperty m_ScrollSensitivity;
SerializedProperty m_Viewport;
SerializedProperty m_HorizontalScrollbar;
SerializedProperty m_VerticalScrollbar;
SerializedProperty m_HorizontalScrollbarVisibility;
SerializedProperty m_VerticalScrollbarVisibility;
SerializedProperty m_HorizontalScrollbarSpacing;
SerializedProperty m_VerticalScrollbarSpacing;
SerializedProperty m_OnValueChanged;
AnimBool m_ShowElasticity;
AnimBool m_ShowDecelerationRate;
bool m_ViewportIsNotChild, m_HScrollbarIsNotChild, m_VScrollbarIsNotChild;
static string s_HError = "For this visibility mode, the Viewport property and the Horizontal Scrollbar property both needs to be set to a Rect Transform that is a child to the Scroll Rect.";
static string s_VError = "For this visibility mode, the Viewport property and the Vertical Scrollbar property both needs to be set to a Rect Transform that is a child to the Scroll Rect.";
//==========LoopScrollRect==========
SerializedProperty totalCount;
SerializedProperty reverseDirection;
int firstItem = 0, lastItem = 0, scrollIndex = 0;
float firstOffset = 0.0f, lastOffset = 0.0f, scrollOffset = 0;
LoopScrollRectBase.ScrollMode scrollMode = LoopScrollRectBase.ScrollMode.ToStart;
float scrollSpeed = 1000, scrollTime = 1;
protected virtual void OnEnable()
{
m_Content = serializedObject.FindProperty("m_Content");
m_Horizontal = serializedObject.FindProperty("m_Horizontal");
m_Vertical = serializedObject.FindProperty("m_Vertical");
m_MovementType = serializedObject.FindProperty("m_MovementType");
m_Elasticity = serializedObject.FindProperty("m_Elasticity");
m_Inertia = serializedObject.FindProperty("m_Inertia");
m_DecelerationRate = serializedObject.FindProperty("m_DecelerationRate");
m_ScrollSensitivity = serializedObject.FindProperty("m_ScrollSensitivity");
m_Viewport = serializedObject.FindProperty("m_Viewport");
m_HorizontalScrollbar = serializedObject.FindProperty("m_HorizontalScrollbar");
m_VerticalScrollbar = serializedObject.FindProperty("m_VerticalScrollbar");
m_HorizontalScrollbarVisibility = serializedObject.FindProperty("m_HorizontalScrollbarVisibility");
m_VerticalScrollbarVisibility = serializedObject.FindProperty("m_VerticalScrollbarVisibility");
m_HorizontalScrollbarSpacing = serializedObject.FindProperty("m_HorizontalScrollbarSpacing");
m_VerticalScrollbarSpacing = serializedObject.FindProperty("m_VerticalScrollbarSpacing");
m_OnValueChanged = serializedObject.FindProperty("m_OnValueChanged");
m_ShowElasticity = new AnimBool(Repaint);
m_ShowDecelerationRate = new AnimBool(Repaint);
SetAnimBools(true);
//==========LoopScrollRect==========
totalCount = serializedObject.FindProperty("totalCount");
reverseDirection = serializedObject.FindProperty("reverseDirection");
}
protected virtual void OnDisable()
{
m_ShowElasticity.valueChanged.RemoveListener(Repaint);
m_ShowDecelerationRate.valueChanged.RemoveListener(Repaint);
}
void SetAnimBools(bool instant)
{
SetAnimBool(m_ShowElasticity, !m_MovementType.hasMultipleDifferentValues && m_MovementType.enumValueIndex == (int)ScrollRect.MovementType.Elastic, instant);
SetAnimBool(m_ShowDecelerationRate, !m_Inertia.hasMultipleDifferentValues && m_Inertia.boolValue == true, instant);
}
void SetAnimBool(AnimBool a, bool value, bool instant)
{
if (instant)
a.value = value;
else
a.target = value;
}
void CalculateCachedValues()
{
m_ViewportIsNotChild = false;
m_HScrollbarIsNotChild = false;
m_VScrollbarIsNotChild = false;
if (targets.Length == 1)
{
Transform transform = ((LoopScrollRectBase)target).transform;
if (m_Viewport.objectReferenceValue == null || ((RectTransform)m_Viewport.objectReferenceValue).transform.parent != transform)
m_ViewportIsNotChild = true;
if (m_HorizontalScrollbar.objectReferenceValue == null || ((Scrollbar)m_HorizontalScrollbar.objectReferenceValue).transform.parent != transform)
m_HScrollbarIsNotChild = true;
if (m_VerticalScrollbar.objectReferenceValue == null || ((Scrollbar)m_VerticalScrollbar.objectReferenceValue).transform.parent != transform)
m_VScrollbarIsNotChild = true;
}
}
public override void OnInspectorGUI()
{
SetAnimBools(false);
serializedObject.Update();
// Once we have a reliable way to know if the object changed, only re-cache in that case.
CalculateCachedValues();
EditorGUILayout.LabelField("Scroll Rect", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(m_Content);
EditorGUILayout.PropertyField(m_Horizontal);
EditorGUILayout.PropertyField(m_Vertical);
EditorGUILayout.PropertyField(m_MovementType);
if (EditorGUILayout.BeginFadeGroup(m_ShowElasticity.faded))
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_Elasticity);
EditorGUI.indentLevel--;
}
EditorGUILayout.EndFadeGroup();
EditorGUILayout.PropertyField(m_Inertia);
if (EditorGUILayout.BeginFadeGroup(m_ShowDecelerationRate.faded))
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_DecelerationRate);
EditorGUI.indentLevel--;
}
EditorGUILayout.EndFadeGroup();
EditorGUILayout.PropertyField(m_ScrollSensitivity);
EditorGUILayout.Space();
EditorGUILayout.PropertyField(m_Viewport);
EditorGUILayout.PropertyField(m_HorizontalScrollbar);
if (m_HorizontalScrollbar.objectReferenceValue && !m_HorizontalScrollbar.hasMultipleDifferentValues)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_HorizontalScrollbarVisibility, EditorGUIUtility.TrTextContent("Visibility"));
if ((ScrollRect.ScrollbarVisibility)m_HorizontalScrollbarVisibility.enumValueIndex == ScrollRect.ScrollbarVisibility.AutoHideAndExpandViewport
&& !m_HorizontalScrollbarVisibility.hasMultipleDifferentValues)
{
if (m_ViewportIsNotChild || m_HScrollbarIsNotChild)
EditorGUILayout.HelpBox(s_HError, MessageType.Error);
EditorGUILayout.PropertyField(m_HorizontalScrollbarSpacing, EditorGUIUtility.TrTextContent("Spacing"));
}
EditorGUI.indentLevel--;
}
EditorGUILayout.PropertyField(m_VerticalScrollbar);
if (m_VerticalScrollbar.objectReferenceValue && !m_VerticalScrollbar.hasMultipleDifferentValues)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_VerticalScrollbarVisibility, EditorGUIUtility.TrTextContent("Visibility"));
if ((ScrollRect.ScrollbarVisibility)m_VerticalScrollbarVisibility.enumValueIndex == ScrollRect.ScrollbarVisibility.AutoHideAndExpandViewport
&& !m_VerticalScrollbarVisibility.hasMultipleDifferentValues)
{
if (m_ViewportIsNotChild || m_VScrollbarIsNotChild)
EditorGUILayout.HelpBox(s_VError, MessageType.Error);
EditorGUILayout.PropertyField(m_VerticalScrollbarSpacing, EditorGUIUtility.TrTextContent("Spacing"));
}
EditorGUI.indentLevel--;
}
EditorGUILayout.PropertyField(m_OnValueChanged);
//==========LoopScrollRect==========
EditorGUILayout.LabelField("Loop Scroll Rect", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(totalCount);
EditorGUILayout.PropertyField(reverseDirection);
serializedObject.ApplyModifiedProperties();
LoopScrollRectBase scroll = (LoopScrollRectBase)target;
GUI.enabled = Application.isPlaying;
const float buttonWidth = 100f;
#region Basic Test
EditorGUILayout.LabelField("Basic Test", EditorStyles.boldLabel);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Clear existing items");
GUILayout.FlexibleSpace();
if (GUILayout.Button("Clear", GUILayout.Width(buttonWidth)))
{
scroll.ClearCells();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Refresh existing items(only update data)");
GUILayout.FlexibleSpace();
if (GUILayout.Button("Refresh", GUILayout.Width(buttonWidth)))
{
scroll.RefreshCells();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Refill(0, 0.0f)");
GUILayout.FlexibleSpace();
if(GUILayout.Button("Refill", GUILayout.Width(buttonWidth)))
{
scroll.RefillCells();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("RefillFromEnd(0, 0.0f)");
GUILayout.FlexibleSpace();
if(GUILayout.Button("RefillFromEnd", GUILayout.Width(buttonWidth)))
{
scroll.RefillCellsFromEnd();
}
EditorGUILayout.EndHorizontal();
#endregion
#region Refill Test
EditorGUILayout.LabelField("Refill Test", EditorStyles.boldLabel);
firstItem = EditorGUILayout.IntField("FirstItem", firstItem);
firstOffset = EditorGUILayout.FloatField("FirstOffset", firstOffset);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Get first item and offset");
GUILayout.FlexibleSpace();
if (GUILayout.Button("GetFirstItem", GUILayout.Width(buttonWidth)))
{
firstItem = scroll.GetFirstItem(out firstOffset);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Refill with first item and offset");
GUILayout.FlexibleSpace();
if(GUILayout.Button("Refill", GUILayout.Width(buttonWidth)))
{
scroll.RefillCells(scroll.reverseDirection ? (scroll.totalCount - firstItem) : firstItem, firstOffset);
}
EditorGUILayout.EndHorizontal();
#endregion
#region Refill Test
EditorGUILayout.LabelField("RefillFromEnd Test", EditorStyles.boldLabel);
lastItem = EditorGUILayout.IntField("LastItem", lastItem);
lastOffset = EditorGUILayout.FloatField("LastOffset", lastOffset);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Get last item and offset");
GUILayout.FlexibleSpace();
if (GUILayout.Button("GetLastItem", GUILayout.Width(buttonWidth)))
{
lastItem = scroll.GetLastItem(out lastOffset);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("RefillFromEnd with last item and offset");
GUILayout.FlexibleSpace();
if(GUILayout.Button("RefillFromEnd", GUILayout.Width(buttonWidth)))
{
scroll.RefillCellsFromEnd(scroll.reverseDirection ? lastItem : (scroll.totalCount - lastItem), lastOffset);
}
EditorGUILayout.EndHorizontal();
#endregion
#region Scroll Test
EditorGUILayout.LabelField("Scroll Test", EditorStyles.boldLabel);
scrollIndex = EditorGUILayout.IntField("ScrollIndex", scrollIndex);
scrollOffset = EditorGUILayout.FloatField("ScrollOffset", scrollOffset);
scrollMode = (LoopScrollRectBase.ScrollMode)EditorGUILayout.EnumPopup("Mode", scrollMode);
scrollSpeed = EditorGUILayout.FloatField("Speed", scrollSpeed);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Scroll to index and offset with speed");
GUILayout.FlexibleSpace();
if(GUILayout.Button("ScrollToCell", GUILayout.Width(buttonWidth)))
{
scroll.ScrollToCell(scrollIndex, scrollSpeed, scrollOffset, scrollMode);
}
EditorGUILayout.EndHorizontal();
scrollTime = EditorGUILayout.FloatField("Time", scrollTime);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Scroll to index and offset whtin time");
GUILayout.FlexibleSpace();
if(GUILayout.Button("ScrollToCellWithinTime", GUILayout.Width(buttonWidth)))
{
scroll.ScrollToCellWithinTime(scrollIndex, scrollTime, scrollOffset, scrollMode);
}
EditorGUILayout.EndHorizontal();
#endregion
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 216d44a40b90b944db6c5f4624768e58
timeCreated: 1439395663
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,182 +0,0 @@
using UnityEngine;
using System.Collections.Generic;
namespace UnityEngine.UI
{
public static class SGDefaultControls
{
#region code from DefaultControls.cs
public struct Resources
{
public Sprite standard;
public Sprite background;
public Sprite inputField;
public Sprite knob;
public Sprite checkmark;
public Sprite dropdown;
public Sprite mask;
}
private const float kWidth = 160f;
private const float kThickHeight = 30f;
private const float kThinHeight = 20f;
//private static Vector2 s_ThickElementSize = new Vector2(kWidth, kThickHeight);
//private static Vector2 s_ThinElementSize = new Vector2(kWidth, kThinHeight);
//private static Vector2 s_ImageElementSize = new Vector2(100f, 100f);
//private static Color s_DefaultSelectableColor = new Color(1f, 1f, 1f, 1f);
//private static Color s_PanelColor = new Color(1f, 1f, 1f, 0.392f);
private static Color s_TextColor = new Color(50f / 255f, 50f / 255f, 50f / 255f, 1f);
// Helper methods at top
private static GameObject CreateUIElementRoot(string name, Vector2 size)
{
GameObject child = new GameObject(name);
RectTransform rectTransform = child.AddComponent<RectTransform>();
rectTransform.sizeDelta = size;
return child;
}
static GameObject CreateUIObject(string name, GameObject parent)
{
GameObject go = new GameObject(name);
go.AddComponent<RectTransform>();
SetParentAndAlign(go, parent);
return go;
}
private static void SetDefaultTextValues(Text lbl)
{
// Set text values we want across UI elements in default controls.
// Don't set values which are the same as the default values for the Text component,
// since there's no point in that, and it's good to keep them as consistent as possible.
lbl.color = s_TextColor;
}
private static void SetDefaultColorTransitionValues(Selectable slider)
{
ColorBlock colors = slider.colors;
colors.highlightedColor = new Color(0.882f, 0.882f, 0.882f);
colors.pressedColor = new Color(0.698f, 0.698f, 0.698f);
colors.disabledColor = new Color(0.521f, 0.521f, 0.521f);
}
private static void SetParentAndAlign(GameObject child, GameObject parent)
{
if (parent == null)
return;
child.transform.SetParent(parent.transform, false);
SetLayerRecursively(child, parent.layer);
}
private static void SetLayerRecursively(GameObject go, int layer)
{
go.layer = layer;
Transform t = go.transform;
for (int i = 0; i < t.childCount; i++)
SetLayerRecursively(t.GetChild(i).gameObject, layer);
}
#endregion
public static GameObject CreateLoopHorizontalScrollRect(DefaultControls.Resources resources)
{
GameObject root = CreateUIElementRoot("Loop Horizontal Scroll Rect", new Vector2(200, 200));
GameObject viewport = CreateUIObject("Viewport", root);
RectTransform viewportRT = viewport.GetComponent<RectTransform>();
viewportRT.anchorMin = new Vector2(0, 0);
viewportRT.anchorMax = new Vector2(1, 1);
viewportRT.sizeDelta = new Vector2(0, 0);
viewportRT.pivot = new Vector2(0.5f, 0.5f);
viewport.AddComponent<RectMask2D>();
GameObject content = CreateUIObject("Content", viewport);
RectTransform contentRT = content.GetComponent<RectTransform>();
contentRT.anchorMin = new Vector2(0, 0);
contentRT.anchorMax = new Vector2(0, 1);
contentRT.sizeDelta = new Vector2(0, 0);
contentRT.pivot = new Vector2(0, 0.5f);
// Setup UI components.
LoopHorizontalScrollRect scrollRect = root.AddComponent<LoopHorizontalScrollRect>();
scrollRect.content = contentRT;
scrollRect.viewport = viewportRT;
scrollRect.horizontalScrollbar = null;
scrollRect.verticalScrollbar = null;
scrollRect.horizontal = true;
scrollRect.vertical = false;
scrollRect.horizontalScrollbarVisibility = LoopScrollRect.ScrollbarVisibility.Permanent;
scrollRect.verticalScrollbarVisibility = LoopScrollRect.ScrollbarVisibility.Permanent;
scrollRect.horizontalScrollbarSpacing = 0;
scrollRect.verticalScrollbarSpacing = 0;
root.AddComponent<CreatGame.UI.UILoopList>();
HorizontalLayoutGroup layoutGroup = content.AddComponent<HorizontalLayoutGroup>();
layoutGroup.childAlignment = TextAnchor.MiddleLeft;
layoutGroup.childForceExpandWidth = false;
layoutGroup.childForceExpandHeight = true;
ContentSizeFitter sizeFitter = content.AddComponent<ContentSizeFitter>();
sizeFitter.horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
sizeFitter.verticalFit = ContentSizeFitter.FitMode.Unconstrained;
return root;
}
public static GameObject CreateLoopVerticalScrollRect(DefaultControls.Resources resources)
{
GameObject root = CreateUIElementRoot("Loop Vertical Scroll Rect", new Vector2(200, 200));
GameObject viewport = CreateUIObject("Viewport", root);
RectTransform viewportRT = viewport.GetComponent<RectTransform>();
viewportRT.anchorMin = new Vector2(0, 0);
viewportRT.anchorMax = new Vector2(1, 1);
viewportRT.sizeDelta = new Vector2(0, 0);
viewportRT.pivot = new Vector2(0.5f, 0.5f);
viewport.AddComponent<RectMask2D>();
GameObject content = CreateUIObject("Content", viewport);
RectTransform contentRT = content.GetComponent<RectTransform>();
contentRT.anchorMin = new Vector2(0, 1);
contentRT.anchorMax = new Vector2(1, 1);
contentRT.sizeDelta = new Vector2(0, 0);
contentRT.pivot = new Vector2(0.5f, 1);
// Setup UI components.
LoopVerticalScrollRect scrollRect = root.AddComponent<LoopVerticalScrollRect>();
scrollRect.content = contentRT;
scrollRect.viewport = viewportRT;
scrollRect.horizontalScrollbar = null;
scrollRect.verticalScrollbar = null;
scrollRect.horizontal = false;
scrollRect.vertical = true;
scrollRect.horizontalScrollbarVisibility = LoopScrollRect.ScrollbarVisibility.Permanent;
scrollRect.verticalScrollbarVisibility = LoopScrollRect.ScrollbarVisibility.Permanent;
scrollRect.horizontalScrollbarSpacing = 0;
scrollRect.verticalScrollbarSpacing = 0;
root.AddComponent<CreatGame.UI.UILoopList>();
VerticalLayoutGroup layoutGroup = content.AddComponent<VerticalLayoutGroup>();
layoutGroup.childAlignment = TextAnchor.UpperCenter;
layoutGroup.childForceExpandWidth = true;
layoutGroup.childForceExpandHeight = false;
ContentSizeFitter sizeFitter = content.AddComponent<ContentSizeFitter>();
sizeFitter.horizontalFit = ContentSizeFitter.FitMode.Unconstrained;
sizeFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
return root;
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 9e2cfa47387224a4eb069fc6dc8ac8b3
timeCreated: 1476279563
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,151 +0,0 @@
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace UnityEditor.UI
{
static internal class SGMenuOptions
{
#region code from MenuOptions.cs
private const string kUILayerName = "UI";
private const string kStandardSpritePath = "UI/Skin/UISprite.psd";
private const string kBackgroundSpritePath = "UI/Skin/Background.psd";
private const string kInputFieldBackgroundPath = "UI/Skin/InputFieldBackground.psd";
private const string kKnobPath = "UI/Skin/Knob.psd";
private const string kCheckmarkPath = "UI/Skin/Checkmark.psd";
private const string kDropdownArrowPath = "UI/Skin/DropdownArrow.psd";
private const string kMaskPath = "UI/Skin/UIMask.psd";
static private DefaultControls.Resources s_StandardResources;
static private DefaultControls.Resources GetStandardResources()
{
if (s_StandardResources.standard == null)
{
s_StandardResources.standard = AssetDatabase.GetBuiltinExtraResource<Sprite>(kStandardSpritePath);
s_StandardResources.background = AssetDatabase.GetBuiltinExtraResource<Sprite>(kBackgroundSpritePath);
s_StandardResources.inputField = AssetDatabase.GetBuiltinExtraResource<Sprite>(kInputFieldBackgroundPath);
s_StandardResources.knob = AssetDatabase.GetBuiltinExtraResource<Sprite>(kKnobPath);
s_StandardResources.checkmark = AssetDatabase.GetBuiltinExtraResource<Sprite>(kCheckmarkPath);
s_StandardResources.dropdown = AssetDatabase.GetBuiltinExtraResource<Sprite>(kDropdownArrowPath);
s_StandardResources.mask = AssetDatabase.GetBuiltinExtraResource<Sprite>(kMaskPath);
}
return s_StandardResources;
}
private static void SetPositionVisibleinSceneView(RectTransform canvasRTransform, RectTransform itemTransform)
{
// Find the best scene view
SceneView sceneView = SceneView.lastActiveSceneView;
if (sceneView == null && SceneView.sceneViews.Count > 0)
sceneView = SceneView.sceneViews[0] as SceneView;
// Couldn't find a SceneView. Don't set position.
if (sceneView == null || sceneView.camera == null)
return;
// Create world space Plane from canvas position.
Vector2 localPlanePosition;
Camera camera = sceneView.camera;
Vector3 position = Vector3.zero;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRTransform, new Vector2(camera.pixelWidth / 2, camera.pixelHeight / 2), camera, out localPlanePosition))
{
// Adjust for canvas pivot
localPlanePosition.x = localPlanePosition.x + canvasRTransform.sizeDelta.x * canvasRTransform.pivot.x;
localPlanePosition.y = localPlanePosition.y + canvasRTransform.sizeDelta.y * canvasRTransform.pivot.y;
localPlanePosition.x = Mathf.Clamp(localPlanePosition.x, 0, canvasRTransform.sizeDelta.x);
localPlanePosition.y = Mathf.Clamp(localPlanePosition.y, 0, canvasRTransform.sizeDelta.y);
// Adjust for anchoring
position.x = localPlanePosition.x - canvasRTransform.sizeDelta.x * itemTransform.anchorMin.x;
position.y = localPlanePosition.y - canvasRTransform.sizeDelta.y * itemTransform.anchorMin.y;
Vector3 minLocalPosition;
minLocalPosition.x = canvasRTransform.sizeDelta.x * (0 - canvasRTransform.pivot.x) + itemTransform.sizeDelta.x * itemTransform.pivot.x;
minLocalPosition.y = canvasRTransform.sizeDelta.y * (0 - canvasRTransform.pivot.y) + itemTransform.sizeDelta.y * itemTransform.pivot.y;
Vector3 maxLocalPosition;
maxLocalPosition.x = canvasRTransform.sizeDelta.x * (1 - canvasRTransform.pivot.x) - itemTransform.sizeDelta.x * itemTransform.pivot.x;
maxLocalPosition.y = canvasRTransform.sizeDelta.y * (1 - canvasRTransform.pivot.y) - itemTransform.sizeDelta.y * itemTransform.pivot.y;
position.x = Mathf.Clamp(position.x, minLocalPosition.x, maxLocalPosition.x);
position.y = Mathf.Clamp(position.y, minLocalPosition.y, maxLocalPosition.y);
}
itemTransform.anchoredPosition = position;
itemTransform.localRotation = Quaternion.identity;
itemTransform.localScale = Vector3.one;
}
private static void PlaceUIElementRoot(GameObject element, MenuCommand menuCommand)
{
GameObject parent = menuCommand.context as GameObject;
if (parent == null || parent.GetComponentInParent<Canvas>() == null)
{
parent = GetOrCreateCanvasGameObject();
}
string uniqueName = GameObjectUtility.GetUniqueNameForSibling(parent.transform, element.name);
element.name = uniqueName;
Undo.RegisterCreatedObjectUndo(element, "Create " + element.name);
Undo.SetTransformParent(element.transform, parent.transform, "Parent " + element.name);
GameObjectUtility.SetParentAndAlign(element, parent);
if (parent != menuCommand.context) // not a context click, so center in sceneview
SetPositionVisibleinSceneView(parent.GetComponent<RectTransform>(), element.GetComponent<RectTransform>());
Selection.activeGameObject = element;
}
static public GameObject CreateNewUI()
{
// Root for the UI
var root = new GameObject("Canvas");
root.layer = LayerMask.NameToLayer(kUILayerName);
Canvas canvas = root.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
root.AddComponent<CanvasScaler>();
root.AddComponent<GraphicRaycaster>();
Undo.RegisterCreatedObjectUndo(root, "Create " + root.name);
// if there is no event system add one...
// CreateEventSystem(false);
return root;
}
// Helper function that returns a Canvas GameObject; preferably a parent of the selection, or other existing Canvas.
static public GameObject GetOrCreateCanvasGameObject()
{
GameObject selectedGo = Selection.activeGameObject;
// Try to find a gameobject that is the selected GO or one if its parents.
Canvas canvas = (selectedGo != null) ? selectedGo.GetComponentInParent<Canvas>() : null;
if (canvas != null && canvas.gameObject.activeInHierarchy)
return canvas.gameObject;
// No canvas in selection or its parents? Then use just any canvas..
canvas = Object.FindObjectOfType(typeof(Canvas)) as Canvas;
if (canvas != null && canvas.gameObject.activeInHierarchy)
return canvas.gameObject;
// No canvas in the scene at all? Then create a new one.
return SGMenuOptions.CreateNewUI();
}
#endregion
[MenuItem("GameObject/UI/Loop Horizontal Scroll Rect", false, 2151)]
static public void AddLoopHorizontalScrollRect(MenuCommand menuCommand)
{
GameObject go = SGDefaultControls.CreateLoopHorizontalScrollRect(GetStandardResources());
PlaceUIElementRoot(go, menuCommand);
}
[MenuItem("GameObject/UI/Loop Vertical Scroll Rect", false, 2152)]
static public void AddLoopVerticalScrollRect(MenuCommand menuCommand)
{
GameObject go = SGDefaultControls.CreateLoopVerticalScrollRect(GetStandardResources());
PlaceUIElementRoot(go, menuCommand);
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: c4b63bf28f5af0e42a464ac316fef603
timeCreated: 1476279563
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: ec0ddcd49b026ab4fb6b7d49fd693e57
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,188 +0,0 @@
using UnityEngine;
using System.Collections;
namespace UnityEngine.UI
{
[AddComponentMenu("UI/Loop Horizontal Scroll Rect", 50)]
[DisallowMultipleComponent]
public class LoopHorizontalScrollRect : LoopScrollRect
{
protected LoopHorizontalScrollRect()
{
direction = LoopScrollRectDirection.Horizontal;
}
protected override float GetSize(RectTransform item, bool includeSpacing)
{
float size = includeSpacing ? contentSpacing : 0;
if (m_GridLayout != null)
{
size += m_GridLayout.cellSize.x;
}
else
{
size += LoopScrollSizeUtils.GetPreferredWidth(item);
}
size *= m_Content.localScale.x;
return size;
}
protected override float GetDimension(Vector2 vector)
{
return -vector.x;
}
protected override float GetAbsDimension(Vector2 vector)
{
return vector.x;
}
protected override Vector2 GetVector(float value)
{
return new Vector2(-value, 0);
}
protected override void Awake()
{
base.Awake();
if (m_Content)
{
GridLayoutGroup layout = m_Content.GetComponent<GridLayoutGroup>();
if (layout != null && layout.constraint != GridLayoutGroup.Constraint.FixedRowCount)
{
Debug.LogError("[LoopScrollRect] unsupported GridLayoutGroup constraint");
}
}
}
protected override bool UpdateItems(ref Bounds viewBounds, ref Bounds contentBounds)
{
bool changed = false;
// special case: handling move several page in one frame
if ((viewBounds.size.x < contentBounds.min.x - viewBounds.max.x) && itemTypeEnd > itemTypeStart)
{
float currentSize = contentBounds.size.x;
float elementSize = EstimiateElementSize();
ReturnToTempPool(false, itemTypeEnd - itemTypeStart);
itemTypeEnd = itemTypeStart;
int offsetCount = Mathf.FloorToInt((contentBounds.min.x - viewBounds.max.x) / (elementSize + contentSpacing));
if (totalCount >= 0 && itemTypeStart - offsetCount * contentConstraintCount < 0)
{
offsetCount = Mathf.FloorToInt((float)(itemTypeStart) / contentConstraintCount);
}
itemTypeStart -= offsetCount * contentConstraintCount;
if (totalCount >= 0)
{
itemTypeStart = Mathf.Max(itemTypeStart, 0);
}
itemTypeEnd = itemTypeStart;
itemTypeSize = 0;
float offset = offsetCount * (elementSize + contentSpacing);
m_Content.anchoredPosition -= new Vector2(offset + (reverseDirection ? currentSize : 0), 0);
contentBounds.center -= new Vector3(offset + currentSize / 2, 0, 0);
contentBounds.size = Vector3.zero;
changed = true;
}
if ((viewBounds.min.x - contentBounds.max.x > viewBounds.size.x) && itemTypeEnd > itemTypeStart)
{
int maxItemTypeStart = -1;
if (totalCount >= 0)
{
maxItemTypeStart = Mathf.Max(0, totalCount - (itemTypeEnd - itemTypeStart));
maxItemTypeStart = (maxItemTypeStart / contentConstraintCount) * contentConstraintCount;
}
float currentSize = contentBounds.size.x;
float elementSize = EstimiateElementSize();
ReturnToTempPool(true, itemTypeEnd - itemTypeStart);
// TODO: fix with contentConstraint?
itemTypeStart = itemTypeEnd;
int offsetCount = Mathf.FloorToInt((viewBounds.min.x - contentBounds.max.x) / (elementSize + contentSpacing));
if (maxItemTypeStart >= 0 && itemTypeStart + offsetCount * contentConstraintCount > maxItemTypeStart)
{
offsetCount = Mathf.FloorToInt((float)(maxItemTypeStart - itemTypeStart) / contentConstraintCount);
}
itemTypeStart += offsetCount * contentConstraintCount;
if (totalCount >= 0)
{
itemTypeStart = Mathf.Max(itemTypeStart, 0);
}
itemTypeEnd = itemTypeStart;
itemTypeSize = 0;
float offset = offsetCount * (elementSize + contentSpacing);
m_Content.anchoredPosition += new Vector2(offset + (reverseDirection ? 0 : currentSize), 0);
contentBounds.center += new Vector3(offset + currentSize / 2, 0, 0);
contentBounds.size = Vector3.zero;
changed = true;
}
if (viewBounds.max.x > contentBounds.max.x - m_ContentRightPadding)
{
float size = NewItemAtEnd(), totalSize = size;
while (size > 0 && viewBounds.max.x > contentBounds.max.x - m_ContentRightPadding + totalSize)
{
size = NewItemAtEnd();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
else if ((itemTypeEnd % contentConstraintCount != 0) && (itemTypeEnd < totalCount || totalCount < 0))
{
NewItemAtEnd();
}
if (viewBounds.min.x < contentBounds.min.x + m_ContentLeftPadding)
{
float size = NewItemAtStart(), totalSize = size;
while (size > 0 && viewBounds.min.x < contentBounds.min.x + m_ContentLeftPadding - totalSize)
{
size = NewItemAtStart();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (viewBounds.max.x < contentBounds.max.x - threshold - m_ContentRightPadding
&& viewBounds.size.x < contentBounds.size.x - threshold)
{
float size = DeleteItemAtEnd(), totalSize = size;
while (size > 0 && viewBounds.max.x < contentBounds.max.x - threshold - m_ContentRightPadding - totalSize)
{
size = DeleteItemAtEnd();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (viewBounds.min.x > contentBounds.min.x + threshold + m_ContentLeftPadding
&& viewBounds.size.x < contentBounds.size.x - threshold)
{
float size = DeleteItemAtStart(), totalSize = size;
while (size > 0 && viewBounds.min.x > contentBounds.min.x + threshold + m_ContentLeftPadding + totalSize)
{
size = DeleteItemAtStart();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (changed)
{
ClearTempPool();
}
return changed;
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: ab7b38d60c9f6a944831d24146f39793
timeCreated: 1439395663
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,188 +0,0 @@
using UnityEngine;
using System.Collections;
namespace UnityEngine.UI
{
[AddComponentMenu("UI/Loop Horizontal Scroll Rect(MultiPrefab)", 52)]
[DisallowMultipleComponent]
public class LoopHorizontalScrollRectMulti : LoopScrollRectMulti
{
protected LoopHorizontalScrollRectMulti()
{
direction = LoopScrollRectDirection.Horizontal;
}
protected override float GetSize(RectTransform item, bool includeSpacing)
{
float size = includeSpacing ? contentSpacing : 0;
if (m_GridLayout != null)
{
size += m_GridLayout.cellSize.x;
}
else
{
size += LoopScrollSizeUtils.GetPreferredWidth(item);
}
size *= m_Content.localScale.x;
return size;
}
protected override float GetDimension(Vector2 vector)
{
return -vector.x;
}
protected override float GetAbsDimension(Vector2 vector)
{
return vector.x;
}
protected override Vector2 GetVector(float value)
{
return new Vector2(-value, 0);
}
protected override void Awake()
{
base.Awake();
if (m_Content)
{
GridLayoutGroup layout = m_Content.GetComponent<GridLayoutGroup>();
if (layout != null && layout.constraint != GridLayoutGroup.Constraint.FixedRowCount)
{
Debug.LogError("[LoopScrollRect] unsupported GridLayoutGroup constraint");
}
}
}
protected override bool UpdateItems(ref Bounds viewBounds, ref Bounds contentBounds)
{
bool changed = false;
// special case: handling move several page in one frame
if ((viewBounds.size.x < contentBounds.min.x - viewBounds.max.x) && itemTypeEnd > itemTypeStart)
{
float currentSize = contentBounds.size.x;
float elementSize = EstimiateElementSize();
ReturnToTempPool(false, itemTypeEnd - itemTypeStart);
itemTypeEnd = itemTypeStart;
int offsetCount = Mathf.FloorToInt((contentBounds.min.x - viewBounds.max.x) / (elementSize + contentSpacing));
if (totalCount >= 0 && itemTypeStart - offsetCount * contentConstraintCount < 0)
{
offsetCount = Mathf.FloorToInt((float)(itemTypeStart) / contentConstraintCount);
}
itemTypeStart -= offsetCount * contentConstraintCount;
if (totalCount >= 0)
{
itemTypeStart = Mathf.Max(itemTypeStart, 0);
}
itemTypeEnd = itemTypeStart;
itemTypeSize = 0;
float offset = offsetCount * (elementSize + contentSpacing);
m_Content.anchoredPosition -= new Vector2(offset + (reverseDirection ? currentSize : 0), 0);
contentBounds.center -= new Vector3(offset + currentSize / 2, 0, 0);
contentBounds.size = Vector3.zero;
changed = true;
}
if ((viewBounds.min.x - contentBounds.max.x > viewBounds.size.x) && itemTypeEnd > itemTypeStart)
{
int maxItemTypeStart = -1;
if (totalCount >= 0)
{
maxItemTypeStart = Mathf.Max(0, totalCount - (itemTypeEnd - itemTypeStart));
maxItemTypeStart = (maxItemTypeStart / contentConstraintCount) * contentConstraintCount;
}
float currentSize = contentBounds.size.x;
float elementSize = EstimiateElementSize();
ReturnToTempPool(true, itemTypeEnd - itemTypeStart);
// TODO: fix with contentConstraint?
itemTypeStart = itemTypeEnd;
int offsetCount = Mathf.FloorToInt((viewBounds.min.x - contentBounds.max.x) / (elementSize + contentSpacing));
if (maxItemTypeStart >= 0 && itemTypeStart + offsetCount * contentConstraintCount > maxItemTypeStart)
{
offsetCount = Mathf.FloorToInt((float)(maxItemTypeStart - itemTypeStart) / contentConstraintCount);
}
itemTypeStart += offsetCount * contentConstraintCount;
if (totalCount >= 0)
{
itemTypeStart = Mathf.Max(itemTypeStart, 0);
}
itemTypeEnd = itemTypeStart;
itemTypeSize = 0;
float offset = offsetCount * (elementSize + contentSpacing);
m_Content.anchoredPosition += new Vector2(offset + (reverseDirection ? 0 : currentSize), 0);
contentBounds.center += new Vector3(offset + currentSize / 2, 0, 0);
contentBounds.size = Vector3.zero;
changed = true;
}
if (viewBounds.max.x > contentBounds.max.x - m_ContentRightPadding)
{
float size = NewItemAtEnd(), totalSize = size;
while (size > 0 && viewBounds.max.x > contentBounds.max.x - m_ContentRightPadding + totalSize)
{
size = NewItemAtEnd();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
else if ((itemTypeEnd % contentConstraintCount != 0) && (itemTypeEnd < totalCount || totalCount < 0))
{
NewItemAtEnd();
}
if (viewBounds.min.x < contentBounds.min.x + m_ContentLeftPadding)
{
float size = NewItemAtStart(), totalSize = size;
while (size > 0 && viewBounds.min.x < contentBounds.min.x + m_ContentLeftPadding - totalSize)
{
size = NewItemAtStart();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (viewBounds.max.x < contentBounds.max.x - threshold - m_ContentRightPadding
&& viewBounds.size.x < contentBounds.size.x - threshold)
{
float size = DeleteItemAtEnd(), totalSize = size;
while (size > 0 && viewBounds.max.x < contentBounds.max.x - threshold - m_ContentRightPadding - totalSize)
{
size = DeleteItemAtEnd();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (viewBounds.min.x > contentBounds.min.x + threshold + m_ContentLeftPadding
&& viewBounds.size.x < contentBounds.size.x - threshold)
{
float size = DeleteItemAtStart(), totalSize = size;
while (size > 0 && viewBounds.min.x > contentBounds.min.x + threshold + m_ContentLeftPadding + totalSize)
{
size = DeleteItemAtStart();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (changed)
{
ClearTempPool();
}
return changed;
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 0aa64ab4e86f574469b5d4fda2e9c85f
timeCreated: 1439395663
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,10 +0,0 @@
using UnityEngine;
using System.Collections;
namespace UnityEngine.UI
{
public interface LoopScrollDataSource
{
void ProvideData(Transform transform, int idx);
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: be1ddd0ddf17846f0b38566071ee623e
timeCreated: 1500356133
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,10 +0,0 @@
using UnityEngine;
using System.Collections;
namespace UnityEngine.UI
{
public interface LoopScrollMultiDataSource
{
void ProvideData(Transform transform, int index);
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 8730c6d35f93cb946b80539f595b48c1
timeCreated: 1500356133
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,12 +0,0 @@
using UnityEngine;
using System.Collections;
namespace UnityEngine.UI
{
public interface LoopScrollPrefabSource
{
GameObject GetObject(int index);
void ReturnObject(Transform trans);
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 4cea3807a046c4500be20219e5c46432
timeCreated: 1500356133
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,76 +0,0 @@
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using System;
using System.Collections;
using System.Collections.Generic;
namespace UnityEngine.UI
{
public abstract class LoopScrollRect : LoopScrollRectBase
{
[HideInInspector]
[NonSerialized]
public LoopScrollDataSource dataSource = null;
protected override void ProvideData(Transform transform, int index)
{
dataSource.ProvideData(transform, index);
}
protected override RectTransform GetFromTempPool(int itemIdx)
{
RectTransform nextItem = null;
if (deletedItemTypeStart > 0)
{
deletedItemTypeStart--;
nextItem = m_Content.GetChild(0) as RectTransform;
nextItem.SetSiblingIndex(itemIdx - itemTypeStart + deletedItemTypeStart);
}
else if (deletedItemTypeEnd > 0)
{
deletedItemTypeEnd--;
nextItem = m_Content.GetChild(m_Content.childCount - 1) as RectTransform;
nextItem.SetSiblingIndex(itemIdx - itemTypeStart + deletedItemTypeStart);
}
else
{
nextItem = prefabSource.GetObject(itemIdx).transform as RectTransform;
nextItem.transform.SetParent(m_Content, false);
nextItem.gameObject.SetActive(true);
}
ProvideData(nextItem, itemIdx);
return nextItem;
}
protected override void ReturnToTempPool(bool fromStart, int count)
{
if (fromStart)
deletedItemTypeStart += count;
else
deletedItemTypeEnd += count;
}
protected override void ClearTempPool()
{
Debug.Assert(m_Content.childCount >= deletedItemTypeStart + deletedItemTypeEnd);
if (deletedItemTypeStart > 0)
{
for (int i = deletedItemTypeStart - 1; i >= 0; i--)
{
prefabSource.ReturnObject(m_Content.GetChild(i));
}
deletedItemTypeStart = 0;
}
if (deletedItemTypeEnd > 0)
{
int t = m_Content.childCount - deletedItemTypeEnd;
for (int i = m_Content.childCount - 1; i >= t; i--)
{
prefabSource.ReturnObject(m_Content.GetChild(i));
}
deletedItemTypeEnd = 0;
}
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 4ec983a492fb0204bacc07738659994f
timeCreated: 1439395663
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 33aaabb8aa0854047a50d2d2b0c6f1a5
timeCreated: 1439395663
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,56 +0,0 @@
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using System;
using System.Collections;
using System.Collections.Generic;
namespace UnityEngine.UI
{
public abstract class LoopScrollRectMulti : LoopScrollRectBase
{
[HideInInspector]
[NonSerialized]
public LoopScrollMultiDataSource dataSource = null;
protected override void ProvideData(Transform transform, int index)
{
dataSource.ProvideData(transform, index);
}
// Multi Data Source cannot support TempPool
protected override RectTransform GetFromTempPool(int itemIdx)
{
RectTransform nextItem = prefabSource.GetObject(itemIdx).transform as RectTransform;
nextItem.transform.SetParent(m_Content, false);
nextItem.gameObject.SetActive(true);
ProvideData(nextItem, itemIdx);
return nextItem;
}
protected override void ReturnToTempPool(bool fromStart, int count)
{
Debug.Assert(m_Content.childCount >= count);
if (fromStart)
{
for (int i = count - 1; i >= 0; i--)
{
prefabSource.ReturnObject(m_Content.GetChild(i));
}
}
else
{
int t = m_Content.childCount - count;
for (int i = m_Content.childCount - 1; i >= t; i--)
{
prefabSource.ReturnObject(m_Content.GetChild(i));
}
}
}
protected override void ClearTempPool()
{
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 1bb4b17b11dd527499b49566928fed17
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,11 +0,0 @@
using UnityEngine;
using System.Collections;
namespace UnityEngine.UI
{
// optional class for better scroll support
public interface LoopScrollSizeHelper
{
Vector2 GetItemsSize(int itemsCount);
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 34053817472810d49a0a82b79338dde5
timeCreated: 1500356133
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,38 +0,0 @@
using UnityEngine;
using UnityEngine.UI;
namespace UnityEngine.UI
{
public static class LoopScrollSizeUtils
{
public static float GetPreferredHeight(RectTransform item)
{
ILayoutElement minLayoutElement;
ILayoutElement preferredLayoutElement;
var minHeight = LayoutUtility.GetLayoutProperty(item, e => e.minHeight, 0, out minLayoutElement);
var preferredHeight = LayoutUtility.GetLayoutProperty(item, e => e.preferredHeight, 0, out preferredLayoutElement);
var result = Mathf.Max(minHeight, preferredHeight);
if (preferredLayoutElement == null && minLayoutElement == null)
{
result = item.rect.height;
}
return result;
}
public static float GetPreferredWidth(RectTransform item)
{
ILayoutElement minLayoutElement;
ILayoutElement preferredLayoutElement;
var minWidth = LayoutUtility.GetLayoutProperty(item, e => e.minWidth, 0, out minLayoutElement);
var preferredWidth = LayoutUtility.GetLayoutProperty(item, e => e.preferredWidth, 0, out preferredLayoutElement);
var result = Mathf.Max(minWidth, preferredWidth);
if (preferredLayoutElement == null && minLayoutElement == null)
{
result = item.rect.width;
}
return result;
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: e089162759fe4031997b918866745978
timeCreated: 1721785991

View File

@@ -1,188 +0,0 @@
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
namespace UnityEngine.UI
{
[AddComponentMenu("UI/Loop Vertical Scroll Rect", 51)]
[DisallowMultipleComponent]
public class LoopVerticalScrollRect : LoopScrollRect
{
protected LoopVerticalScrollRect()
{
direction = LoopScrollRectDirection.Vertical;
}
protected override float GetSize(RectTransform item, bool includeSpacing)
{
float size = includeSpacing ? contentSpacing : 0;
if (m_GridLayout != null)
{
size += m_GridLayout.cellSize.y;
}
else
{
size += LoopScrollSizeUtils.GetPreferredHeight(item);
}
size *= m_Content.localScale.y;
return size;
}
protected override float GetDimension(Vector2 vector)
{
return vector.y;
}
protected override float GetAbsDimension(Vector2 vector)
{
return vector.y;
}
protected override Vector2 GetVector(float value)
{
return new Vector2(0, value);
}
protected override void Awake()
{
base.Awake();
if (m_Content)
{
GridLayoutGroup layout = m_Content.GetComponent<GridLayoutGroup>();
if (layout != null && layout.constraint != GridLayoutGroup.Constraint.FixedColumnCount)
{
Debug.LogError("[LoopScrollRect] unsupported GridLayoutGroup constraint");
}
}
}
protected override bool UpdateItems(ref Bounds viewBounds, ref Bounds contentBounds)
{
bool changed = false;
// special case: handling move several page in one frame
if ((viewBounds.size.y < contentBounds.min.y - viewBounds.max.y) && itemTypeEnd > itemTypeStart)
{
int maxItemTypeStart = -1;
if (totalCount >= 0)
{
maxItemTypeStart = Mathf.Max(0, totalCount - (itemTypeEnd - itemTypeStart));
}
float currentSize = contentBounds.size.y;
float elementSize = EstimiateElementSize();
ReturnToTempPool(true, itemTypeEnd - itemTypeStart);
itemTypeStart = itemTypeEnd;
int offsetCount = Mathf.FloorToInt((contentBounds.min.y - viewBounds.max.y) / (elementSize + contentSpacing));
if (maxItemTypeStart >= 0 && itemTypeStart + offsetCount * contentConstraintCount > maxItemTypeStart)
{
offsetCount = Mathf.FloorToInt((float)(maxItemTypeStart - itemTypeStart) / contentConstraintCount);
}
itemTypeStart += offsetCount * contentConstraintCount;
if (totalCount >= 0)
{
itemTypeStart = Mathf.Max(itemTypeStart, 0);
}
itemTypeEnd = itemTypeStart;
itemTypeSize = 0;
float offset = offsetCount * (elementSize + contentSpacing);
m_Content.anchoredPosition -= new Vector2(0, offset + (reverseDirection ? 0 : currentSize));
contentBounds.center -= new Vector3(0, offset + currentSize / 2, 0);
contentBounds.size = Vector3.zero;
changed = true;
}
if ((viewBounds.min.y - contentBounds.max.y > viewBounds.size.y) && itemTypeEnd > itemTypeStart)
{
float currentSize = contentBounds.size.y;
float elementSize = EstimiateElementSize();
ReturnToTempPool(false, itemTypeEnd - itemTypeStart);
itemTypeEnd = itemTypeStart;
int offsetCount = Mathf.FloorToInt((viewBounds.min.y - contentBounds.max.y) / (elementSize + contentSpacing));
if (totalCount >= 0 && itemTypeStart - offsetCount * contentConstraintCount < 0)
{
offsetCount = Mathf.FloorToInt((float)(itemTypeStart) / contentConstraintCount);
}
itemTypeStart -= offsetCount * contentConstraintCount;
if (totalCount >= 0)
{
itemTypeStart = Mathf.Max(itemTypeStart, 0);
}
itemTypeEnd = itemTypeStart;
itemTypeSize = 0;
float offset = offsetCount * (elementSize + contentSpacing);
m_Content.anchoredPosition += new Vector2(0, offset + (reverseDirection ? currentSize : 0));
contentBounds.center += new Vector3(0, offset + currentSize / 2, 0);
contentBounds.size = Vector3.zero;
changed = true;
}
// issue #149: new item before delete
if (viewBounds.min.y < contentBounds.min.y + m_ContentBottomPadding)
{
float size = NewItemAtEnd(), totalSize = size;
while (size > 0 && viewBounds.min.y < contentBounds.min.y + m_ContentBottomPadding - totalSize)
{
size = NewItemAtEnd();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
// issue #178: grid layout could increase totalCount at any time
else if ((itemTypeEnd % contentConstraintCount != 0) && (itemTypeEnd < totalCount || totalCount < 0))
{
NewItemAtEnd();
}
if (viewBounds.max.y > contentBounds.max.y - m_ContentTopPadding)
{
float size = NewItemAtStart(), totalSize = size;
while (size > 0 && viewBounds.max.y > contentBounds.max.y - m_ContentTopPadding + totalSize)
{
size = NewItemAtStart();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (viewBounds.min.y > contentBounds.min.y + threshold + m_ContentBottomPadding
&& viewBounds.size.y < contentBounds.size.y - threshold)
{
float size = DeleteItemAtEnd(), totalSize = size;
while (size > 0 && viewBounds.min.y > contentBounds.min.y + threshold + m_ContentBottomPadding + totalSize)
{
size = DeleteItemAtEnd();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (viewBounds.max.y < contentBounds.max.y - threshold - m_ContentTopPadding
&& viewBounds.size.y < contentBounds.size.y - threshold)
{
float size = DeleteItemAtStart(), totalSize = size;
while (size > 0 && viewBounds.max.y < contentBounds.max.y - threshold - m_ContentTopPadding - totalSize)
{
size = DeleteItemAtStart();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (changed)
{
ClearTempPool();
}
return changed;
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: ce71017a2903f7c4c9a699e438d0b897
timeCreated: 1439395663
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,187 +0,0 @@
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
namespace UnityEngine.UI
{
[AddComponentMenu("UI/Loop Vertical Scroll Rect(MultiPrefab)", 53)]
[DisallowMultipleComponent]
public class LoopVerticalScrollRectMulti : LoopScrollRectMulti
{
protected LoopVerticalScrollRectMulti()
{
direction = LoopScrollRectDirection.Vertical;
}
protected override float GetSize(RectTransform item, bool includeSpacing)
{
float size = includeSpacing ? contentSpacing : 0;
if (m_GridLayout != null)
{
size += m_GridLayout.cellSize.y;
}
else
{
size += LoopScrollSizeUtils.GetPreferredHeight(item);
}
size *= m_Content.localScale.y;
return size;
}
protected override float GetDimension(Vector2 vector)
{
return vector.y;
}
protected override float GetAbsDimension(Vector2 vector)
{
return vector.y;
}
protected override Vector2 GetVector(float value)
{
return new Vector2(0, value);
}
protected override void Awake()
{
base.Awake();
if (m_Content)
{
GridLayoutGroup layout = m_Content.GetComponent<GridLayoutGroup>();
if (layout != null && layout.constraint != GridLayoutGroup.Constraint.FixedColumnCount)
{
Debug.LogError("[LoopScrollRect] unsupported GridLayoutGroup constraint");
}
}
}
protected override bool UpdateItems(ref Bounds viewBounds, ref Bounds contentBounds)
{
bool changed = false;
// special case: handling move several page in one frame
if ((viewBounds.size.y < contentBounds.min.y - viewBounds.max.y) && itemTypeEnd > itemTypeStart)
{
int maxItemTypeStart = -1;
if (totalCount >= 0)
{
maxItemTypeStart = Mathf.Max(0, totalCount - (itemTypeEnd - itemTypeStart));
}
float currentSize = contentBounds.size.y;
float elementSize = EstimiateElementSize();
ReturnToTempPool(true, itemTypeEnd - itemTypeStart);
itemTypeStart = itemTypeEnd;
int offsetCount = Mathf.FloorToInt((contentBounds.min.y - viewBounds.max.y) / (elementSize + contentSpacing));
if (maxItemTypeStart >= 0 && itemTypeStart + offsetCount * contentConstraintCount > maxItemTypeStart)
{
offsetCount = Mathf.FloorToInt((float)(maxItemTypeStart - itemTypeStart) / contentConstraintCount);
}
itemTypeStart += offsetCount * contentConstraintCount;
if (totalCount >= 0)
{
itemTypeStart = Mathf.Max(itemTypeStart, 0);
}
itemTypeEnd = itemTypeStart;
itemTypeSize = 0;
float offset = offsetCount * (elementSize + contentSpacing);
m_Content.anchoredPosition -= new Vector2(0, offset + (reverseDirection ? 0 : currentSize));
contentBounds.center -= new Vector3(0, offset + currentSize / 2, 0);
contentBounds.size = Vector3.zero;
changed = true;
}
if ((viewBounds.min.y - contentBounds.max.y > viewBounds.size.y) && itemTypeEnd > itemTypeStart)
{
float currentSize = contentBounds.size.y;
float elementSize = EstimiateElementSize();
ReturnToTempPool(false, itemTypeEnd - itemTypeStart);
itemTypeEnd = itemTypeStart;
int offsetCount = Mathf.FloorToInt((viewBounds.min.y - contentBounds.max.y) / (elementSize + contentSpacing));
if (totalCount >= 0 && itemTypeStart - offsetCount * contentConstraintCount < 0)
{
offsetCount = Mathf.FloorToInt((float)(itemTypeStart) / contentConstraintCount);
}
itemTypeStart -= offsetCount * contentConstraintCount;
if (totalCount >= 0)
{
itemTypeStart = Mathf.Max(itemTypeStart, 0);
}
itemTypeEnd = itemTypeStart;
itemTypeSize = 0;
float offset = offsetCount * (elementSize + contentSpacing);
m_Content.anchoredPosition += new Vector2(0, offset + (reverseDirection ? currentSize : 0));
contentBounds.center += new Vector3(0, offset + currentSize / 2, 0);
contentBounds.size = Vector3.zero;
changed = true;
}
if (viewBounds.min.y < contentBounds.min.y + m_ContentBottomPadding)
{
float size = NewItemAtEnd(), totalSize = size;
while (size > 0 && viewBounds.min.y < contentBounds.min.y + m_ContentBottomPadding - totalSize)
{
size = NewItemAtEnd();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
else if ((itemTypeEnd % contentConstraintCount != 0) && (itemTypeEnd < totalCount || totalCount < 0))
{
NewItemAtEnd();
}
if (viewBounds.max.y > contentBounds.max.y - m_ContentTopPadding)
{
float size = NewItemAtStart(), totalSize = size;
while (size > 0 && viewBounds.max.y > contentBounds.max.y - m_ContentTopPadding + totalSize)
{
size = NewItemAtStart();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (viewBounds.min.y > contentBounds.min.y + threshold + m_ContentBottomPadding
&& viewBounds.size.y < contentBounds.size.y - threshold)
{
float size = DeleteItemAtEnd(), totalSize = size;
while (size > 0 && viewBounds.min.y > contentBounds.min.y + threshold + m_ContentBottomPadding + totalSize)
{
size = DeleteItemAtEnd();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (viewBounds.max.y < contentBounds.max.y - threshold - m_ContentTopPadding
&& viewBounds.size.y < contentBounds.size.y - threshold)
{
float size = DeleteItemAtStart(), totalSize = size;
while (size > 0 && viewBounds.max.y < contentBounds.max.y - threshold - m_ContentTopPadding - totalSize)
{
size = DeleteItemAtStart();
totalSize += size;
}
if (totalSize > 0)
changed = true;
}
if (changed)
{
ClearTempPool();
}
return changed;
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: a4ae502f584e1924d83adb15f18817dc
timeCreated: 1439395663
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -13,89 +13,39 @@ namespace CreatGame.UI
/// item渲染函数
/// </summary>
public delegate void LoopListItemRenderer(GameObject item,int index);
[RequireComponent(typeof(UnityEngine.UI.LoopScrollRect))]
[DisallowMultipleComponent]
public class UILoopList : MonoBehaviour, LoopScrollPrefabSource, LoopScrollDataSource
{
/// <summary>
///
/// </summary>
public LoopListItemProvider ListItemProvider;
/// <summary>
///
/// </summary>
public LoopListItemRenderer ListItemRenderer;
/// <summary>
///
/// </summary>
private Dictionary<string, Stack<GameObject>> itemPool = new Dictionary<string, Stack<GameObject>>();
private Stack<Transform> itemPool = new Stack<Transform>();
/// <summary>
/// 预制件
/// </summary>
public GameObject itemPrefab;
public GameObject GetObject(int index)
{
string itemPath = String.Empty;
if (ListItemProvider != null)
if (itemPool.Count == 0)
{
itemPath = ListItemProvider(index);
return Instantiate(itemPrefab);
}
else
{
itemPath = "Default";
}
if (itemPool.TryGetValue(itemPath, out Stack<GameObject> itemList) == false)
{
itemList = new Stack<GameObject>();
itemPool.Add(itemPath, itemList);
}
if (itemList.Count == 0)
{
if (ListItemProvider == null)
{
if (itemPrefab != null)
{
itemList.Push(Instantiate(itemPrefab));
}
else
{
Debug.LogError("ItemPrefab is null and ListItemProvider == null");
return null;
}
}
else
{
var item = AssetBundle.AssetBundleManager.Instance.LoadGameObject(itemPath);
var export = item.GetComponent<UIViewBase>();
if (export == null)
{
Debug.LogError("预制件没有绑定导出代码的UIViewBase");
}
export.PreLoad(item);
itemList.Push(item);
}
}
return itemList.Pop();
Transform candidate = itemPool.Pop();
candidate.gameObject.SetActive(true);
return candidate.gameObject;
}
public void ReturnObject(Transform trans)
{
var export = trans.GetComponent<UIViewBase>();
if (export != null)
{
if (itemPool.TryGetValue(export.PrefabPath, out Stack<GameObject> itemList) ==false)
{
itemList = itemPool["Default"];
}
itemList.Push(trans.gameObject);
}
else
{
Debug.LogError("返回对象池失败");
}
trans.gameObject.SetActive(false);
trans.SetParent(transform, false);
itemPool.Push(trans);;
}
public void ProvideData(Transform transform, int idx)
@@ -112,8 +62,7 @@ namespace CreatGame.UI
///
/// </summary>
public LoopScrollRect ScrollRect { get; private set; }
private void Start()
private void Awake()
{
ScrollRect = GetComponent<LoopScrollRect>();
ScrollRect.prefabSource = this;
@@ -123,13 +72,16 @@ namespace CreatGame.UI
public int ItemCount
{
get => ScrollRect.totalCount;
set => ScrollRect.totalCount = value;
set
{
ScrollRect.totalCount = value;
ScrollRect.RefreshCells();
}
}
public void RefillCells()
public void ScrollToItem(int index)
{
ScrollRect?.RefillCells();
ScrollRect?.ScrollToCell(index - 1,100.0f);
}
}
}

View File

@@ -8,6 +8,7 @@
"com.unity.timeline": "1.7.6",
"com.unity.ugui": "1.0.0",
"com.unity.visualscripting": "1.9.4",
"me.qiankanglai.loopscrollrect": "https://github.com/qiankanglai/LoopScrollRect.git",
"com.unity.modules.ai": "1.0.0",
"com.unity.modules.androidjni": "1.0.0",
"com.unity.modules.animation": "1.0.0",

View File

@@ -163,6 +163,15 @@
},
"url": "https://packages.unity.com"
},
"me.qiankanglai.loopscrollrect": {
"version": "https://github.com/qiankanglai/LoopScrollRect.git",
"depth": 0,
"source": "git",
"dependencies": {
"com.unity.ugui": "1.0.0"
},
"hash": "f035572329eda75d32c4baa5976dcb86369e206d"
},
"com.unity.modules.ai": {
"version": "1.0.0",
"depth": 0,