范川铭

1.暂时性的增加一个简单计时器延迟播放小恐龙动画

Showing 57 changed files with 4575 additions and 0 deletions

Too many changes to show.

To preserve performance only 57 of 57+ files are displayed.

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<LangVersion>9.0</LangVersion>
<_TargetFrameworkDirectories>non_empty_path_generated_by_unity.rider.package</_TargetFrameworkDirectories>
<_FullFrameworkReferenceAssemblyPaths>non_empty_path_generated_by_unity.rider.package</_FullFrameworkReferenceAssemblyPaths>
<DisableHandlePackageFileConflicts>true</DisableHandlePackageFileConflicts>
</PropertyGroup>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>10.0.20506</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<RootNamespace></RootNamespace>
<ProjectGuid>{f1e4050a-a996-fa57-5ce2-b8a1c321e1c1}</ProjectGuid>
<ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<AssemblyName>Assembly-CSharp-Editor-firstpass</AssemblyName>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<BaseDirectory>.</BaseDirectory>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>Temp\Bin\Debug\Assembly-CSharp-Editor-firstpass\</OutputPath>
<DefineConstants>UNITY_2022_3_53;UNITY_2022_3;UNITY_2022;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_2019_4_OR_NEWER;UNITY_2020_1_OR_NEWER;UNITY_2020_2_OR_NEWER;UNITY_2020_3_OR_NEWER;UNITY_2021_1_OR_NEWER;UNITY_2021_2_OR_NEWER;UNITY_2021_3_OR_NEWER;UNITY_2022_1_OR_NEWER;UNITY_2022_2_OR_NEWER;UNITY_2022_3_OR_NEWER;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_VIRTUALTEXTURING;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_EDITOR_GAME_SERVICES;ENABLE_UNITY_GAME_SERVICES_ANALYTICS_SUPPORT;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_GENERATE_NATIVE_PLUGINS_FOR_ASSEMBLIES_API;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;ENABLE_MANAGED_UNITYTLS;INCLUDE_DYNAMIC_GI;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;ENABLE_ACCELERATOR_CLIENT_DEBUGGING;ENABLE_NAVIGATION_PACKAGE_DEBUG_VISUALIZATION;ENABLE_NAVIGATION_HEIGHTMESH_RUNTIME_SUPPORT;ENABLE_NAVIGATION_UI_REQUIRES_PACKAGE;PLATFORM_STANDALONE;TEXTCORE_1_0_OR_NEWER;PLATFORM_STANDALONE_WIN;UNITY_STANDALONE_WIN;UNITY_STANDALONE;UNITY_UGP_API;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_NVIDIA;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;PLATFORM_UPDATES_TIME_OUTSIDE_OF_PLAYER_LOOP;GFXDEVICE_WAITFOREVENT_MESSAGEPUMP;PLATFORM_INITIALIZES_MEMORY_MANAGER_EXPLICITLY;ENABLE_MONO;NET_4_6;NET_UNITY_4_8;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;TEXTCORE_FONT_ENGINE_1_5_OR_NEWER;DOTWEEN;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER;UNITY_EDITOR_ONLY_COMPILATION</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<NoWarn>0169,0649</NoWarn>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup>
<NoConfig>true</NoConfig>
<NoStdLib>true</NoStdLib>
<AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>
<ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>
<ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>
</PropertyGroup>
<ItemGroup>
<Analyzer Include="D:\UnityEditor\2022.3.53f1c1\Editor\Data\Tools\Unity.SourceGenerators\Unity.SourceGenerators.dll" />
<Analyzer Include="D:\UnityEditor\2022.3.53f1c1\Editor\Data\Tools\Unity.SourceGenerators\Unity.Properties.SourceGenerator.dll" />
</ItemGroup>
<ItemGroup>
<Compile Include="Assets\Plugins\CircularScrollingList\Editor\CircularScrollingListEditor.cs" />
<Reference Include="UnityEngine">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.AIModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AIModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ARModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ARModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.AccessibilityModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AccessibilityModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.AndroidJNIModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AndroidJNIModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.AnimationModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AnimationModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.AssetBundleModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AssetBundleModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.AudioModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AudioModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ClothModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ClothModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ClusterInputModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ClusterInputModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ClusterRendererModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ClusterRendererModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ContentLoadModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ContentLoadModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.CoreModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.CoreModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.CrashReportingModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.CrashReportingModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.DSPGraphModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.DSPGraphModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.DirectorModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.DirectorModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.GIModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.GIModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.GameCenterModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.GameCenterModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.GridModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.GridModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.HotReloadModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.HotReloadModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.IMGUIModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.IMGUIModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ImageConversionModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ImageConversionModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.InputModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.InputModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.InputLegacyModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.InputLegacyModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.JSONSerializeModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.JSONSerializeModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.LocalizationModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.LocalizationModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.NVIDIAModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.NVIDIAModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ParticleSystemModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ParticleSystemModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.PerformanceReportingModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.PerformanceReportingModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.PhysicsModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.PhysicsModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.Physics2DModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.Physics2DModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ProfilerModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ProfilerModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.PropertiesModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.PropertiesModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ScreenCaptureModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ScreenCaptureModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.SharedInternalsModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.SharedInternalsModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.SpriteMaskModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.SpriteMaskModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.SpriteShapeModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.SpriteShapeModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.StreamingModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.StreamingModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.SubstanceModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.SubstanceModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.SubsystemsModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.SubsystemsModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.TLSModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TLSModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.TerrainModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TerrainModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.TerrainPhysicsModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TerrainPhysicsModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.TextCoreFontEngineModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TextCoreFontEngineModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.TextCoreTextEngineModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TextCoreTextEngineModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.TextRenderingModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TextRenderingModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.TilemapModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TilemapModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UIModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UIModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UIElementsModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UIElementsModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UmbraModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UmbraModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UnityAnalyticsModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityAnalyticsModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UnityAnalyticsCommonModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityAnalyticsCommonModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UnityConnectModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityConnectModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UnityCurlModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityCurlModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UnityTestProtocolModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityTestProtocolModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UnityWebRequestModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UnityWebRequestAssetBundleModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestAssetBundleModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UnityWebRequestAudioModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestAudioModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UnityWebRequestTextureModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestTextureModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UnityWebRequestWWWModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestWWWModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.VFXModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.VFXModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.VRModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.VRModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.VehiclesModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.VehiclesModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.VideoModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.VideoModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.VirtualTexturingModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.VirtualTexturingModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.WindModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.WindModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.XRModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.XRModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.CoreModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.CoreModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.DeviceSimulatorModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.DeviceSimulatorModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.DiagnosticsModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.DiagnosticsModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.EditorToolbarModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.EditorToolbarModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.GraphViewModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.GraphViewModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.PresetsUIModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.PresetsUIModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.QuickSearchModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.QuickSearchModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.SceneTemplateModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.SceneTemplateModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.SceneViewModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.SceneViewModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.TextCoreFontEngineModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.TextCoreFontEngineModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.TextCoreTextEngineModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.TextCoreTextEngineModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.UIBuilderModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.UIBuilderModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.UIElementsModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.UIElementsModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.UIElementsSamplesModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.UIElementsSamplesModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.UnityConnectModule">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.UnityConnectModule.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.Graphs">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEditor.Graphs.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.WebGL.Extensions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\WebGLSupport\UnityEditor.WebGL.Extensions.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.Android.Extensions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\UnityEditor.Android.Extensions.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.WindowsStandalone.Extensions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\WindowsStandaloneSupport\UnityEditor.WindowsStandalone.Extensions.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.YamlDotNet">
<HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.visualscripting@1.9.4\Editor\VisualScripting.Core\Dependencies\YamlDotNet\Unity.VisualScripting.YamlDotNet.dll</HintPath>
</Reference>
<Reference Include="ReportGeneratorMerged">
<HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.testtools.codecoverage@1.2.6\lib\ReportGenerator\ReportGeneratorMerged.dll</HintPath>
</Reference>
<Reference Include="unityplastic">
<HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.collab-proxy@2.7.1\Lib\Editor\unityplastic.dll</HintPath>
</Reference>
<Reference Include="Unity.Plastic.Antlr3.Runtime">
<HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.collab-proxy@2.7.1\Lib\Editor\Unity.Plastic.Antlr3.Runtime.dll</HintPath>
</Reference>
<Reference Include="DOTweenEditor">
<HintPath>D:\U3DFrameWork\Assets\Plugins\Demigiant\DOTween\Editor\DOTweenEditor.dll</HintPath>
</Reference>
<Reference Include="Unity.Plastic.Newtonsoft.Json">
<HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.collab-proxy@2.7.1\Lib\Editor\Unity.Plastic.Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="log4netPlastic">
<HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.collab-proxy@2.7.1\Lib\Editor\log4netPlastic.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.IonicZip">
<HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.visualscripting@1.9.4\Editor\VisualScripting.Core\Dependencies\DotNetZip\Unity.VisualScripting.IonicZip.dll</HintPath>
</Reference>
<Reference Include="DOTween">
<HintPath>D:\U3DFrameWork\Assets\Plugins\Demigiant\DOTween\DOTween.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.Antlr3.Runtime">
<HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.visualscripting@1.9.4\Runtime\VisualScripting.Flow\Dependencies\NCalc\Unity.VisualScripting.Antlr3.Runtime.dll</HintPath>
</Reference>
<Reference Include="DOTweenUpgradeManager">
<HintPath>D:\U3DFrameWork\Assets\Plugins\Demigiant\DOTween\Editor\DOTweenUpgradeManager.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.TextureAssets">
<HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.visualscripting@1.9.4\Editor\VisualScripting.Core\EditorAssetResources\Unity.VisualScripting.TextureAssets.dll</HintPath>
</Reference>
<Reference Include="nunit.framework">
<HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.ext.nunit@1.0.6\net35\unity-custom\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="Unity.Android.Types">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Unity.Android.Types.dll</HintPath>
</Reference>
<Reference Include="Unity.Android.Gradle">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Unity.Android.Gradle.dll</HintPath>
</Reference>
<Reference Include="Unity.Android.GradleProject">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Unity.Android.GradleProject.dll</HintPath>
</Reference>
<Reference Include="mscorlib">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\mscorlib.dll</HintPath>
</Reference>
<Reference Include="System">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.dll</HintPath>
</Reference>
<Reference Include="System.Core">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Core.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Serialization">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Runtime.Serialization.dll</HintPath>
</Reference>
<Reference Include="System.Xml">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Xml.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Xml.Linq.dll</HintPath>
</Reference>
<Reference Include="System.Numerics">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Numerics.dll</HintPath>
</Reference>
<Reference Include="System.Numerics.Vectors">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Net.Http.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.IO.Compression.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Microsoft.CSharp.dll</HintPath>
</Reference>
<Reference Include="System.Data">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Data.dll</HintPath>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Data.DataSetExtensions.dll</HintPath>
</Reference>
<Reference Include="System.Drawing">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Drawing.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression.FileSystem">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.IO.Compression.FileSystem.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Composition">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.ComponentModel.Composition.dll</HintPath>
</Reference>
<Reference Include="System.Transactions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Transactions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Win32.Primitives">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\Microsoft.Win32.Primitives.dll</HintPath>
</Reference>
<Reference Include="netstandard">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\netstandard.dll</HintPath>
</Reference>
<Reference Include="System.AppContext">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.AppContext.dll</HintPath>
</Reference>
<Reference Include="System.Buffers">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Collections.Concurrent">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.Concurrent.dll</HintPath>
</Reference>
<Reference Include="System.Collections">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.dll</HintPath>
</Reference>
<Reference Include="System.Collections.NonGeneric">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.NonGeneric.dll</HintPath>
</Reference>
<Reference Include="System.Collections.Specialized">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.Specialized.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Annotations">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.Annotations.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.EventBasedAsync">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.EventBasedAsync.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Primitives">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.TypeConverter">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.TypeConverter.dll</HintPath>
</Reference>
<Reference Include="System.Console">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Console.dll</HintPath>
</Reference>
<Reference Include="System.Data.Common">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Data.Common.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.Contracts">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Contracts.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.Debug">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Debug.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.FileVersionInfo">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.FileVersionInfo.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.Process">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Process.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.StackTrace">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.StackTrace.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.TextWriterTraceListener">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.TextWriterTraceListener.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.Tools">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Tools.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.TraceSource">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.TraceSource.dll</HintPath>
</Reference>
<Reference Include="System.Drawing.Primitives">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Drawing.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Dynamic.Runtime">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Dynamic.Runtime.dll</HintPath>
</Reference>
<Reference Include="System.Globalization.Calendars">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Globalization.Calendars.dll</HintPath>
</Reference>
<Reference Include="System.Globalization">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Globalization.dll</HintPath>
</Reference>
<Reference Include="System.Globalization.Extensions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Globalization.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression.ZipFile">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.Compression.ZipFile.dll</HintPath>
</Reference>
<Reference Include="System.IO">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem.DriveInfo">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.DriveInfo.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem.Primitives">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem.Watcher">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.Watcher.dll</HintPath>
</Reference>
<Reference Include="System.IO.IsolatedStorage">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.IsolatedStorage.dll</HintPath>
</Reference>
<Reference Include="System.IO.MemoryMappedFiles">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.MemoryMappedFiles.dll</HintPath>
</Reference>
<Reference Include="System.IO.Pipes">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.Pipes.dll</HintPath>
</Reference>
<Reference Include="System.IO.UnmanagedMemoryStream">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.UnmanagedMemoryStream.dll</HintPath>
</Reference>
<Reference Include="System.Linq">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.dll</HintPath>
</Reference>
<Reference Include="System.Linq.Expressions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.Expressions.dll</HintPath>
</Reference>
<Reference Include="System.Linq.Parallel">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.Parallel.dll</HintPath>
</Reference>
<Reference Include="System.Linq.Queryable">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.Queryable.dll</HintPath>
</Reference>
<Reference Include="System.Memory">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Rtc">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Http.Rtc.dll</HintPath>
</Reference>
<Reference Include="System.Net.NameResolution">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.NameResolution.dll</HintPath>
</Reference>
<Reference Include="System.Net.NetworkInformation">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.NetworkInformation.dll</HintPath>
</Reference>
<Reference Include="System.Net.Ping">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Ping.dll</HintPath>
</Reference>
<Reference Include="System.Net.Primitives">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Net.Requests">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Requests.dll</HintPath>
</Reference>
<Reference Include="System.Net.Security">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Security.dll</HintPath>
</Reference>
<Reference Include="System.Net.Sockets">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Sockets.dll</HintPath>
</Reference>
<Reference Include="System.Net.WebHeaderCollection">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.WebHeaderCollection.dll</HintPath>
</Reference>
<Reference Include="System.Net.WebSockets.Client">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.WebSockets.Client.dll</HintPath>
</Reference>
<Reference Include="System.Net.WebSockets">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.WebSockets.dll</HintPath>
</Reference>
<Reference Include="System.ObjectModel">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ObjectModel.dll</HintPath>
</Reference>
<Reference Include="System.Reflection.DispatchProxy">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.DispatchProxy.dll</HintPath>
</Reference>
<Reference Include="System.Reflection">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.dll</HintPath>
</Reference>
<Reference Include="System.Reflection.Emit">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Emit.dll</HintPath>
</Reference>
<Reference Include="System.Reflection.Emit.ILGeneration">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Emit.ILGeneration.dll</HintPath>
</Reference>
<Reference Include="System.Reflection.Emit.Lightweight">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Emit.Lightweight.dll</HintPath>
</Reference>
<Reference Include="System.Reflection.Extensions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Reflection.Primitives">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Resources.Reader">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Resources.Reader.dll</HintPath>
</Reference>
<Reference Include="System.Resources.ResourceManager">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Resources.ResourceManager.dll</HintPath>
</Reference>
<Reference Include="System.Resources.Writer">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Resources.Writer.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.VisualC">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.CompilerServices.VisualC.dll</HintPath>
</Reference>
<Reference Include="System.Runtime">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Extensions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Handles">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Handles.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.InteropServices">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.InteropServices.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.InteropServices.RuntimeInformation">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.InteropServices.WindowsRuntime">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.InteropServices.WindowsRuntime.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Numerics">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Numerics.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Serialization.Formatters">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Formatters.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Serialization.Json">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Json.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Serialization.Primitives">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Serialization.Xml">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Xml.dll</HintPath>
</Reference>
<Reference Include="System.Security.Claims">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Claims.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Algorithms">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Algorithms.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Csp">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Csp.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Encoding">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Encoding.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.X509Certificates.dll</HintPath>
</Reference>
<Reference Include="System.Security.Principal">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Principal.dll</HintPath>
</Reference>
<Reference Include="System.Security.SecureString">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.SecureString.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel.Duplex">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Duplex.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel.Http">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Http.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel.NetTcp">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.NetTcp.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel.Primitives">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel.Security">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Security.dll</HintPath>
</Reference>
<Reference Include="System.Text.Encoding">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Text.Encoding.dll</HintPath>
</Reference>
<Reference Include="System.Text.Encoding.Extensions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Text.Encoding.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Text.RegularExpressions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Text.RegularExpressions.dll</HintPath>
</Reference>
<Reference Include="System.Threading">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Overlapped">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Overlapped.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Tasks.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Parallel">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Tasks.Parallel.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Thread">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Thread.dll</HintPath>
</Reference>
<Reference Include="System.Threading.ThreadPool">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.ThreadPool.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Timer">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Timer.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Xml.ReaderWriter">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.ReaderWriter.dll</HintPath>
</Reference>
<Reference Include="System.Xml.XDocument">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XDocument.dll</HintPath>
</Reference>
<Reference Include="System.Xml.XmlDocument">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XmlDocument.dll</HintPath>
</Reference>
<Reference Include="System.Xml.XmlSerializer">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XmlSerializer.dll</HintPath>
</Reference>
<Reference Include="System.Xml.XPath">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XPath.dll</HintPath>
</Reference>
<Reference Include="System.Xml.XPath.XDocument">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XPath.XDocument.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.TestRunner">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\UnityEngine.TestRunner.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.TestRunner">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\UnityEditor.TestRunner.dll</HintPath>
</Reference>
<Reference Include="Unity.Timeline">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.Timeline.dll</HintPath>
</Reference>
<Reference Include="Unity.TestTools.CodeCoverage.Editor.OpenCover.Mono.Reflection">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.TestTools.CodeCoverage.Editor.OpenCover.Mono.Reflection.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UI">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\UnityEngine.UI.dll</HintPath>
</Reference>
<Reference Include="Unity.EditorCoroutines.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.EditorCoroutines.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.SettingsProvider.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.SettingsProvider.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.Performance.Profile-Analyzer.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.Performance.Profile-Analyzer.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.TestTools.CodeCoverage.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.TestTools.CodeCoverage.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.TestTools.CodeCoverage.Editor.OpenCover.Model">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.TestTools.CodeCoverage.Editor.OpenCover.Model.dll</HintPath>
</Reference>
<Reference Include="Unity.PlasticSCM.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.PlasticSCM.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.State.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.State.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.Timeline.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.Timeline.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.Shared.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.Shared.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualStudio.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualStudio.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.TextMeshPro">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.TextMeshPro.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.Core">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.Core.dll</HintPath>
</Reference>
<Reference Include="Unity.TextMeshPro.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.TextMeshPro.Editor.dll</HintPath>
</Reference>
<Reference Include="UnityEditor.UI">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\UnityEditor.UI.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.Core.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.Core.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.Rider.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.Rider.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.State">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.State.dll</HintPath>
</Reference>
<Reference Include="Unity.VSCode.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VSCode.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.Flow">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.Flow.dll</HintPath>
</Reference>
<Reference Include="Unity.VisualScripting.Flow.Editor">
<HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.Flow.Editor.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="Assembly-CSharp-firstpass.csproj">
<Project>{0fb0da77-85a4-96d4-1dc2-8ddaab877745}</Project>
<Name>Assembly-CSharp-firstpass</Name>
</ProjectReference>
<ProjectReference Include="IngameDebugConsole.Editor.csproj">
<Project>{9b47dfc7-464c-e716-7c49-c01c25245e7d}</Project>
<Name>IngameDebugConsole.Editor</Name>
</ProjectReference>
<ProjectReference Include="IngameDebugConsole.Runtime.csproj">
<Project>{f455341b-6302-350b-c7b4-f9a38305d0ae}</Project>
<Name>IngameDebugConsole.Runtime</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
... ...
... ... @@ -45,14 +45,64 @@
<Analyzer Include="D:\UnityEditor\2022.3.53f1c1\Editor\Data\Tools\Unity.SourceGenerators\Unity.Properties.SourceGenerator.dll" />
</ItemGroup>
<ItemGroup>
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\00-Common\Scripts\IntListBank.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\SpriteStringListBank.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\IListMovementProcessor.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\IBoxTransformController.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\DistanceMovementCurve.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListBank.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ContentManagement\IListContent.cs" />
<Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModulePhysics2D.cs" />
<Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUnityVersion.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\00-Common\Scripts\IntListContent.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\StringStarListBank.cs" />
<Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModulePhysics.cs" />
<Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleEPOOutline.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\10-SelectionMovement\Scripts\ListIteration.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\IMovementCurve.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\InputProcessing\InputProcessor.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\ListMovementProcessor.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\FocusingBoxFinder.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\ListStateProcessorManager.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\Util\DeltaTimeCurve.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\08-ListRefreshing\Scripts\AdjustableStringListBank.cs" />
<Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUtils.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\IMovementCtrl.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListSetting.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\IListBank.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\00-Common\Scripts\FPSLimiter.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ContentManagement\ContentIDState.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\UnitMovementCtrl.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\ColorStrListBox.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\ListFocusingState.cs" />
<Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleAudio.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\07-LateInitialization\Scripts\LateInitialization.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\Util\FactorUtility.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\StringStarListBox.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\BoxPositionState.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\Util\RangeMappingCurve.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListSetupData.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\VelocityMovementCurve.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\ColorStrListBank.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\SpriteStringListBox.cs" />
<Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleSprite.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\ListBoxController.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\06-ListEvents\Scripts\ListEventDemo.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\CircularScrollingList.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListBoxSetting.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\IListBox.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\08-ListRefreshing\Scripts\StringListBox.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\IListBoxController.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\InputProcessing\InputInfo.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ContentManagement\ListContentProvider.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\00-Common\Scripts\IntListBox.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\MovementUtility.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListBox.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\_Demo\11-InteractingByScript\Scripts\ListInteraction.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\FreeMovementCtrl.cs" />
<Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUI.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\BoxTransformController.cs" />
<Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListEvent.cs" />
<None Include="Assets\Plugins\Demigiant\DOTween\readme.txt" />
<Reference Include="UnityEngine">
<HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.dll</HintPath>
... ...
... ... @@ -49,11 +49,14 @@
<Compile Include="Assets\Scripts\UI\Test3.cs" />
<Compile Include="Assets\Scripts\Common\Singleton.cs" />
<Compile Include="Assets\Scripts\Manager\UIManager.cs" />
<Compile Include="Assets\Scripts\ScrollView\ItemUI.cs" />
<Compile Include="Assets\Scripts\UI\Test2.cs" />
<Compile Include="Assets\Scripts\Common\UIBase.cs" />
<Compile Include="Assets\Scripts\Main.cs" />
<Compile Include="Assets\Scripts\UI\Test1.cs" />
<Compile Include="Assets\Scripts\ScrollView\CustomListComponent.cs" />
<Compile Include="Assets\Scripts\Manager\ResourcesManager.cs" />
<Compile Include="Assets\Scripts\ScrollViewTest.cs" />
<Compile Include="Assets\Scripts\Manager\AudioManager.cs" />
<Compile Include="Assets\Scripts\Manager\UIAnimation.cs" />
<Reference Include="UnityEngine">
... ...
fileFormatVersion: 2
guid: c4702c1f0a2004f4eb2ad526888939b5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...
# Change Log
### [CircularList_v6.2] - 2023.05.17
**Added**
- Add `OnBoxMoved` to `ListBox`
### [CircularList_v6.1] - 2023.04.06
**Added**
- Add `OnInitialized` to `ListBox`
**Fixed**
- Incorrect box state when refreshing the list with top/bottom focusing
### [CircularList_v6] - 2023.03.25
**Added**
- Add events
- `OnBoxSelected`
- `OnFocusingBoxChanged`
- Allow multi-control modes at the same time
- Support 3 different focusing posiiton
- Support the list to be stopped at the top or the bottom
- Support layout preview in the editor
- Support runtime setup and initialization
- Stop the movement by the script
- Toggle the interaction of the list by the script
- Get the the boxes in the list and the list which the box belongs to
**Changed**
- Code refactoring a lot
- Arrange the demo scenes
- Arrange the displaying order of options
- Rename options
- The setting "Setting" -> "ListSetting"
- The mode "Drag" -> "Pointer"
- The option "Align Middle" -> "Align At Focusing Position"
- The option "Reverse Direction" -> "Reverse Scrolling Direction"
- The option "Centered Content ID" -> "Init Focusing Content ID"
- The option "Center Selected Box" -> "Focus Selected Box"
- The option "Reverse Order" -> "Reverse Content Order"
- Rename properties
- Capitalize the first character of properties
**Fixed**
- Incorrect layout when the list moves too fast
- Incorrect aligning position for even number of boxes
**Removed**
- Remove events
- `OnBoxClick`
- `OnCenteredContentChanged`
- Remove "Assign References of Bank and Boxes" option from the context menu
### [CircularList_v5.1] - 2021.11.11
**Fixed**
- Fix the incorrect behaviour of the linear-function mode
### [CircularList_v5] - 2021.08.05
**Added**
- Support custom type of the list box and list bank
- Support dynamic list contents, also 0 content
- Add new options
- Reverse scrolling direction
- Reverse order
- Center selected box
- Initialize on start
- Add new events
- `OnCenteredContentChanged`
- `OnMovementEnd`
- Select the list content from the script
- Image sorting - The centered box will be in front of the others.
**Changed**
- All the related classes are in the namespace `AirFishLab.ScrollingList`.
- Change setup class from `ListPositionCtrl` to `CircularScrollingList`
- Change the x range of the list position curve and list scale curve from [0, 1] to [-1, 1]
- Separate the curve used for list velocity and list movement
- The layout of the list is decided by the width/height of the rect transform.
- Improve the calculation of the dragging velocity
- Code refactoring
- The supported Unity version is 2018.4+ (C# 6.0+)
### [CircularList_v4] - 2020.09.01
**Added**
- Use `AnimationCurve` to define the layout and the movement of the list
**Changed**
- Improve the movement
- Improve the inspector view for the list
- Rename mode "Button" to "Function"
### [CircularList_v3] - 2019.06.09
**Added**
- Use Unity's event system to detect the input events
- Add linear mode
- Add control mode: Mouse Wheel (thanks to @aledg)
- Add OnBoxClick event for receiving the content ID of the selected box
- Add BaseListBank for creating independent list banks
- Support multiple lists in the same scene
### [CircularList_v2.2] - 2019.01.08
**Added**
- Able to scroll the list by the mouse wheel
- Able to set the initial ID of the centered content
**Fixed**
- Fix the list won't be centered in the Button Mode when the up/down button is clicked too quickly.
### [CircularList_v2] - 2017.09.30
First release of circular scrolling list
... ...
fileFormatVersion: 2
guid: 712c5f1290a753844a9fbb871c30966e
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...
fileFormatVersion: 2
guid: 455b15c8a28d12b4bbb4840e8f69eb61
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &1
MonoBehaviour:
m_ObjectHideFlags: 52
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 12322, guid: 0000000000000000e000000000000000, type: 0}
m_Name: BoxCurvePresets
m_EditorClassIdentifier:
m_Presets:
- m_Name: Position_HalfCurve
m_Curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: -1
value: 0
inSlope: 0.5
outSlope: 0.5
tangentMode: 34
weightedMode: 0
inWeight: 0
outWeight: 0.33333334
- serializedVersion: 3
time: 0
value: 0.5
inSlope: 0
outSlope: 0
tangentMode: 34
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: -0.5
outSlope: -0.5
tangentMode: 34
weightedMode: 0
inWeight: 0.33333334
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
- m_Name: Position_SineCurve
m_Curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: -1
value: 0
inSlope: 1.3471838
outSlope: 1.3471838
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0.28449523
- serializedVersion: 3
time: -0.5
value: 0.5
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0
value: 0
inSlope: -1.3768258
outSlope: -1.3768258
tangentMode: 0
weightedMode: 0
inWeight: 0.21422008
outWeight: 0.18656707
- serializedVersion: 3
time: 0.5
value: -0.5
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 1.8056066
outSlope: 1.8056066
tangentMode: 0
weightedMode: 0
inWeight: 0.28912723
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
- m_Name: Position_Middle
m_Curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: -1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
- m_Name: Scale_LargeMiddle
m_Curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: -1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 0
value: 1.5
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
- m_Name: Scale_OneKind
m_Curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: -1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
- m_Name: Movement_VelocityRelated
m_Curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: -2.665783
outSlope: -2.665783
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0.048507463
- serializedVersion: 3
time: 1
value: 0
inSlope: -0.028004175
outSlope: -0.028004175
tangentMode: 0
weightedMode: 0
inWeight: 0.10261196
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
- m_Name: Movement_PositionRelated
m_Curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 10.214248
outSlope: 10.214248
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0.04838854
- serializedVersion: 3
time: 0.25
value: 1
inSlope: -0.000001252862
outSlope: -0.000001252862
tangentMode: 0
weightedMode: 0
inWeight: 0.09514958
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
... ...
fileFormatVersion: 2
guid: 596c0779ff9bf3649a52d5e9e885d626
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:
... ...
using UnityEditor;
using UnityEngine;
namespace AirFishLab.ScrollingList.Editor
{
[CustomEditor(typeof(CircularScrollingList))]
[CanEditMultipleObjects]
public class CircularScrollingListEditor : UnityEditor.Editor
{
private bool _toGenerateBoxes;
public override void OnInspectorGUI()
{
serializedObject.Update();
DrawPropertyField("_listBank");
DrawBoxSetting();
DrawListSetting();
if (_toGenerateBoxes)
GenerateBoxesAndArrange();
serializedObject.ApplyModifiedProperties();
}
private void DrawPropertyField(string path, bool includeChildren = false)
{
EditorGUILayout.PropertyField(
serializedObject.FindProperty(path), includeChildren);
}
#region Box Property Drawer
private SerializedProperty _boxSettingProperty;
private SerializedProperty GetBoxSettingProperty(string path)
{
return _boxSettingProperty.FindPropertyRelative(path);
}
private void DrawBoxSettingProperty(string path)
{
EditorGUILayout.PropertyField(GetBoxSettingProperty(path));
}
private void DrawBoxSetting()
{
_boxSettingProperty = serializedObject.FindProperty("_boxSetting");
_boxSettingProperty.isExpanded =
EditorGUILayout.Foldout(_boxSettingProperty.isExpanded, "Box Setting");
if (!_boxSettingProperty.isExpanded)
return;
++EditorGUI.indentLevel;
DrawBoxSettingProperty("_boxRootTransform");
DrawBoxSettingProperty("_boxPrefab");
DrawBoxSettingProperty("_numOfBoxes");
_toGenerateBoxes = GUILayout.Button(
new GUIContent(
"Generate Boxes and Arrange",
"Generate the boxes under the specified box root transform and "
+ "arrange them according to the list setting"));
DrawListBoxes();
--EditorGUI.indentLevel;
}
private void DrawListBoxes()
{
const string showBoxesText = "Show the Boxes";
const string hideBoxesText = "Hide the Boxes";
var listBoxesProperty = serializedObject.FindProperty("_listBoxes");
var toShowBoxes = listBoxesProperty.isExpanded;
if (GUILayout.Button(toShowBoxes ? hideBoxesText : showBoxesText)) {
toShowBoxes = !toShowBoxes;
listBoxesProperty.isExpanded = toShowBoxes;
}
if (toShowBoxes)
DrawPropertyField("_listBoxes", true);
}
#endregion
#region List Setting Property Drawer
private SerializedProperty _listSettingProperty;
private SerializedProperty _focusingPosition;
private SerializedProperty _controlMode;
private SerializedProperty GetListSettingProperty(string path)
{
return _listSettingProperty.FindPropertyRelative(path);
}
private void DrawListSettingProperty(string path)
{
EditorGUILayout.PropertyField(GetListSettingProperty(path));
}
private void DrawListSetting()
{
_listSettingProperty = serializedObject.FindProperty("_listSetting");
_listSettingProperty.isExpanded =
EditorGUILayout.Foldout(_listSettingProperty.isExpanded, "List Setting");
if (!_listSettingProperty.isExpanded)
return;
++EditorGUI.indentLevel;
_focusingPosition = GetListSettingProperty("_focusingPosition");
_controlMode = GetListSettingProperty("_controlMode");
DrawListMode();
EditorGUILayout.Space();
DrawListAppearance();
EditorGUILayout.Space();
DrawEvents();
--EditorGUI.indentLevel;
}
private void DrawListMode()
{
EditorGUILayout.LabelField("List Mode", EditorStyles.boldLabel);
DrawListSettingProperty("_listType");
DrawListSettingProperty("_direction");
DrawListSettingProperty("_controlMode");
++EditorGUI.indentLevel;
if (HasFlag(
_controlMode.intValue,
(int)CircularScrollingList.ControlMode.Pointer)) {
DrawListSettingProperty("_alignAtFocusingPosition");
}
if (HasFlag(
_controlMode.intValue,
(int)CircularScrollingList.ControlMode.MouseWheel)) {
DrawListSettingProperty("_reverseScrollingDirection");
}
--EditorGUI.indentLevel;
DrawListSettingProperty("_focusingPosition");
++EditorGUI.indentLevel;
if (_focusingPosition.intValue ==
(int)CircularScrollingList.FocusingPosition.Center)
DrawListSettingProperty("_reverseContentOrder");
--EditorGUI.indentLevel;
DrawListSettingProperty("_initFocusingContentID");
DrawListSettingProperty("_focusSelectedBox");
DrawListSettingProperty("_initializeOnStart");
}
private void DrawListAppearance()
{
EditorGUILayout.LabelField("List Appearance", EditorStyles.boldLabel);
DrawListSettingProperty("_boxDensity");
DrawListSettingProperty("_boxPositionCurve");
DrawListSettingProperty("_boxScaleCurve");
if (HasFlag(
_controlMode.intValue,
(int)CircularScrollingList.ControlMode.Pointer))
DrawListSettingProperty("_boxVelocityCurve");
DrawListSettingProperty("_boxMovementCurve");
}
private void DrawEvents()
{
var boldFoldout =
new GUIStyle(EditorStyles.foldout) {
fontStyle = FontStyle.Bold
};
var onBoxSelected = GetListSettingProperty("_onBoxSelected");
onBoxSelected.isExpanded =
EditorGUILayout.Foldout(
onBoxSelected.isExpanded, "List Events", true, boldFoldout);
if (!onBoxSelected.isExpanded)
return;
++EditorGUI.indentLevel;
DrawListSettingProperty("_onBoxSelected");
DrawListSettingProperty("_onFocusingBoxChanged");
DrawListSettingProperty("_onMovementEnd");
--EditorGUI.indentLevel;
}
#endregion
#region Generate Boxes
private void GenerateBoxesAndArrange()
{
var scrollingList = target as CircularScrollingList;
if (!scrollingList)
return;
Undo.RecordObject(scrollingList, "Generate Boxes and Arrange");
scrollingList.GenerateBoxesAndArrange();
}
#endregion
#region Utility
private bool HasFlag(int enumIntValue, int flagValue)
{
return (enumIntValue & flagValue) != 0;
}
#endregion
}
}
... ...
fileFormatVersion: 2
guid: b4cf2c0d8a8536d44a450ecc475aafe0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
# Circular Scrolling List
<img src="./ReadmeData~/list_outline_demo.gif" width=350px />
The quick overview of version 6 - [Demo video](https://youtu.be/6y-_MaeWIAg)
## Outline
- [Circular Scrolling List](#circular-scrolling-list)
- [Outline](#outline)
- [Features](#features)
- [Setting](#setting)
- [Box Setting](#box-setting)
- [List Setting](#list-setting)
- [List Mode](#list-mode)
- [List Appearance](#list-appearance)
- [List Events](#list-events)
- [How to Use](#how-to-use)
- [Setup the List](#setup-the-list)
- [Set the Layout Area](#set-the-layout-area)
- [Set the Control Mode](#set-the-control-mode)
- [Set the Focusing Position](#set-the-focusing-position)
- [Appearance Curves](#appearance-curves)
- [Curve Presets](#curve-presets)
- [`ListBank` and `ListBox`](#listbank-and-listbox)
- [Custom `ListBank`](#custom-listbank)
- [Custom `ListBox`](#custom-listbox)
- [Use Them in the List](#use-them-in-the-list)
- [Pass Data of Primitive Type](#pass-data-of-primitive-type)
- [List Events](#list-events-1)
- [`OnBoxSelected` Event](#onboxselected-event)
- [`OnFocusingBoxChanged` Event](#onfocusingboxchanged-event)
- [Manually Get the Focusing Box](#manually-get-the-focusing-box)
- [`OnMovementEnd` event](#onmovementend-event)
- [Box Events](#box-events)
- [`OnInitialized` event](#oninitialized-event)
- [`OnBoxMoved` event](#onboxmoved-event)
- [Script Operations](#script-operations)
- [Late Initialization](#late-initialization)
- [Toggle List Interaction](#toggle-list-interaction)
- [Select the Content](#select-the-content)
- [Refresh the List](#refresh-the-list)
- [Stop the Movement](#stop-the-movement)
## Features
- Use finite list boxes to display infinite contents
- 2 list types: Circular or Linear mode
- 3 control modes: Pointer, Mouse wheel, and Script
- 3 focusing position: Top, Center, and Bottom
- Support both vertical and horizontal scrolling
- Support all three render modes of the canvas plane
- Custom layout and movement, and layout preview in the editor
- Custom displaying contents
- Support dynamic list contents
- Support interaction via the script - Content selection, toggle interaction state, etc.
- Runtime setup and initialization
- Image sorting - The focused box will be popped up
- Provide callback events
- Support Unity 2018.4+ (Tested in Unity 2018.4.15f1. The demo scenes in the project are made in Unity 2019.4.16f1)
## Setting
<img src="./ReadmeData~/circular_scrolling_list_panel_general.png" width=400px />
|Property|Description|
|:-------|:----------|
|**List Bank**|The game object that stores the contents for the list to display|
|**Box Setting**|The setting of the list box. See [Box Setting](#box-setting) section|
|**List Setting**|The setting of the list. See [List Setting](#list-setting) section|
### Box Setting
<img src="./ReadmeData~/circular_scrolling_list_panel_list_box_setting.png" width=400px />
|Property|Description|
|:-------|:----------|
|**Box Root Transform**|The root rect transform that holding the list boxes.<br>Default to the gameobject where the script is attached to|
|**Box Prefab**|The prefab of the list box|
|**Num Of Boxes**|The number of boxes to be generated|
|**Generate Boxes and Arrange**|Generate the boxes under the "Box Root Transform" and<br>arrange them according to the [list appearance](#list-appearance)|
|**Show/Hide the Boxes**|Show or hide the reference of managed boxes|
The managed boxes will be shown when click the "Show the Boxes" button, and be hidden by clicking the button again: \
<img src="./ReadmeData~/circular_scrolling_list_panel_show_the_boxes.png" width=600px />
### List Setting
#### List Mode
<img src="./ReadmeData~/circular_scrolling_list_panel_list_mode.png" width=470px />
|Property|Description|
|:-------|:----------|
|**List Type**|The type of the list. Could be **Circular** or **Linear**|
|**Direction**|The major scrolling direction. Could be **Vertical** or **Horizontal**|
|**Control Mode**|The controlling mode. Could be **Nothing**, or **Everthing**, **Pointer**, and **Mouse Wheel**<br>See [Set the Control Mode](#set-the-control-mode) for more information|
|┕ **Align At Focusing Position**|Whether to align a box at the focusing position after sliding or not.<br>Available if the control mode has **Pointer** set.|
|┕ **Reverse Scrolling Direction**|Whether to reverse the scrolling direction or not.<br>Available if the control mode has **Mouse Wheel** set.|
|**Focusing Position**|The focusing (ending) position of the list. Could be **Top**, **Center**, or **Bottom**<br>See [Set the Focusing Position](#set-the-focusing-position) for more information|
|┕ **Reverse Content Order**|Whether to reverse the content displaying order or not.<br>Available if the focusing position is **Center**.|
|**Init Focusing Content ID**|The initial content ID to be displayed in the focusing box|
|**Focus Selected Box**|Whether to move the selected box to the focusing position or not.<br>The list box must be a button to make this function take effect.|
|**Initialize On Start**|Whether to initialize the list in its `Start()` or not<br>If it is false, manually initialize the list by invoking `CircularScrollingList.Initialize()`|
#### List Appearance
<img src="./ReadmeData~/circular_scrolling_list_panel_list_appearance.png" width=470px />
|Property|Description|
|:-------|:----------|
|**Box Density**|The factor for adjusting the distance between boxes.<br>The larger, the closer|
|**Box Position Curve**|The curve specifying the minor position of the box|
|**Box Scale Curve**|The curve specifying the box scale|
|**Box Velocity Curve**|The curve specifying the velocity factor of the box after releasing.<br>Available if the control mode has **Pointer** set.|
|**Box Movement Curve**|The curve specifying the movement factor of the box|
For the detailed information of the curves, see [Appearance Curves](#appearance-curves).
#### List Events
<img src="./ReadmeData~/circular_scrolling_list_panel_list_events.png" width=470px />
|Property|Description|
|:-------|:----------|
|**On Box Selected**|The callback to be invoked when a box is selected by clicking.<br>The `ListBox` parameter is the selected box.|
|**On Focusing Box Changed**|The callback to be invoked when the focusing box is changed.<br>The first parameter is the previous focusing box,<br>and the second parameter is the current one.|
|**On Movement End**|The callback to be invoked when the list movement is ended|
## How to Use
### Setup the List
1. Add a Canvas plane to the scene. Set the render mode to "Screen Space - Camera" for example, and assign the "Main Camera" to the "Render Camera". Set the ui scale mode to "Scale With Screen Size", and the "Match" to 1. \
<img src="./ReadmeData~/step_a_1.png" width=400px />
2. Create an empty gameobject as the child of the canvas plane, rename it to "CircularScrollingList" (or other name you like), and set the height to 400. It will define the reference area of the list (See [Set the Layout Area](#set-the-layout-area) for more information). Then attach the script `ListPositionCtrl.cs` to it. \
<img src="./ReadmeData~/step_a_2.png" width=650px />
3. Create a Button gameobject as the child of the "CircularScrollingList", rename it to "ListBox", and adjust the image or text size if needed. \
<img src="./ReadmeData~/step_a_3.png" width=650px />
4. Create a new script `IntListBox.cs` and add the following code. For more information, see [ListBank and ListBox](#listbank-and-listbox) section.
```csharp
using AirFishLab.ScrollingList.ContentManagement;
using UnityEngine;
using UnityEngine.UI;
// The box used for displaying the content
// Must inherit from the class `ListBox`
public class IntListBox : ListBox
{
[SerializeField]
private Text _contentText;
// This function is invoked by the `CircularScrollingList` for updating the list content.
protected override void UpdateDisplayContent(IListContent listContent)
{
// Code will be added later
}
}
```
5. Attach the script `IntListBox.cs` to it, assign the gameobject "Text" of the Button to the "Content Text" of the `ListBox.cs`, and then create a prefab of it.\
<img src="./ReadmeData~/step_a_5.png" width=650px/>
6. Assign the created prefab to the "Box Prefab" in the "Box Setting" of the `CircularScrollingList.cs`. \
<img src="./ReadmeData~/step_a_6.png" width=650px/>
7. Click the "Generate Boxes and Arrange" button, and 4 more boxes will be generated and arranged. Click "Show the Boxes" button to view the referenced boxes. \
<img src="./ReadmeData~/step_a_7.png" width=800px />
8. Create a new script `IntListBank.cs` and add the following code. For more information, see [ListBank and ListBox](#listbank-and-listbox) section.
```csharp
using AirFishLab.ScrollingList.ContentManagement;
// The bank for providing the content for the box to display
// Must be inherit from the class BaseListBank
public class IntListBank : BaseListBank
{
// The content to be passed to the list box
// must inherit from the class `IListContent`.
public class Content : IListContent
{
public int Value;
}
private readonly int[] _contents = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
// This function will be invoked by the `CircularScrollingList`
// to get the content to display.
public override IListContent GetListContent(int index)
{
var content = new Content {
Value = _contents[index]
};
return content;
}
public override int GetContentCount()
{
return _contents.Length;
}
}
```
9. In the script `IntListBox.cs`, add the code to the function `UpdateDisplayContent()` to receive the content.
```csharp
using AirFishLab.ScrollingList.ContentManagement;
using UnityEngine;
using UnityEngine.UI;
// The box used for displaying the content
// Must inherit from the class `ListBox`
public class IntListBox : ListBox
{
[SerializeField]
private Text _contentText;
// This function is invoked by the `CircularScrollingList` for updating the list content.
protected override void UpdateDisplayContent(IListContent listContent)
{
var content = (IntListBank.Content)listContent;
_contentText.text = content.Value;
}
}
```
10. Attach the script `IntListBank.cs` to the gameobject "CircularScrollingList" (or another gameobejct you like), and assign the reference to the "List Bank" of the `CircularScrollingList.cs`. \
<img src="./ReadmeData~/step_a_10.png" width=650px />
11. Click "Play" to see the result
### Set the Layout Area
*Related demo scene: 01-ListType*
The rect size of the given "Box Root Transform" defines the layout area. If the direction of the list is **Vertical**, the list will use the height of the rect size to arrange the boxes. If the direction of the list is **Horizontal**, the list will use the width instead. \
<img src="./ReadmeData~/set-the-layout-area.png" width=650px />
The gap between the boxes could be adjusted by setting the "Box Density" in the "List Appearence" section of the setting. The higher, the closer. \
<img src="./ReadmeData~/set-the-layout-area-box-density.png" width=500px />
### Set the Control Mode
*Related demo scene: 02-ControlMode*
There are 3 control modes. Two of them could be toggled in the setting. \
<img src="./ReadmeData~/control-modes.png" width=450px />
- **Pointer**: The list can be moved by dragging it.
- **Align At Focusing Position** option will be shown if this control mode is set. If it is activated, the list will align a box to the focusing position after the list is released.
- **Mouse Wheel**: The list can be moved by scrolling the mouse wheel.
- **Reverse Scrolling Direction** option will be shown if this contol mode is set. If it is activated, the list will be scrolled in the reversed direction.
The last control mode is **Function**. The list can be moved by invoking `CircularScrollingList.MoveOneUnitUp()` or `CircularScrollingList.MoveOneUnitDown()`. In this mode, the list can be moved by buttons which invoking these two functions. \
<img src="./ReadmeData~/function_mode_demo.png" width=650px />
### Set the Focusing Position
*Related demo scene: 03-FocusingPosition*
The focusing position defines which box will be the focusing box at that position. The **Reverse Content Order** option will be shown if the focusing position is set to **Center**. \
<img src="./ReadmeData~/focusing-position.png" width=450px />
Here is the focusing position related to the position of the box. The focusing position will affect the result of the `OnFocusingBoxChanged` event. \
<img src="./ReadmeData~/focusing-position-target-box.png" width=650px />
If the focusing position is set to **Top**, the order of the displaying content will be from the top to the bottom. If it is **Bottom**, the order will be reversed. If it is **Center**, the order is decided by the **Reverse Content Order** option. \
<img src="./ReadmeData~/focusing-position-circular-list.png" width=500px />
The focusing position also defines the ending position of the **Linear** list. If it is set to **Top**, the list will be ended at the bottom. If it is set to **Bottom**, the list will be ended at the top. That is, unlike **Center** focusing position, the box showing the last content couldn't be dragged to the focusing position. \
<img src="./ReadmeData~/focusing-position-ending-position.png" width=500px />
But if the number of the content is less than the number of the boxes, the content will be shown from the focusing position, and the list couldn't be dragged, when the focusing position is set to **Top** or **Bottom**. \
<img src="./ReadmeData~/focusing-position-ending-position-fewer-content.png" width=500px />
### Appearance Curves
*Related demo scene: 04-LayoutAndMovement*
- **Box Position Curve**: The curve specifying the minor position of the box
- X axis: The major position of the box, which is mapped to [-1, 1] (from the smallest major position to the largest major position).
- Y axis: The factor of the minor position.
For example, in the vertical mode, the major position is the y position and the minor position is the x position: \
<img src="./ReadmeData~/list_position_vertical_curve_explain.png" width=700px /> \
It is intuitive in the horizontal mode: \
<img src="./ReadmeData~/list_position_horizontal_curve_explain.png" width=700px /> \
Note that "1" in the curve equals to `(number of boxes / 2) * unitPos`, where unitPos equals to `(width or length of root rect size / (number of boxes - 1))`. For example, if there are 5 boxes, then the length of "1" is 2.5 unitPos. And if the width of the root rect transform is 400, then the unitPos is 100.
- **Box Scale Curve**: The curve specifying the box scale
- X axis: Same as the box position curve
- Y axis: The scale value of the box at that major position
- **Box Velocity Curve**: The curve specifying the velocity factor of the box after releasing
- X axis: The movement duration in seconds, which starts from 0.
- Y axis: The factor of the releasing velocity. It should **start from 1 and end with 0**. \
<img src="./ReadmeData~/box_velocity_curve_example.png" width=400px />
- **Box Movement Curve**: The curve specifying the movement factor of the box.
- X axis: Same as the box velocity curve
- Y axis: The lerping factor between current position and the target position. It should **start from 0 and end with 1**. \
<img src="./ReadmeData~/box_movement_curve_example.png" width=400px />
#### Curve Presets
The project provides curve presets. Open the curve editing panel and select the `BoxCurvePresets` to use them. \
<img src="./ReadmeData~/import_curve_preset.png" width=500px /> \
<img src="./ReadmeData~/curve_preset_detail.png" /> \
Part A are position curves, part B are scale curves, part C is a velocity curve, and part D is a movement curve.
## `ListBank` and `ListBox`
*Related demo scene: 05-CustomContent*
Since version 5, the list supports custom content type. Different type of `ListBank` and `ListBox` can be used in the different list. In this section mentions how to implement your own `ListBank` and `ListBox`.
<img src="./ReadmeData~/custom_list_example.png" width=200px>
### Custom `ListBank`
Here is the example of the custom `ColorStrListBank`:
```csharp
using System;
using AirFishLab.ScrollingList.ContentManagement;
using UnityEngine;
public class ColorStrListBank : BaseListBank
{
[SerializeField]
private ColorString[] _contents;
public override IListContent GetListContent(int index)
{
return _contents[index];
}
public override int GetContentCount()
{
return _contents.Length;
}
}
[Serializable]
public class ColorString : IListContent
{
public Color color;
public string name;
}
```
The class must inherit from the class `BaseListBank`, and there are 2 methods to be implemented:
- `public override IListContent GetListContent(int index)`: The function for the list to get the content to display. The data object passed by this function should inherit `IListContent`, and it should be converted back to its orignal type for being used in the custom `ListBox`.
- `public override int GetListLength()`: Get the number of the content.
### Custom `ListBox`
Here is the example of the corresponding `ColorStrListBox`:
```csharp
using AirFishLab.ScrollingList.ContentManagement;
using UnityEngine;
using UnityEngine.UI;
public class ColorStrListBox : ListBox
{
[SerializeField]
private Image _contentImage;
[SerializeField]
private Text _contentText;
protected override void UpdateDisplayContent(IListContent content)
{
// Convert the content type back to the ColorString to get the data
var colorString = (ColorString)content;
_contentImage.color = colorString.color;
_contentText.text = colorString.name;
}
}
```
The class must inherit from the class `ListBox`, and there is 1 method to be implemented:
- `protected override void UpdateDisplayContent(IListContent content)`: The function for the list to update the content of the box. `content` is the content requested from `GetListContent()` of the custom list bank, and it should be converted back to its original type for being used.
### Use Them in the List
Same as the setup steps in the [Setup the List](#setup-the-list) section but replacing the `IntListBox` and `IntListBank` with your own version of `ListBox` and `ListBank`.
<img src="./ReadmeData~/custom_list_box_example.png" width=650px /> \
<img src="./ReadmeData~/custom_list_bank_example.png" width=650px />
### Pass Data of Primitive Type
If the type of the content is primitive type such as `int` or `string`, you should create a class carrying the data and make it inherit from the `IListContent`.
For example, for passing the string as the content:
```csharp
public class StringListBank : BaseListBank
{
/// <summary>
/// Used for carrying the data
/// </summary>
public class DataWrapper : IListContent
{
public string Data;
}
private string[] _contents = {"apple", "book", "car", "door", "egg"};
// Create a wrapper object for carrying the data
private DataWrapper _dataWrapper = new DataWrapper();
public override IListContent GetListContent(int index)
{
// Store the content in the data wrapper
_dataWrapper.Data = _contents[index];
return _dataWrapper;
}
public override int GetContentCount()
{
return _contents.Length;
}
}
public class StringListBox : ListBox
{
[SerializeField]
private Text _text;
protected override void UpdateDisplayContent(IListContent content)
{
var dataWrapper = (StringListBank.DataWrapper)content;
// Extract the content from the wrapper
_text.text = dataWrapper.Data;
}
}
```
## List Events
*Related demo scene: 06-ListEvents*
All the events could be subscribed or unsubscribed by script by invoking:
```csharp
CircularScrollingList.ListSetting.AddXXXCallback(callback)
CircularScrollingList.ListSetting.RemoveXXXCallback(callback)
```
### `OnBoxSelected` Event
When a box is clicked, the list will launch the `OnBoxSelected` event (actually launch from the `Button.onClick` event). The callback function (or the listener) for the event must have 1 parameter for receiving the focusing box.
Here is an example of the callback function:
```csharp
using AirFishLab.ScrollingList;
using UnityEngine;
using UnityEngine.UI;
public class ListEventDemo : MonoBehaviour
{
[SerializeField]
private CircularScrollingList _list;
[SerializeField]
private Text _selectedContentText;
public void OnBoxSelected(ListBox listBox)
{
var contentID = listBox.ContentID;
// Get the content by the content ID
var content = (IntListContent)_list.ListBank.GetListContent(contentID);
_selectedContentText.text =
$"Selected content ID: {contentID}, Content: {content}";
}
public void OnBoxSelected2(ListBox listBox)
{
// The other way is to convert the type of the box back to its original type,
// and then get the custom property from the box
var customBox = (CustomBox)listBox;
_selectedContentText.text =
$"Selected content ID: {customBox.ContentID}, Content: {customBox.Content}";
}
}
```
Then, assign it to the property "On Box Selected (ListBox)". \
<img src="./ReadmeData~/on-box-selected-event.png" width=500px>
It will be like (ReadmeData~/on-box-selected-event-demo.gif): \
<img src="./ReadmeData~/on-box-selected-event-demo.gif" width=400px />
### `OnFocusingBoxChanged` Event
The `OnFocusingBoxChanged` event will be invoked when the box at the specified "Focusing Position" is changed. Two parameters are required for the callback: the last focusing box and the current one.
Here is an example of the callback function:
```csharp
using AirFishLab.ScrollingList;
using UnityEngine;
using UnityEngine.UI;
public class ListEventDemo : MonoBehaviour
{
[SerializeField]
private CircularScrollingList _list;
[SerializeField]
private Text _autoUpdatedContentText;
public void OnFocusingBoxChanged(
ListBox prevFocusingBox, ListBox curFocusingBox)
{
var curFocusingIntBox = (IntListBox)curFocusingBox;
// The `IntListBox` has custom property `Content` for storing the displaying content
_autoUpdatedContentText.text =
$"(Auto updated)\nFocusing content: {curFocusingIntBox.Content}";
}
}
```
Assign it to the property "On Focusing Box Changed (ListBox, ListBox)" \
<img src="./ReadmeData~/on-focusing-box-changed.png" width=500px />
If the "Focusing Position" is set to **Center**, then it will be like (ReadmeData~/on-focusing-box-changed-demo.gif): \
<img src="./ReadmeData~/on-focusing-box-changed-demo.gif" width=320px />
If the "Focusing Position" is set to **Top**, then it will be like (ReadmeData~/on-focusing-box-changed-demo-top-pos.gif): \
<img src="./ReadmeData~/on-focusing-box-changed-demo-top-pos.gif" width=320px />
### Manually Get the Focusing Box
Manually get the focusing box by invoking:
```csharp
CircularScrollingList.GetFocusingBox()
```
To get the content id by invoking:
```csharp
CircularScrollingList.GetFocusingContentID()
```
For example, create a function which will update the content of the focusing content to the `Text`, and use a `Button` to invoke it.
```csharp
using AirFishLab.ScrollingList;
using UnityEngine;
using UnityEngine.UI;
public class ListEventDemo : MonoBehaviour
{
[SerializeField]
private CircularScrollingList _list;
[SerializeField]
private Text _displayText;
public void DisplayFocusingContent()
{
var focusingBox = (IntListBox)_list.GetFocusingBox();
// The `IntListBox` has custom property `Content` for storing the displaying content
var focusingContent = focusingBox.Content;
_displayText.text = "Focusing content: " + focusingContent;
}
}
```
If the "Focusing Position" is set to **Bottom**, then it will be like (ReadmeData~/get-focusing-box-demo.gif): \
<img src="./ReadmeData~/get-focusing-box-demo.gif" width=280px />
### `OnMovementEnd` event
`OnMovementEnd` event will be invoked when the list stops moving.
## Box Events
The `ListBox.cs` provides some event callbacks. You could define custom behaviour by overriding these event callbacks.
### `OnInitialized` event
`OnInitialized` event is invoked when the list is initialized (`CircularScrollingList.Initialize()`).
```csharp
public class MyListBox : ListBox
{
protected override void OnInitialized()
{
...
}
}
```
### `OnBoxMoved` event
`OnBoxMoved` event is invoked when the box is moving. In addition, when the box is initialized.
The event has 1 parameter `positionRatio` which is from -1 to 1.
```csharp
public class MyListBox : ListBox
{
[SerializedField]
private Image _image;
public override void OnBoxMoved(float positionRatio)
{
var color = _image.color;
color.a = 1 - Mathf.Abs(positionRatio);
_image.color = color;
}
}
```
## Script Operations
### Late Initialization
*Related demo scene: 07-LateInitialization*
If the **Initialize On Start** is not set, the list could be initialized by invoking:
```csharp
CircularScrollingList.Initialize()
```
The setting of the list could be setup before the `Initialize()` call. The `XXX` below is the placeholder of the setting name:
- To set the `ListBank` by invoking `CircularScrollingList.SetListBank()`
- To set the box setting by invoking `CircularScrollingList.BoxSetting.SetXXX()`, such as `SetBoxPrefab()`
- To set the list setting by invoking `CircularScrollingList.ListSetting.SetXXX()`, such as `SetFocusSelectedBox()`
- To register the event callback by invoking `CircularScrollingList.ListSetting.AddXXXCallback()`, such as `AddOnBoxSelectedCallback()`
- To unregister the event callback by invoking `CircularScrollingList.ListSetting.RemoveXXXCallback()`, such as `RemoveOnBoxSelctedCallback()`
The callback registration/unregistration could be invoked at any time. But for other functions, they will print the warning message and ignore the value after `Initialize()` call.
### Toggle List Interaction
*Related demo scene: 11-InteractingByScript*
The list interaction could be toggled by invoking:
```csharp
CircularScrolingList.SetInteractable(bool isInteractable)
```
and the current interaction state could be checked by:
```csharp
CircularScrollingList.IsInteractable
```
Here is an example:
```csharp
public class ListInteraction : MonoBehaviour
{
[SerializeField]
private CircularScrollingList _scrollingList;
[SerializeField]
private Text _toggleInteractionText;
public void ToggleListInteractable()
{
_scrollingList.SetInteractable(!_scrollingList.IsInteractable);
var interactingState = _scrollingList.IsInteractable ? "ON" : "OFF";
_toggleInteractionText.text = $"List interactable: {interactingState}";
}
}
```
### Select the Content
*Related demo scene: 10-SelectionMovement*
The list content could be selected from the script by invoking:
```csharp
CircularScrollingList.SelectContentID(int contentID, bool notToIgnore = true)
```
Whether the "Focus Selected Box" is on or off, the selected content will always be moved to the focusing position. \
If the specified `contentID` is invalid, it will raise `IndexOutOfRangeException`. It the list has no content to display, this function has no effect, no matter what the value of `contentID` is. \
If the `notToIgnore` is `true`, the selection movement still works even if the list is not interactable. If it is `false`, then this function call will be ignored instead.
Here is an example for iteration through the list contents by selecting each content:
```csharp
using AirFishLab.ScrollingList;
public class ListIteration : MonoBehaviour
{
[SerializeField]
private CircularScrollingList _list;
[SerializeField]
private float _stepInterval = 0.1f;
private int _currentID;
private void Start()
{
// Make the list not interactable while it is controlled by the script
_list.SetInteractable(false);
StartCoroutine(IterationLoop());
}
private IEnumerator IterationLoop()
{
while (true) {
// The selection movement still works even if the list is not interactable.
// The default value of 'notToIgnore' parameter is true.
_list.SelectContentID(_currentID);
_currentID =
(int)Mathf.Repeat(_currentID + 1, _list.listBank.GetListLength());
yield return new WaitForSeconds(_stepInterval);
}
}
}
```
It will be like (ReadmeData~/list_selection_demo.gif): \
<img src="./ReadmeData~/list_selection_demo.gif" width=320px />
### Refresh the List
*Related demo scene: 08-ListRefreshing*
When the content in the list bank is changed, make the list refresh its displaying contents by invoking:
```csharp
CircularScrollingList.Refresh(int focusingContentID = -1)
```
The boxes in the list will recalculate their content ID and reacquire the content from the list bank. \
The `focusingContentID` specifies the ID of the focusing content after the list is refreshed. If the value is invalid, the function will raise `IndexOutOfRangeException`. \
If the `focusingContentID` is negative, whose defalut value is -1, the list will use the current focusing content ID as the content ID of the focusing box (Note that it uses the ID, not content). If the current focusing content ID is larger than the number of contents, it will be the ID of the last content. If there is no content to be displayed before calling `Refresh()`, the focusing content ID will be 0.
Here is an example for extracting new contents and refresh the list:
```csharp
using AirFishLab.ScrollingList;
public class VariableStringListBank : BaseListBank
{
[SerializeField]
private InputField _contentInputField;
[SerializeField]
private string[] _contents = {"a", "b", "c", "d", "e"};
[SerializeField]
private CircularScrollingList _list;
private Content _dataWrapper = new Content();
/// <summary>
/// Extract the contents from the input field and refresh the list
/// </summary>
/// This function is assigned to a button.
public void ChangeContents()
{
_contents =
_contentInputField.text.Split(
new[] {',', ' '}, StringSplitOptions.RemoveEmptyEntries);
_list.Refresh();
}
public override IListContent GetListContent(int index)
{
_dataWrapper.Content = _contents[index];
return _dataWrapper;
}
public override int GetListLength()
{
return _contents.Length;
}
public class Content : IListContent
{
public string Value;
}
}
```
It will be like (ReadmeData~/list_refreshing_demo.gif): \
<img src="./ReadmeData~/list_refreshing_demo.gif" width=600px />
### Stop the Movement
*Related demo scene: 11-InteractingByScript*
The list movement could be stopped by invoking:
```csharp
CircularScrollingList.EndMovement()
```
A box will be aligned if the fucntion is invoked:
- during the **Mouse Wheel** or the **Function** movement, or
- during movement after the **Pointer** releases and the **Align At Focusing Position** option is set.
The `OnMovementEnd` event will be invoked when the movement is ended.
... ...
fileFormatVersion: 2
guid: ef99c8c5bdf673547bbf446a42b0a4b0
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...
fileFormatVersion: 2
guid: de360eb105c13fb47b743a0dc7e1e8f3
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...
fileFormatVersion: 2
guid: c3aac170f14188349ba1b62364b26270
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...
using System;
using System.Collections.Generic;
using AirFishLab.ScrollingList.ContentManagement;
using AirFishLab.ScrollingList.ListStateProcessing;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace AirFishLab.ScrollingList
{
/// <summary>
/// Manage and control the circular scrolling list
/// </summary>
public class CircularScrollingList : MonoBehaviour,
IBeginDragHandler, IDragHandler, IEndDragHandler, IScrollHandler
{
#region Enum Definitions
/// <summary>
/// The type of the list
/// </summary>
public enum ListType
{
Circular,
Linear
};
/// <summary>
/// The controlling mode of the list
/// </summary>
[Flags]
public enum ControlMode
{
/// <summary>
/// Control the list by the mouse pointer or finger
/// </summary>
Pointer = 1 << 0,
/// <summary>
/// Control the list by the mouse wheel
/// </summary>
MouseWheel = 1 << 1,
/// <summary>
/// All the control modes
/// </summary>
Everything = ~(~0 << 2),
};
/// <summary>
/// The focusing position of the list
/// </summary>
public enum FocusingPosition
{
Top,
Center,
Bottom,
}
/// <summary>
/// The major moving direction of the list
/// </summary>
public enum Direction
{
Vertical,
Horizontal
};
#endregion
#region Settings
[SerializeField]
[Tooltip("The object that stores the contents for the list to display. " +
"It should be derived from the class BaseListBank.")]
private BaseListBank _listBank;
[SerializeField]
private ListBoxSetting _boxSetting;
[SerializeField]
[Tooltip("The objects that are used for displaying the content. " +
"They should be derived from the class ListBox")]
private List<ListBox> _listBoxes;
[SerializeField]
[FormerlySerializedAs("_setting")]
[Tooltip("The setting of this list")]
private ListSetting _listSetting;
#endregion
#region Exposed Properties
public BaseListBank ListBank => _listBank;
public ListBox[] ListBoxes => _listBoxes.ToArray();
public ListBoxSetting BoxSetting => _boxSetting;
public ListSetting ListSetting => _listSetting;
/// <summary>
/// Is the list interactable?
/// </summary>
public bool IsInteractable => _isInteractable;
#endregion
#region Private Members
/// <summary>
/// The rect transform that this list belongs to
/// </summary>
private RectTransform _rectTransform;
/// <summary>
/// The camera that the parent canvas is referenced
/// </summary>
private Camera _canvasRefCamera;
/// <summary>
/// The controlling mode of the list
/// </summary>
private ControlMode _controlMode;
/// <summary>
/// The component for handing the user input
/// </summary>
private InputProcessor _inputProcessor;
/// <summary>
/// The component for processing the state of the list
/// </summary>
private IListMovementProcessor _listMovementProcessor;
/// <summary>
/// The component for managing the list boxes
/// </summary>
private IListBoxController _listBoxController;
/// <summary>
/// The component for providing the content for the boxes
/// </summary>
private ListContentProvider _listContentProvider;
/// <summary>
/// Is the list initialized?
/// </summary>
private bool _isInitialized;
/// <summary>
/// Is the list interactable?
/// </summary>
private bool _isInteractable = true;
/// <summary>
/// Does the list bank has no content?
/// </summary>
/// It is used for blocking any input if the list has nothing to display.
private bool _hasNoContent;
/// <summary>
/// Is the list moving?
/// </summary>
private bool _isMoving;
#endregion
private void Reset()
{
if (_boxSetting == null)
_boxSetting = new ListBoxSetting();
_boxSetting.BoxRootTransform = transform;
}
private void Start()
{
if (_listSetting.InitializeOnStart)
Initialize();
}
#region Initialization
/// <summary>
/// Set the list bank of the list
/// </summary>
public void SetListBank(BaseListBank listBank)
{
if (CheckIsInitialized())
return;
_listBank = listBank;
}
/// <summary>
/// Initialize the list
/// </summary>
public void Initialize()
{
if (CheckIsInitialized())
return;
Validate();
_boxSetting.Initialize(gameObject);
_listSetting.Initialize(_listBank, name);
GetComponentReference();
SetListBoxes();
InitializeMembers();
_isInitialized = true;
}
/// <summary>
/// Check if the list is initialized
/// </summary>
private bool CheckIsInitialized()
{
if (_isInitialized)
Debug.LogWarning($"The list '{name}' is initialized. Skip.");
return _isInitialized;
}
/// <summary>
/// Validate the setting
/// </summary>
private void Validate()
{
if (!_listBank)
throw new UnassignedReferenceException(
$"The 'ListBank' is not assigned in the list '{name}'");
}
/// <summary>
/// Get the reference of the used component
/// </summary>
private void GetComponentReference()
{
_rectTransform = GetComponent<RectTransform>();
var parentCanvas = GetComponentInParent<Canvas>();
if (parentCanvas.renderMode != RenderMode.ScreenSpaceOverlay)
_canvasRefCamera = parentCanvas.worldCamera;
}
/// <summary>
/// Initialize the related list members
/// </summary>
private void InitializeMembers()
{
if (_listSetting.FocusSelectedBox)
_listSetting.OnBoxSelected.AddListener(
box => SelectContentID(box.ContentID, false));
_controlMode = _listSetting.ControlMode;
_inputProcessor =
new InputProcessor(_rectTransform, _canvasRefCamera);
_listContentProvider =
new ListContentProvider(_listSetting, _listBank, _listBoxes.Count);
_hasNoContent = _listContentProvider.GetContentCount() == 0;
var setupData =
new ListSetupData(
this, _listSetting, _rectTransform, _canvasRefCamera,
new List<IListBox>(_listBoxes), _listContentProvider);
ListStateProcessorManager.GetProcessors(
setupData, out _listMovementProcessor, out _listBoxController);
}
#endregion
#region Box Setup Functions
/// <summary>
/// Set the list boxes to be used by the list
/// </summary>
private void SetListBoxes()
{
var prefab = _boxSetting.BoxPrefab;
var rootTransform = _boxSetting.BoxRootTransform;
var numOfBoxes = _boxSetting.NumOfBoxes;
#if UNITY_EDITOR
var undoGroupID = Undo.GetCurrentGroup();
#endif
var curNumOfBoxes = ReassignListBoxes(_listBoxes, rootTransform, numOfBoxes);
for (var i = curNumOfBoxes; i < numOfBoxes; ++i) {
var box = GenerateListBox(prefab, rootTransform, i);
#if UNITY_EDITOR
Undo.RegisterCreatedObjectUndo(
box.gameObject, "Generate Boxes and Arrange");
Undo.CollapseUndoOperations(undoGroupID);
// TODO Record the change of the list boxes
#endif
_listBoxes.Add(box);
}
}
/// <summary>
/// Reassign the list boxes from the box root transform
/// </summary>
/// <param name="listBoxes">The container for holding the boxes</param>
/// <param name="rootTransform">The root transform for finding boxes</param>
/// <param name="desiredNumOfBoxes">The number of desired boxes</param>
/// <returns>The number of boxes added</returns>
private int ReassignListBoxes(
List<ListBox> listBoxes, Transform rootTransform, int desiredNumOfBoxes)
{
var existingBoxes = new List<ListBox>();
foreach (Transform child in rootTransform) {
if (!child.TryGetComponent<ListBox>(out var box))
continue;
existingBoxes.Add(box);
}
var numOfExistingBoxes = existingBoxes.Count;
if (numOfExistingBoxes > desiredNumOfBoxes)
Debug.LogWarning("The number of existing boxes are more than "
+ $"the number of desired boxes in the list '{name}'");
var numOfBoxes = Mathf.Min(numOfExistingBoxes, desiredNumOfBoxes);
listBoxes.Clear();
for (var i = 0; i < numOfBoxes; ++i) {
listBoxes.Add(existingBoxes[i]);
}
return numOfBoxes;
}
/// <summary>
/// Generate a list box under the box root transform
/// </summary>
/// <param name="prefab">The prefab of the box</param>
/// <param name="rootTransform">
/// The root transform for the box to be generated at
/// </param>
/// <param name="index">The index of the box</param>
/// <returns>The generated box</returns>
private static ListBox GenerateListBox(
ListBox prefab, Transform rootTransform, int index)
{
ListBox box;
#if UNITY_EDITOR
if (!Application.isPlaying && PrefabUtility.IsPartOfAnyPrefab(prefab)) {
// If it is the prefab instance, get the source prefab asset
if (PrefabUtility.IsPartOfPrefabInstance(prefab))
prefab = PrefabUtility.GetCorrespondingObjectFromSource(prefab);
box = PrefabUtility.InstantiatePrefab(prefab, rootTransform) as ListBox;
}
else
#endif
box = Instantiate(prefab, rootTransform);
box.name = $"{prefab.name} ({index})";
return box;
}
#endregion
#region Public Movement Operations
/// <summary>
/// Whether the list is interactable or not
/// </summary>
/// <param name="interactable">Is the list interactable?</param>
public void SetInteractable(bool interactable)
{
_isInteractable = interactable;
}
/// <summary>
/// Move the list one unit up or right
/// </summary>
public void MoveOneUnitUp()
{
if (_hasNoContent)
return;
SetUnitMovement(1);
}
/// <summary>
/// Move the list one unit down or left
/// </summary>
public void MoveOneUnitDown()
{
if (_hasNoContent)
return;
SetUnitMovement(-1);
}
/// <summary>
/// Stop the list immediately
/// </summary>
public void EndMovement()
{
if (_listMovementProcessor.IsMovementEnded())
return;
var toAlign = _listMovementProcessor.NeedToAlign();
_listMovementProcessor.EndMovement(toAlign);
if (toAlign)
return;
_listSetting.OnMovementEnd.Invoke();
_isMoving = false;
}
#endregion
#region Public Box And Content Operations
/// <summary>
/// Get the focusing box
/// </summary>
public ListBox GetFocusingBox() =>
_listBoxController.GetFocusingBox() as ListBox;
/// <summary>
/// Get the content ID of the focusing box
/// </summary>
public int GetFocusingContentID() =>
_listBoxController.GetFocusingBox().ContentID;
/// <summary>
/// Make the boxes recalculate their content ID and reacquire the contents
/// </summary>
/// <param name="focusingContentID">
/// The focusing content ID after the list is refreshed
/// If it is negative, it will take current focusing content ID. <para />
/// If current focusing content ID is larger than the number of contents,
/// it will be the ID of the last content.
/// </param>
public void Refresh(int focusingContentID = -1)
{
_hasNoContent = _listContentProvider.GetContentCount() == 0;
_listBoxController.RefreshBoxes(focusingContentID);
}
/// <summary>
/// Select the specified content ID and make it be aligned at the center
/// </summary>
/// <param name="contentID">The target content ID</param>
/// <param name="notToIgnore">
/// Not to ignore the selection movement when the list is not interactable
/// </param>
public void SelectContentID(int contentID, bool notToIgnore = true)
{
if (_hasNoContent)
return;
if (!_listContentProvider.IsIDValid(contentID))
throw new IndexOutOfRangeException(
$"'{nameof(contentID)}' is invalid");
var focusingContentID = GetFocusingContentID();
var idDiff =
_listContentProvider.GetShortestIDDiff(focusingContentID, contentID);
SetSelectionMovement(idDiff, notToIgnore);
}
#endregion
#region Event System Callback
public void OnBeginDrag(PointerEventData eventData)
{
if (!_controlMode.HasFlag(ControlMode.Pointer))
return;
SetMovement(eventData, InputPhase.Began);
}
public void OnDrag(PointerEventData eventData)
{
if (!_controlMode.HasFlag(ControlMode.Pointer))
return;
SetMovement(eventData, InputPhase.Moved);
}
public void OnEndDrag(PointerEventData eventData)
{
if (!_controlMode.HasFlag(ControlMode.Pointer))
return;
SetMovement(eventData, InputPhase.Ended);
}
public void OnScroll(PointerEventData eventData)
{
if (!_controlMode.HasFlag(ControlMode.MouseWheel))
return;
SetMovement(eventData, InputPhase.Scrolled);
}
#endregion
private void Update()
{
if (!_isInitialized || !_isMoving)
return;
var movementValue = _listMovementProcessor.GetMovement(Time.deltaTime);
_listBoxController.UpdateBoxes(movementValue);
if (!_listMovementProcessor.IsMovementEnded())
return;
_listSetting.OnMovementEnd.Invoke();
_isMoving = false;
}
#region Movement Setup Functions
/// <summary>
/// Whether to ignore the movement request or not
/// </summary>
private bool ToIgnoreMovement()
{
return _hasNoContent || !_isInteractable;
}
/// <summary>
/// Set the movement to the list movement processor
/// </summary>
private void SetMovement(PointerEventData eventData, InputPhase phase)
{
if (ToIgnoreMovement())
return;
var inputInfo = _inputProcessor.GetInputInfo(eventData, phase);
_listMovementProcessor.SetMovement(inputInfo);
_isMoving = true;
}
/// <summary>
/// Set the unit movement to the list movement processor
/// </summary>
/// <param name="unit">The units to be moved</param>
private void SetUnitMovement(int unit)
{
if (ToIgnoreMovement())
return;
_listMovementProcessor.SetUnitMovement(unit);
_isMoving = true;
}
/// <summary>
/// Set the selection movement to the list movement processor
/// </summary>
/// <param name="shortestIDDiff">
/// The shortest id difference between centered content and the selected content
/// </param>
/// <param name="notToIgnore">Not to ignore this movement</param>
private void SetSelectionMovement(int shortestIDDiff, bool notToIgnore)
{
if (!notToIgnore && ToIgnoreMovement())
return;
_listMovementProcessor.SetSelectionMovement(shortestIDDiff);
_isMoving = true;
}
#endregion
#region Editor Utility
#if UNITY_EDITOR
/// <summary>
/// Generate the boxes and arrange them
/// </summary>
public void GenerateBoxesAndArrange()
{
if (Application.isPlaying)
return;
GetComponentReference();
SetListBoxes();
// It's ok that the content provider is not created
var setupData = new ListSetupData(
this, _listSetting, _rectTransform, _canvasRefCamera,
new List<IListBox>(_listBoxes), null);
ListStateProcessorManager.PreviewBoxLayout(setupData);
}
#endif
#endregion
}
}
... ...
fileFormatVersion: 2
guid: 831ecc00ba8a38f448ccce2a87cd76db
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
fileFormatVersion: 2
guid: 3662b4ff103ca9e4e8a81d2ad481b23d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...
using System;
namespace AirFishLab.ScrollingList.ContentManagement
{
/// <summary>
/// The state of the content id
/// </summary>
[Flags]
public enum ContentIDState
{
/// <summary>
/// There has no content in the list bank
/// </summary>
NoContent = 0,
/// <summary>
/// The id is valid for getting the content
/// </summary>
Valid = 1 << 0,
/// <summary>
/// The id is less than 0
/// </summary>
Underflow = 1 << 1,
/// <summary>
/// The id is greater than or equals to the number of the contents
/// </summary>
Overflow = 1 << 2,
/// <summary>
/// The id is the first content
/// </summary>
First = 1 << 3,
/// <summary>
/// The id is the last content
/// </summary>
Last = 1 << 4,
}
}
... ...
fileFormatVersion: 2
guid: dfc03e6cf77fbf14385c17006ef5b7fd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
namespace AirFishLab.ScrollingList.ContentManagement
{
/// <summary>
/// The content for the list boxes
/// </summary>
public interface IListContent
{
}
}
... ...
fileFormatVersion: 2
guid: ed576fcf853bb2c4aa6cf304c1eec302
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using System;
using UnityEngine;
namespace AirFishLab.ScrollingList.ContentManagement
{
public class ListContentProvider
{
#region Constant Value
/// <summary>
/// The content id that represents there has no content to display
/// </summary>
public const int NO_CONTENT_ID = int.MinValue;
#endregion
#region Private Members
/// <summary>
/// The setting of the list
/// </summary>
private readonly ListSetting _listSetting;
/// <summary>
/// The components holding the list contents
/// </summary>
private readonly IListBank _listBank;
/// <summary>
/// The number of the list boxes
/// </summary>
private readonly int _numOfBoxes;
/// <summary>
/// The factor for getting the next/last content ID
/// </summary>
private readonly int _idFactor;
/// <summary>
/// The function for calculating the final content ID
/// </summary>
private readonly Func<int, int> _idCalculationFunc;
#endregion
/// <summary>
/// Constructor
/// </summary>
/// <param name="listSetting">The setting of the list</param>
/// <param name="listBank">The list content bank</param>
/// <param name="numOfBoxes">The number of boxes</param>
public ListContentProvider(
ListSetting listSetting, IListBank listBank, int numOfBoxes)
{
_listSetting = listSetting;
_listBank = listBank;
_numOfBoxes = numOfBoxes;
_idFactor = _listSetting.ReverseContentOrder ? -1 : 1;
if (_listSetting.ListType == CircularScrollingList.ListType.Circular)
_idCalculationFunc = GetLoopedContentID;
else
_idCalculationFunc = GetNonLoopedContentID;
}
#region Content ID Calculation
/// <summary>
/// Get the initial content ID for the specified box
/// </summary>
/// <param name="listBoxID">The id of the box</param>
/// <returns>The content ID</returns>
public int GetInitialContentID(int listBoxID)
{
var contentCount = GetContentCount();
if (contentCount == 0)
return NO_CONTENT_ID;
var contentID = 0;
var initFocusedContentID = _listSetting.InitFocusingContentID;
switch (_listSetting.FocusingPosition) {
case CircularScrollingList.FocusingPosition.Top:
case CircularScrollingList.FocusingPosition.Bottom:
if (_listSetting.ListType
== CircularScrollingList.ListType.Circular)
// No need to do content adjusting in the circular mode
contentID = 0;
else if (contentCount <= _numOfBoxes)
initFocusedContentID = 0;
else {
var numOfLackingContents =
contentCount - initFocusedContentID - _numOfBoxes;
if (numOfLackingContents < 0)
initFocusedContentID += numOfLackingContents;
}
// The reverse content order will be true,
// if focusing position is 'bottom'.
// Otherwise, it will be false.
contentID =
_listSetting.ReverseContentOrder
? _numOfBoxes - 1 - listBoxID + initFocusedContentID
: listBoxID + initFocusedContentID;
break;
case CircularScrollingList.FocusingPosition.Center:
contentID =
_listSetting.ReverseContentOrder
? _numOfBoxes / 2 - listBoxID
: listBoxID - _numOfBoxes / 2;
contentID += initFocusedContentID;
break;
}
return _idCalculationFunc(contentID);
}
/// <summary>
/// Get the content id after the list content is refreshed
/// </summary>
/// <param name="origContentID">The original content ID</param>
/// <returns>The converted content ID</returns>
public int GetRefreshedContentID(int origContentID) =>
_listBank.GetContentCount() == 0
? NO_CONTENT_ID
: _idCalculationFunc(origContentID);
/// <summary>
/// Get the content ID according to the content ID of the next box
/// </summary>
/// <param name="nextBoxContentID">The content ID of the next box</param>
/// <returns>The content ID</returns>
public int GetContentIDByNextBox(int nextBoxContentID) =>
_idCalculationFunc(nextBoxContentID - _idFactor);
/// <summary>
/// Get the content ID according to the content ID of the last box
/// </summary>
/// <param name="lastBoxContentID">The content ID of the last box</param>
/// <returns>The content ID</returns>
public int GetContentIDByLastBox(int lastBoxContentID) =>
_idCalculationFunc(lastBoxContentID + _idFactor);
/// <summary>
/// Check the state of the specified id
/// </summary>
/// <param name="contentID">The content id</param>
/// <returns>The state of the id</returns>
public ContentIDState GetIDState(int contentID)
{
return GetIDState(contentID, _listBank.GetContentCount());
}
/// <summary>
/// Check the state of the specified id
/// </summary>
/// <param name="contentID">The content id</param>
/// <param name="contentCount">The number of the contents</param>
/// <returns>The state of the id</returns>
public static ContentIDState GetIDState(int contentID, int contentCount)
{
if (contentID == NO_CONTENT_ID)
return ContentIDState.NoContent;
var state = contentID < 0
? ContentIDState.Underflow
: contentID >= contentCount
? ContentIDState.Overflow
: ContentIDState.Valid;
if (state != ContentIDState.Valid)
return state;
if (contentID == 0)
state |= ContentIDState.First;
if (contentID == contentCount - 1)
state |= ContentIDState.Last;
return state;
}
/// <summary>
/// Is the content id valid for getting the list content?
/// </summary>
/// <param name="contentID">The content id</param>
/// <returns>The content id is valid or not</returns>
public bool IsIDValid(int contentID) =>
contentID >= 0 && contentID < _listBank.GetContentCount();
/// <summary>
/// Get the shortest length for starting from one id to another id
/// </summary>
/// <param name="fromContentID">The starting content id</param>
/// <param name="toContentID">The target content id</param>
/// <returns>The shortest length</returns>
public int GetShortestIDDiff(int fromContentID, int toContentID)
{
if (!IsIDValid(fromContentID))
throw new IndexOutOfRangeException(nameof(fromContentID));
if (!IsIDValid(toContentID))
throw new IndexOutOfRangeException(nameof(toContentID));
var length = toContentID - fromContentID;
if (_listSetting.ListType == CircularScrollingList.ListType.Linear)
return length;
var numOfContents = _listBank.GetContentCount();
var halfNumOfContents = numOfContents / 2;
if (Mathf.Abs(length) > halfNumOfContents)
length -= (int) Mathf.Sign(length) * numOfContents;
return length;
}
/// <summary>
/// Loop the input ID within the range of the indexes of the contents
/// </summary>
private int GetLoopedContentID(int contentID) =>
(int)Mathf.Repeat(contentID, _listBank.GetContentCount());
/// <summary>
/// Just return the input ID
/// </summary>
private int GetNonLoopedContentID(int contentID) => contentID;
#endregion
#region Content Handling
/// <summary>
/// Get the number of the contents
/// </summary>
public int GetContentCount() => _listBank.GetContentCount();
/// <summary>
/// Try to get the content of the list
/// </summary>
/// <param name="contentID">The id of the content</param>
/// <param name="content">
/// The content. If the content is not available, it will be null.
/// </param>
/// <returns>It the content available?</returns>
public bool TryGetContent(int contentID, out IListContent content)
{
var isIDValid = IsIDValid(contentID);
content = isIDValid ? _listBank.GetListContent(contentID) : null;
return isIDValid;
}
#endregion
}
}
... ...
fileFormatVersion: 2
guid: b89e5bd958468194e8d125d7fb9348bb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using AirFishLab.ScrollingList.ContentManagement;
namespace AirFishLab.ScrollingList
{
public interface IListBank
{
/// <summary>
/// Get the list content
/// </summary>
/// <param name="index">The index of the content</param>
/// <returns>The content</returns>
IListContent GetListContent(int index);
/// <summary>
/// Get the number of the contents
/// </summary>
/// <returns>The number of content</returns>
int GetContentCount();
}
}
... ...
fileFormatVersion: 2
guid: 02ac4bf6ed5ab1241a409616eafd1d81
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using AirFishLab.ScrollingList.ContentManagement;
using UnityEngine;
namespace AirFishLab.ScrollingList
{
/// <summary>
/// The interface of the list box
/// </summary>
public interface IListBox
{
/// <summary>
/// The id of the box
/// </summary>
int ListBoxID { get; }
/// <summary>
/// The id of the content that the box refers
/// </summary>
int ContentID { get; }
/// <summary>
/// The last list box
/// </summary>
IListBox LastListBox { get; }
/// <summary>
/// The next list box
/// </summary>
IListBox NextListBox { get; }
/// <summary>
/// The event to be invoked when the box is selected
/// </summary>
ListBoxSelectedEvent OnBoxSelected { get; }
/// <summary>
/// Is the box activated?
/// </summary>
bool IsActivated { get; set; }
/// <summary>
/// The list which this box belongs to
/// </summary>
CircularScrollingList ScrollingList { get; }
/// <summary>
/// Initialize the list box
/// </summary>
/// <param name="scrollingList">The list which this box belongs to</param>
/// <param name="listBoxID">The id of the box</param>
/// <param name="lastListBox">The last box</param>
/// <param name="nextListBox">The next box</param>
void Initialize(
CircularScrollingList scrollingList,
int listBoxID, IListBox lastListBox, IListBox nextListBox);
/// <summary>
/// Get the transform of the box
/// </summary>
/// <returns>The transform of the box</returns>
Transform GetTransform();
/// <summary>
/// Get the box position factor in the list
/// </summary>
/// <returns>The box position factor</returns>
float GetPositionFactor();
/// <summary>
/// The function to be invoked when the box is moved
/// NOTE: This function is for the future feature
/// </summary>
/// <param name="positionRatio">
/// The ratio of the position in the list, which is from -1 to 1.
/// 0 means that thw box is at the center of the list
/// </param>
void OnBoxMoved(float positionRatio);
/// <summary>
/// Set the content id of the box
/// </summary>
/// <param name="contentID">The content id</param>
void SetContentID(int contentID);
/// <summary>
/// Set the content for the box
/// </summary>
/// <param name="content">The content</param>
void SetContent(IListContent content);
/// <summary>
/// Pop the box to the front
/// </summary>
void PopToFront();
/// <summary>
/// Push the box to the back
/// </summary>
void PushToBack();
}
}
... ...
fileFormatVersion: 2
guid: bbd60f6bae853ab4aa572073d97ddd72
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
fileFormatVersion: 2
guid: 003d0c2e746f8d44daa94f9eb7d985b3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...
using UnityEngine;
namespace AirFishLab.ScrollingList
{
/// <summary>
/// The data of the input information
/// </summary>
public struct InputInfo
{
/// <summary>
/// The phase of the input timing
/// </summary>
public InputPhase Phase;
/// <summary>
/// The local delta position of the input
/// </summary>
/// <remarks>
/// If the <c>Phase</c> is Began, the value will be 0.
/// If the <c>Phase</c> is Scrolled, the value will be scroll delta.
/// </remarks>
public Vector2 DeltaLocalPos;
/// <summary>
/// The normalized delta position whose value is [-1, 1]
/// </summary>
public Vector2 DeltaLocalPosNormalized;
/// <summary>
/// The delta time between two input events
/// </summary>
/// <remarks>
/// If the <c>Phase</c> is Began or Scrolled, it will be 0.
/// </remarks>
public float DeltaTime;
public override string ToString() =>
$"Phase: {Phase}, "
+ $"DeltaLocalPos: {DeltaLocalPos}, "
+ $"DeltaLocalPosNormalized: {DeltaLocalPosNormalized}, "
+ $"DeltaTime: {DeltaTime}";
}
/// <summary>
/// The phase of the input timing
/// </summary>
public enum InputPhase
{
None,
Began,
Moved,
Ended,
Scrolled
}
}
... ...
fileFormatVersion: 2
guid: 28884e566e24aba449221d18fa6a7738
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using UnityEngine;
using UnityEngine.EventSystems;
namespace AirFishLab.ScrollingList
{
/// <summary>
/// The class for processing the input value
/// </summary>
public class InputProcessor
{
#region Private Members
/// <summary>
/// The target detecting rect transform
/// </summary>
private readonly RectTransform _rectTransform;
/// <summary>
/// The maximum coordinate of the target rect transform
/// </summary>
private readonly Vector2 _maxRectPos;
/// <summary>
/// The camera which the canvas is referenced
/// </summary>
private readonly Camera _canvasRefCamera;
/// <summary>
/// The time of the last input event
/// </summary>
private float _lastInputTime;
/// <summary>
/// The last input position in the space of the target rect transform
/// </summary>
private Vector2 _lastLocalInputPos;
#endregion
public InputProcessor(RectTransform rectTransform, Camera canvasRefCamera)
{
_rectTransform = rectTransform;
_maxRectPos = _rectTransform.rect.max;
_canvasRefCamera = canvasRefCamera;
}
/// <summary>
/// Get the input information according to the input event data
/// </summary>
public InputInfo GetInputInfo(PointerEventData eventData, InputPhase phase)
{
var deltaPos =
phase == InputPhase.Scrolled
? GetScrollDeltaPos(eventData.scrollDelta)
: GetDeltaPos(eventData.position, phase);
var deltaPosNormalized =
new Vector2(
deltaPos.x / _maxRectPos.x,
deltaPos.y / _maxRectPos.y);
var curTime = Time.realtimeSinceStartup;
if (phase == InputPhase.Began || phase == InputPhase.Scrolled)
_lastInputTime = curTime;
var deltaTime = curTime - _lastInputTime;
_lastInputTime = curTime;
return new InputInfo {
Phase = phase,
DeltaLocalPos = deltaPos,
DeltaLocalPosNormalized = deltaPosNormalized,
DeltaTime = deltaTime
};
}
/// <summary>
/// Get the unit delta pos for the scrolling
/// </summary>
/// <param name="scrollDelta">The original input value</param>
/// <returns>The unit delta pos</returns>
private Vector2 GetScrollDeltaPos(Vector2 scrollDelta)
{
// Ignore the scalar, only return the unit pos and the direction
return scrollDelta.y > 0 ? Vector2.up : Vector2.down;
}
/// <summary>
/// Calculate the local delta position
/// </summary>
private Vector2 GetDeltaPos(Vector2 screenInputPos, InputPhase phase)
{
RectTransformUtility.ScreenPointToLocalPointInRectangle(
_rectTransform, screenInputPos, _canvasRefCamera, out var localPos);
if (phase == InputPhase.Began) {
_lastLocalInputPos = localPos;
return Vector2.zero;
}
var deltaPos = localPos - _lastLocalInputPos;
_lastLocalInputPos = localPos;
return deltaPos;
}
}
}
... ...
fileFormatVersion: 2
guid: 3a564f7df25922643abfa1ba9977145e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using AirFishLab.ScrollingList.ContentManagement;
using UnityEngine;
namespace AirFishLab.ScrollingList
{
/// <summary>
/// Store the contents for the list boxes to display
/// </summary>
public abstract class BaseListBank : MonoBehaviour, IListBank
{
public abstract IListContent GetListContent(int index);
public abstract int GetContentCount();
}
/* The example of the ListBank
*/
public class ListBank : BaseListBank
{
private int[] contents = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
private readonly Content _contentWrapper = new Content();
public override IListContent GetListContent(int index)
{
_contentWrapper.Value = contents[index];
return _contentWrapper;
}
public override int GetContentCount()
{
return contents.Length;
}
public class Content : IListContent
{
public int Value;
}
}
}
... ...
fileFormatVersion: 2
guid: baffa4b9e229e4b4d9a150fcb5a60153
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using System;
using AirFishLab.ScrollingList.ContentManagement;
using AirFishLab.ScrollingList.Util;
using UnityEngine;
using UnityEngine.UI;
namespace AirFishLab.ScrollingList
{
/// <summary>
/// The basic component of the scrolling list.
/// Control the position and update the content of the list element.
/// </summary>
public class ListBox : MonoBehaviour, IListBox
{
#region Properties of IListBox
public int ListBoxID { get; private set; }
public int ContentID { get; private set; }
public IListBox LastListBox { get; private set; }
public IListBox NextListBox { get; private set; }
public ListBoxSelectedEvent OnBoxSelected { get; } = new ListBoxSelectedEvent();
public CircularScrollingList ScrollingList { get; private set; }
public bool IsActivated
{
get => _gameObject.activeSelf;
set => _gameObject.SetActive(value);
}
#endregion
#region Private Members
private GameObject _gameObject;
private Transform _transform;
private Func<Vector2, float> _factorFunc;
#endregion
#region IListBox
public void Initialize(
CircularScrollingList scrollingList,
int listBoxID, IListBox lastListBox, IListBox nextListBox)
{
ScrollingList = scrollingList;
ListBoxID = listBoxID;
LastListBox = lastListBox;
NextListBox = nextListBox;
_gameObject = gameObject;
_transform = transform;
if (scrollingList.ListSetting.Direction
== CircularScrollingList.Direction.Horizontal)
_factorFunc = FactorUtility.GetVector2X;
else
_factorFunc = FactorUtility.GetVector2Y;
RegisterClickEvent();
OnInitialized();
}
public Transform GetTransform()
{
#if UNITY_EDITOR
if (!Application.isPlaying)
return transform;
#endif
return _transform;
}
public float GetPositionFactor()
{
return _factorFunc(_transform.localPosition);
}
public virtual void OnBoxMoved(float positionRatio)
{}
public void SetContentID(int contentID)
{
ContentID = contentID;
}
public void SetContent(IListContent content)
{
UpdateDisplayContent(content);
}
public void PopToFront()
{
transform.SetAsLastSibling();
}
public void PushToBack()
{
transform.SetAsFirstSibling();
}
#endregion
#region Initialization
/// <summary>
/// Register the callback to the button clicking event
/// </summary>
private void RegisterClickEvent()
{
if (TryGetComponent<Button>(out var button)) {
button.onClick.AddListener(OnButtonClick);
}
}
private void OnButtonClick()
{
OnBoxSelected?.Invoke(this);
}
#endregion
#region Content Handling
/// <summary>
/// This function is called after the box is initialized
/// </summary>
protected virtual void OnInitialized()
{}
/// <summary>
/// Update the displaying content on the ListBox
/// </summary>
/// <param name="content">The content to be displayed</param>
protected virtual void UpdateDisplayContent(IListContent content)
{
Debug.Log(content);
}
#endregion
}
}
... ...
fileFormatVersion: 2
guid: d74fb0bc5cdce554eba6c60a0e789157
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using System;
using UnityEngine;
namespace AirFishLab.ScrollingList
{
[Serializable]
public class ListBoxSetting
{
[SerializeField]
[Tooltip("The root transform that holding the list boxes")]
private Transform _boxRootTransform;
[SerializeField]
[Tooltip("The prefab of the box")]
private ListBox _boxPrefab;
[SerializeField, Min(1)]
[Tooltip("The number of boxes to be generated")]
private int _numOfBoxes = 5;
public Transform BoxRootTransform
{
get => _boxRootTransform;
set => _boxRootTransform = value;
}
public ListBox BoxPrefab => _boxPrefab;
public int NumOfBoxes => _numOfBoxes;
#region Private Members
/// <summary>
/// The name of the list
/// </summary>
private string _name;
/// <summary>
/// Is the setting initialized?
/// </summary>
private bool _isInitialized;
#endregion
#region Property Setter
public void SetBoxRootTransform(RectTransform rootTransform)
{
if (CheckIsInitialized())
return;
_boxRootTransform = rootTransform;
}
public void SetBoxPrefab(ListBox boxPrefab)
{
if (CheckIsInitialized())
return;
_boxPrefab = boxPrefab;
}
public void SetNumOfBoxes(int numOfBoxes)
{
if (CheckIsInitialized())
return;
_numOfBoxes = numOfBoxes;
}
#endregion
/// <summary>
/// Is the box setting initialized?
/// </summary>
private bool CheckIsInitialized()
{
if (_isInitialized)
Debug.LogWarning(
$"The list setting of the list '{_name}' is initialized. Skip");
return _isInitialized;
}
/// <summary>
/// Initialize the setting
/// </summary>
/// <param name="listObject">The game object of the scrolling list</param>
public void Initialize(GameObject listObject)
{
var listName = listObject.name;
if (!BoxRootTransform) {
Debug.LogWarning(
$"The 'BoxRootTransform' is not assigned in the list '{listName}'. "
+ "Use itself as the 'BoxRootTransform'");
BoxRootTransform = listObject.transform;
}
if (!BoxPrefab)
throw new UnassignedReferenceException(
$"The 'BoxPrefab' is not assigned in the list '{listName}'");
if (NumOfBoxes <= 0)
throw new InvalidOperationException(
$"The 'NumOfBoxes' is 0 or negative in the list '{listName}'");
_name = listName;
_isInitialized = true;
}
}
}
... ...
fileFormatVersion: 2
guid: 59ac863c7aee14240a107bdee39edb86
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using System;
using UnityEngine.Events;
namespace AirFishLab.ScrollingList
{
/// <summary>
/// This event is used for passing the selected box
/// </summary>
[Serializable]
public class ListBoxSelectedEvent : UnityEvent<ListBox>
{}
/// <summary>
/// This event is used for passing the two list boxes
/// </summary>
[Serializable]
public class ListTwoBoxesEvent : UnityEvent<ListBox, ListBox>
{}
}
... ...
fileFormatVersion: 2
guid: 588b9c003192ecc43afce3f28213e518
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Serialization;
namespace AirFishLab.ScrollingList
{
[Serializable]
public class ListSetting
{
#region List Mode
[SerializeField]
[Tooltip("The type of the list.")]
private CircularScrollingList.ListType _listType =
CircularScrollingList.ListType.Circular;
[SerializeField]
[Tooltip("The major moving direction of the list.")]
private CircularScrollingList.Direction _direction =
CircularScrollingList.Direction.Vertical;
[SerializeField]
[Tooltip("The controlling mode of the list.")]
private CircularScrollingList.ControlMode _controlMode =
CircularScrollingList.ControlMode.Everything;
[SerializeField]
[Tooltip("The focusing position of the list")]
private CircularScrollingList.FocusingPosition _focusingPosition =
CircularScrollingList.FocusingPosition.Center;
[SerializeField]
[Tooltip("To show the list contents in the reversed order. "
+ "Available when the 'FocusingPosition' is 'center'")]
[FormerlySerializedAs("_reverseOrder")]
private bool _reverseContentOrder;
[SerializeField]
[Tooltip("To align a box at the focusing position after sliding")]
[FormerlySerializedAs("_alignMiddle")]
[FormerlySerializedAs("_alignInCenter")]
private bool _alignAtFocusingPosition;
[SerializeField]
[Tooltip("To reverse the scrolling direction")]
[FormerlySerializedAs("_reverseDirection")]
private bool _reverseScrollingDirection;
[SerializeField]
[Tooltip("Specify the initial content ID at the focusing position")]
[FormerlySerializedAs(" _centeredContentID")]
private int _initFocusingContentID;
[SerializeField]
[Tooltip("Move the selected box to the focusing position")]
[FormerlySerializedAs("_centerSelectedBox")]
private bool _focusSelectedBox;
[SerializeField]
[Tooltip("Whether to initialize the list on Start or not. " +
"If set to false, manually call Initialize() to initialize the list.")]
private bool _initializeOnStart = true;
#endregion
#region List Appearance
[SerializeField]
[Tooltip("The factor that adjusting the distance between boxes. " +
"The larger, the closer.")]
private float _boxDensity = 1.0f;
[SerializeField]
[Tooltip("The curve specifying the passive position of the box. " +
"The x axis is the major position of the box, which is mapped to [-1, 1]. " +
"The y axis defines the factor of the passive position of the box. " +
"Point (0, 0) is the center of the list layout.")]
private AnimationCurve _boxPositionCurve =
AnimationCurve.Constant(-1.0f, 1.0f, 0.0f);
[SerializeField]
[Tooltip("The curve specifying the box scale. " +
"The x axis is the major position of the box, which is mapped to [-1, 1]. " +
"The y axis specifies the value of 'localScale' of the box at the " +
"corresponding position.")]
private AnimationCurve _boxScaleCurve =
AnimationCurve.Constant(-1.0f, 1.0f, 1.0f);
[SerializeField]
[Tooltip("The curve specifying the velocity factor of the box after releasing. " +
"The x axis is the the moving duration in seconds, which starts from 0. " +
"The y axis is the factor of releasing velocity.")]
private AnimationCurve _boxVelocityCurve =
new AnimationCurve(
new Keyframe(0.0f, 1.0f, 0.0f, -2.5f),
new Keyframe(1.0f, 0.0f, 0.0f, 0.0f));
[SerializeField]
[Tooltip("The curve specifying the movement factor of the box. " +
"The x axis is the moving duration in seconds, which starts from 0. " +
"The y axis is the lerping factor for reaching the target position.")]
private AnimationCurve _boxMovementCurve =
new AnimationCurve(
new Keyframe(0.0f, 0.0f, 0.0f, 8f),
new Keyframe(0.25f, 1.0f, 0.0f, 0.0f));
#endregion
#region Events
[SerializeField]
[Tooltip("The callback to be invoked when a box is selected. " +
"The registered callbacks will be added to the 'onClick' event of boxes, " +
"therefore, boxes should be 'Button's.")]
private ListBoxSelectedEvent _onBoxSelected;
[SerializeField]
[Tooltip("The callback to be invoked when the focusing box is changed. " +
"The first argument is previous focusing box, " +
"and the second one is current focusing box.")]
[FormerlySerializedAs("_onCenteredBoxChanged")]
private ListTwoBoxesEvent _onFocusingBoxChanged;
[SerializeField]
[Tooltip("The callback to be invoked when the movement is ended")]
private UnityEvent _onMovementEnd;
#endregion
#region Setting Getter
public CircularScrollingList.ListType ListType => _listType;
public CircularScrollingList.Direction Direction => _direction;
public CircularScrollingList.ControlMode ControlMode => _controlMode;
public bool AlignAtFocusingPosition => _alignAtFocusingPosition;
public bool ReverseScrollingDirection => _reverseScrollingDirection;
public CircularScrollingList.FocusingPosition FocusingPosition =>
_focusingPosition;
public bool ReverseContentOrder => _reverseContentOrder;
public int InitFocusingContentID => _initFocusingContentID;
public bool FocusSelectedBox => _focusSelectedBox;
public bool InitializeOnStart => _initializeOnStart;
public float BoxDensity => _boxDensity;
public AnimationCurve BoxPositionCurve => _boxPositionCurve;
public AnimationCurve BoxScaleCurve => _boxScaleCurve;
public AnimationCurve BoxVelocityCurve => _boxVelocityCurve;
public AnimationCurve BoxMovementCurve => _boxMovementCurve;
public ListBoxSelectedEvent OnBoxSelected => _onBoxSelected;
public ListTwoBoxesEvent OnFocusingBoxChanged => _onFocusingBoxChanged;
public UnityEvent OnMovementEnd => _onMovementEnd;
#endregion
#region Private Members
/// <summary>
/// The name of the list
/// </summary>
private string _name;
/// <summary>
/// Is the setting initialized?
/// </summary>
private bool _isInitialized;
#endregion
#region Property Setters
public void SetListType(CircularScrollingList.ListType listType)
{
if (CheckIsInitialized())
return;
_listType = listType;
}
public void SetDirection(CircularScrollingList.Direction direction)
{
if (CheckIsInitialized())
return;
_direction = direction;
}
public void SetControlMode(CircularScrollingList.ControlMode controlMode)
{
if (CheckIsInitialized())
return;
_controlMode = controlMode;
}
public void SetAlignAtFocusingPosition(bool toAlign)
{
if (CheckIsInitialized())
return;
_alignAtFocusingPosition = toAlign;
}
public void SetReverseScrollingDirection(bool toReverse)
{
if (CheckIsInitialized())
return;
_reverseScrollingDirection = toReverse;
}
public void SetFocusingPosition(
CircularScrollingList.FocusingPosition focusingPosition)
{
if (CheckIsInitialized())
return;
_focusingPosition = focusingPosition;
}
public void SetReverseContentOrder(bool toReverse)
{
if (CheckIsInitialized())
return;
_reverseContentOrder = toReverse;
}
public void SetInitFocusingContentID(int contentID)
{
if (CheckIsInitialized())
return;
_initFocusingContentID = contentID;
}
public void SetFocusSelectedBox(bool toFocus)
{
if (CheckIsInitialized())
return;
_focusSelectedBox = toFocus;
}
#endregion
#region Appearance Setters
public void SetBoxDensity(float boxDensity)
{
if (CheckIsInitialized())
return;
_boxDensity = boxDensity;
}
public void SetBoxPositionCurve(AnimationCurve curve)
{
if (CheckIsInitialized())
return;
_boxPositionCurve = curve;
}
public void SetBoxScaleCurve(AnimationCurve curve)
{
if (CheckIsInitialized())
return;
_boxScaleCurve = curve;
}
public void SetBoxVelocityCurve(AnimationCurve curve)
{
if (CheckIsInitialized())
return;
_boxVelocityCurve = curve;
}
public void SetBoxMovementCurve(AnimationCurve curve)
{
if (CheckIsInitialized())
return;
_boxMovementCurve = curve;
}
#endregion
#region Event Setters
public void AddOnBoxSelectedCallback(UnityAction<ListBox> callback) =>
_onBoxSelected.AddListener(callback);
public void RemoveOnBoxSelectedCallback(UnityAction<ListBox> callback) =>
_onBoxSelected.RemoveListener(callback);
public void AddOnFocusingBoxChangedCallback(
UnityAction<ListBox, ListBox> callback) =>
_onFocusingBoxChanged.AddListener(callback);
public void RemoveOnFocusingBoxChangedCallback(
UnityAction<ListBox, ListBox> callback) =>
_onFocusingBoxChanged.RemoveListener(callback);
public void AddOnMovementEndCallback(UnityAction callback) =>
_onMovementEnd.AddListener(callback);
public void RemoveOnMovementEndCallback(UnityAction callback) =>
_onMovementEnd.RemoveListener(callback);
#endregion
#region Public Functions
/// <summary>
/// Is the list initialized?
/// </summary>
private bool CheckIsInitialized()
{
if (_isInitialized)
Debug.LogWarning(
$"The list setting of the list '{_name}' is initialized. Skip");
return _isInitialized;
}
/// <summary>
/// Initialize the settings
/// </summary>
/// <param name="listBank">The list bank</param>
/// <param name="name">The name of the list</param>
public void Initialize(BaseListBank listBank, string name)
{
var contentCount = listBank.GetContentCount();
if (_initFocusingContentID < 0
|| (contentCount > 0 && _initFocusingContentID >= contentCount))
throw new IndexOutOfRangeException(
"The 'InitFocusingContentID' is negative "
+ "or greater than the number of contents in the list bank "
+ $"in the list '{name}'.");
if (Mathf.Approximately(_boxDensity, 0f))
throw new InvalidOperationException(
$"The 'BoxDensity' shouldn't be 0 in the list '{name}'");
switch (_focusingPosition) {
case CircularScrollingList.FocusingPosition.Top:
_reverseContentOrder = false;
break;
case CircularScrollingList.FocusingPosition.Bottom:
_reverseContentOrder = true;
break;
}
_name = name;
_isInitialized = true;
}
#endregion
}
}
... ...
fileFormatVersion: 2
guid: a2fd1ffb35261eb4e82cf7a148212876
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using System.Collections.Generic;
using AirFishLab.ScrollingList.ContentManagement;
using UnityEngine;
namespace AirFishLab.ScrollingList
{
/// <summary>
/// The data for setting up the list
/// </summary>
public class ListSetupData
{
#region Public Members
/// <summary>
/// The scrolling list
/// </summary>
public readonly CircularScrollingList ScrollingList;
/// <summary>
/// The setting of the list
/// </summary>
public readonly ListSetting ListSetting;
/// <summary>
/// The root rect transform of the list
/// </summary>
public readonly RectTransform RectTransform;
/// <summary>
/// The camera that the root canvas is referenced
/// </summary>
/// If the canvas is in "Screen Space - Overlay" mode, it will be null.
public readonly Camera CanvasRefCamera;
/// <summary>
/// The boxes in the list
/// </summary>
public readonly List<IListBox> ListBoxes;
/// <summary>
/// The components for providing the list contents
/// </summary>
public readonly ListContentProvider ListContentProvider;
#endregion
public ListSetupData(
CircularScrollingList scrollingList,
ListSetting listSetting, RectTransform rectTransform,
Camera canvasRefCamera, List<IListBox> listBoxes,
ListContentProvider listContentProvider)
{
ScrollingList = scrollingList;
ListSetting = listSetting;
RectTransform = rectTransform;
CanvasRefCamera = canvasRefCamera;
ListBoxes = listBoxes;
ListContentProvider = listContentProvider;
}
}
}
... ...
fileFormatVersion: 2
guid: 226efc1966183ac4b8725f3fa26b93f0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
fileFormatVersion: 2
guid: e987fb3fa5514564cbf5b037fe035412
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...
namespace AirFishLab.ScrollingList.ListStateProcessing
{
/// <summary>
/// The state of the box transform position
/// </summary>
public enum BoxPositionState
{
Nothing,
JumpToTop,
JumpToBottom,
}
}
... ...
fileFormatVersion: 2
guid: 0d1bb7c63807ed943bb88cd80d417063
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
using UnityEngine;
namespace AirFishLab.ScrollingList.ListStateProcessing
{
/// <summary>
/// The interface for controlling the box transform
/// </summary>
public interface IBoxTransformController
{
/// <summary>
/// Set the initial local transform
/// </summary>
/// <param name="box">The target box</param>
/// <param name="boxID">The id of the box</param>
void SetInitialLocalTransform(IListBox box, int boxID);
/// <summary>
/// Update the local transform of the box according to the moving distance
/// </summary>
/// <param name="box">The target box</param>
/// <param name="deltaPos">The moving distance</param>
/// <returns>The final status of the transform position</returns>
BoxPositionState UpdateLocalTransform(IListBox box, float deltaPos);
}
}
... ...
fileFormatVersion: 2
guid: a6abd419fc468014baa0d60c952a6ecd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
namespace AirFishLab.ScrollingList.ListStateProcessing
{
/// <summary>
/// The interface for controlling the list boxes
/// </summary>
public interface IListBoxController
{
/// <summary>
/// Set the boxes to the controller
/// </summary>
/// <param name="setupData">The setup data of the list</param>
void Initialize(ListSetupData setupData);
/// <summary>
/// Update the state of the boxes
/// </summary>
/// <param name="movementValue">The value for moving the boxes</param>
void UpdateBoxes(float movementValue);
/// <summary>
/// Make the boxes recalculate their content ID and reacquire the content
/// </summary>
/// <param name="focusingContentID">The new focusing content ID</param>
void RefreshBoxes(int focusingContentID = -1);
/// <summary>
/// Get the focusing box
/// </summary>
/// <returns>The current focusing box</returns>
IListBox GetFocusingBox();
}
}
... ...
fileFormatVersion: 2
guid: 52ea34424a638624ca119742ab49e2dc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
namespace AirFishLab.ScrollingList.ListStateProcessing
{
/// <summary>
/// The interface of the processor for controlling the list movement
/// </summary>
public interface IListMovementProcessor
{
/// <summary>
/// Initialize the controller
/// </summary>
/// <param name="setupData">The data for setting up the list</param>
void Initialize(ListSetupData setupData);
/// <summary>
/// Set the movement
/// </summary>
/// <param name="inputInfo">The information of the input value</param>
void SetMovement(InputInfo inputInfo);
/// <summary>
/// Set the movement for moving several times of units
/// </summary>
/// <param name="unit">The number of units to move</param>
void SetUnitMovement(int unit);
/// <summary>
/// Set the movement for centering the selected box
/// </summary>
/// <param name="units">The number of units to move</param>
void SetSelectionMovement(int units);
/// <summary>
/// Get the current movement for the boxes
/// </summary>
/// <param name="detailTime">The time passed in seconds in this call</param>
/// <returns>The value for moving the boxes</returns>
float GetMovement(float detailTime);
/// <summary>
/// Is the movement ended?
/// </summary>
bool IsMovementEnded();
/// <summary>
/// Whether need to align a box or not
/// </summary>
bool NeedToAlign();
/// <summary>
/// Discard the current movement
/// </summary>
/// <param name="toAlign">Whether to align a box</param>
void EndMovement(bool toAlign);
}
}
... ...
fileFormatVersion: 2
guid: 5e768792902e39946824fcea2a5a6401
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
... ...
fileFormatVersion: 2
guid: de4017d8903b2e042b411a2cd5b0c472
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...
fileFormatVersion: 2
guid: cf8b16b2a6c9ddf42ba06cd41aaa3da7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
... ...