diff --git a/Editor/UIExtensionsMenuOptions.cs b/Editor/UIExtensionsMenuOptions.cs index 0a5ad98..9e9267b 100644 --- a/Editor/UIExtensionsMenuOptions.cs +++ b/Editor/UIExtensionsMenuOptions.cs @@ -1815,6 +1815,17 @@ namespace UnityEditor.UI } #endregion + #region Menu Manager GO + [MenuItem("GameObject/UI/Extensions/Menu Manager", false)] + static public void AddMenuManager(MenuCommand menuCommand) + { + GameObject child = new GameObject("MenuManager"); + Undo.RegisterCreatedObjectUndo(child, "Create " + "MenuManager"); + child.AddComponent(); + Selection.activeGameObject = child; + } + #endregion + #endregion diff --git a/Examples/FancyScrollView/Document.meta b/Examples/FancyScrollView/Document.meta new file mode 100644 index 0000000..f650613 --- /dev/null +++ b/Examples/FancyScrollView/Document.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 583ffd54340754c459d1e7bd81e90246 +folderAsset: yes +timeCreated: 1501932884 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/FancyScrollView/Document/infiniteScrollSettings.png b/Examples/FancyScrollView/Document/infiniteScrollSettings.png new file mode 100644 index 0000000..fa39193 Binary files /dev/null and b/Examples/FancyScrollView/Document/infiniteScrollSettings.png differ diff --git a/Examples/FancyScrollView/Document/infiniteScrollSettings.png.meta b/Examples/FancyScrollView/Document/infiniteScrollSettings.png.meta new file mode 100644 index 0000000..b6db8b5 --- /dev/null +++ b/Examples/FancyScrollView/Document/infiniteScrollSettings.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: 3afd820ab47a7ad4c93c3f65f7504dae +timeCreated: 1501932884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/FancyScrollView/Document/inspector.png b/Examples/FancyScrollView/Document/inspector.png new file mode 100644 index 0000000..d18e3af Binary files /dev/null and b/Examples/FancyScrollView/Document/inspector.png differ diff --git a/Examples/FancyScrollView/Document/inspector.png.meta b/Examples/FancyScrollView/Document/inspector.png.meta new file mode 100644 index 0000000..3b73f6a --- /dev/null +++ b/Examples/FancyScrollView/Document/inspector.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: 3c51f0505df8ace4085bc6439a41c10b +timeCreated: 1501932884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/FancyScrollView/Document/screencast1.gif b/Examples/FancyScrollView/Document/screencast1.gif new file mode 100644 index 0000000..7f54ec9 Binary files /dev/null and b/Examples/FancyScrollView/Document/screencast1.gif differ diff --git a/Examples/FancyScrollView/Document/screencast1.gif.meta b/Examples/FancyScrollView/Document/screencast1.gif.meta new file mode 100644 index 0000000..a6bed0f --- /dev/null +++ b/Examples/FancyScrollView/Document/screencast1.gif.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: d14f8a797b068614581812bd4e927077 +timeCreated: 1501932884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/FancyScrollView/Document/screencast2.gif b/Examples/FancyScrollView/Document/screencast2.gif new file mode 100644 index 0000000..9d8bff2 Binary files /dev/null and b/Examples/FancyScrollView/Document/screencast2.gif differ diff --git a/Examples/FancyScrollView/Document/screencast2.gif.meta b/Examples/FancyScrollView/Document/screencast2.gif.meta new file mode 100644 index 0000000..3aff6ee --- /dev/null +++ b/Examples/FancyScrollView/Document/screencast2.gif.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: d45321e545c13724ab2ba5721db45b93 +timeCreated: 1501932884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/FancyScrollView/Document/screencast3.gif b/Examples/FancyScrollView/Document/screencast3.gif new file mode 100644 index 0000000..73f7843 Binary files /dev/null and b/Examples/FancyScrollView/Document/screencast3.gif differ diff --git a/Examples/FancyScrollView/Document/screencast3.gif.meta b/Examples/FancyScrollView/Document/screencast3.gif.meta new file mode 100644 index 0000000..1704f27 --- /dev/null +++ b/Examples/FancyScrollView/Document/screencast3.gif.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: d9ab7e8869df23c40a3327a44afc271d +timeCreated: 1501932884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/FancyScrollView/README.md b/Examples/FancyScrollView/README.md new file mode 100644 index 0000000..9dc3633 --- /dev/null +++ b/Examples/FancyScrollView/README.md @@ -0,0 +1,127 @@ +> Content needs translating to english, tbc +> For now see the [UI Extensions documents](https://bitbucket.org/UnityUIExtensions/unity-ui-extensions/wiki/Controls/FancyScrollView) here for additional info + +# FancyScrollView [![License](https://img.shields.io/github/license/setchi/FancyScrollView.svg?style=flat-square)](LICENSE) + +セルの動きを自由に制御できる汎用 ScrollView コンポーネントです。[English](https://translate.google.com/translate?sl=ja&tl=en&u=https://github.com/setchi/FancyScrollView) (by Google Translate) + +![screencast](Document/screencast1.gif) + +## 仕組み +FancyScrollView はセルの位置を更新する際に、画面に見える範囲を正規化した値を各セルに渡します。セル側では 0.0 ~ 1.0 の値をもとにスクロール中の見た目を自由に制御してください。 + +## 使い方 +もっともシンプルな構成では、 + +- セルにデータを渡すためのオブジェクト +- スクロールビュー +- セル + +の実装が必要です。 + +### スクリプトの実装 +セルにデータを渡すためのオブジェクトを定義します。 +```csharp +public class MyCellDto +{ + public string Message; +} +``` +FancyScrollView を継承して自分のスクロールビューを実装します。 + +```csharp +using UnityEngine; +using System.Linq; + +public class MyScrollView : FancyScrollView +{ + [SerializeField] + ScrollPositionController scrollPositionController; + + void Awake() + { + base.Awake(); + + base.cellData = Enumerable.Range(0, 50) + .Select(i => new MyCellDto { Message = "Cell " + i }) + .ToList(); + + scrollPositionController.SetDataCount(base.cellData.Count); + scrollPositionController.OnUpdatePosition(base.UpdatePosition); + } +} +``` +FancyScrollViewCell を継承して自分のセルを実装します +```csharp +using UnityEngine; +using UnityEngine.UI; + +public class MyScrollViewCell : FancyScrollViewCell +{ + [SerializeField] + Text message; + + public override void UpdateContent(MyCellDto itemData) + { + message.text = itemData.Message; + } + + public override void UpdatePosition(float position) + { + // position は 0.0 ~ 1.0 の値です + // position をもとに、セルの見た目を自由に制御してください + } +} +``` +### インスペクタ上の設定 +![screencast](Document/inspector.png) +#### My Scroll View +| プロパティ | 説明 | +|:-----------|:------------| +|Cell Interval|セル同士の間隔を float.Epsilon ~ 1.0 の間で指定します。| +|Cell Offset|セルのオフセットを指定します。例えば 0.5 を指定して、スクロール位置が 0 の場合、最初のセルの位置が 0.5 になります。| +|Loop|オンにすると、セルをループして配置します。無限スクロールさせたい場合はオンにします。| +|Cell Base|セルのもととなる GameObject を指定します。| + +#### Scroll Position Controller +| プロパティ | 説明 | +|:-----------|:------------| +|Viewport|ビューポートとなる RectTransform を指定します。ここで指定された RectTransform の範囲内でジェスチャーの検出を行います。| +|Direction Of Recognize|ジェスチャーを認識する方向を Vertical か Horizontal で指定します。| +|Movement Type|コンテンツがスクロール範囲を越えて移動するときに使用する挙動を指定します。| +|Elasticity|コンテンツがスクロール範囲を越えて移動するときに使用する弾力性の量を指定します。| +|Scroll Sensitivity|スクロールの感度を指定します。| +|Inertia|慣性のオン/オフを指定します。| +|Deceleration Rate|Inertia がオンの場合のみ有効です。減速率を指定します。| +|Snap - Enable|Snap を有効にする場合オンにします。| +|Snap - Velocity Threshold|Snap がはじまる閾値となる速度を指定します。| +|Snap - Duration|Snap 時の移動時間を秒数で指定します。| +|Data Count|アイテムのデータ件数の総数です。基本的にスクリプトから設定します。| + +## Q&A + +#### データ件数が多くてもパフォーマンスは大丈夫? +セルは表示に必要な数のみ生成するので、データ件数がパフォーマンスに与える影響は小さいです。 +データ件数よりも、セルの間隔(同時に存在するセルの数)やセルの演出の方がパフォーマンスに与える影響が大きいです。 + +#### 自分でスクロール位置を制御したいんだけど? +スクロール位置は自分で好きなように制御できます。サンプルで使用している ScrollPositionController は独自の実装に置き換えられます。 + +#### セルで発生したイベントを受け取れる? +セルで発生したあらゆるイベントをハンドリングできます。 +サンプルにセルで発生したイベントをハンドリングする実装を含めているので、それを参考に実装してください。 + +[Examples/02_CellEventHandling](https://github.com/setchi/FancyScrollView/tree/master/Assets/FancyScrollView/Examples/02_CellEventHandling) のスクリーンキャスト +![screencast](Document/screencast3.gif) + +#### セルをLoop(無限スクロール)させたいんだけど? +- ScrollView の「Loop」をオンにすると、セルをループして配置します。 +- サンプルで使用している ScrollPositionController を使う場合は、「Movement Type」を「Unrestricted」にするとスクロール範囲が無制限になります。 + +![screencast](Document/infiniteScrollSettings.png) + +## 開発環境 +Unity 2017.1.0f3 + +## LICENSE +MIT diff --git a/Examples/FancyScrollView/README.md.meta b/Examples/FancyScrollView/README.md.meta new file mode 100644 index 0000000..2806952 --- /dev/null +++ b/Examples/FancyScrollView/README.md.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 435a8014e0736334d8dcddbf7a20d01a +timeCreated: 1501932884 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/MenuExample/Scripts/Menus/MainMenu.cs b/Examples/MenuExample/Scripts/Menus/MainMenu.cs index 7a85693..6c1eac2 100644 --- a/Examples/MenuExample/Scripts/Menus/MainMenu.cs +++ b/Examples/MenuExample/Scripts/Menus/MainMenu.cs @@ -1,6 +1,4 @@ -using UnityEngine.UI.Extensions.Examples; - -namespace UnityEngine.UI.Extensions.Examples +namespace UnityEngine.UI.Extensions.Examples { public class MainMenu : SimpleMenu { diff --git a/README.md b/README.md index 8062ad1..9875db1 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ UIPolygon|||| ------|------|------|------| Horizontal Scroll Snap|Vertical Scroll Snap|Flow Layout Group|Radial Layout|Tile Size Fitter Scroll Snap (alt implementation)|Reorderable List|UI Vertical Scroller|Curved Layout|Table Layout +FancyScrollView|||| |||| [Effects](https://bitbucket.org/UnityUIExtensions/unity-ui-extensions/wiki/Controls#markdown-header-effect_components)||||| @@ -149,7 +150,7 @@ ReturnKeyTrigger|TabNavigation|uGUITools|ScrollRectTweener|ScrollRectLinker ScrollRectEx|UI_InfiniteScroll|UI_ScrollRectOcclusion|UIScrollToSelection|UISelectableExtension switchToRectTransform|ScrollConflictManager|CLFZ2 (Encryption)|Serialization|DragCorrector PPIViewer|UI_TweenScale|UI_InfiniteScroll|UI_ScrollRectOcclusion|NonDrawingGraphic -UILineConnector|UIHighlightable||| +UILineConnector|UIHighlightable|MenuSystem|| |||| *More to come* diff --git a/Scripts/MenuSystem/Menu.cs b/Scripts/MenuSystem/Menu.cs index 1acad6a..c0f932d 100644 --- a/Scripts/MenuSystem/Menu.cs +++ b/Scripts/MenuSystem/Menu.cs @@ -1,6 +1,6 @@ -/// Credit BinaryX -/// Sourced from - http://forum.unity3d.com/threads/scripts-useful-4-6-scripts-collection.264161/page-2#post-1945602 -/// Updated by ddreaper - removed dependency on a custom ScrollRect script. Now implements drag interfaces and standard Scroll Rect. +/// Credit Adam Kapos (Nezz) - http://www.songarc.net +/// Sourced from - https://github.com/YousicianGit/UnityMenuSystem +/// Updated by SimonDarksideJ - Refactored to be a more generic component using UnityEngine.EventSystems; diff --git a/Scripts/MenuSystem/MenuManager.cs b/Scripts/MenuSystem/MenuManager.cs index 8f729fb..d748bb6 100644 --- a/Scripts/MenuSystem/MenuManager.cs +++ b/Scripts/MenuSystem/MenuManager.cs @@ -1,13 +1,14 @@ -/// Credit BinaryX -/// Sourced from - http://forum.unity3d.com/threads/scripts-useful-4-6-scripts-collection.264161/page-2#post-1945602 -/// Updated by ddreaper - removed dependency on a custom ScrollRect script. Now implements drag interfaces and standard Scroll Rect. +/// Credit Adam Kapos (Nezz) - http://www.songarc.net +/// Sourced from - https://github.com/YousicianGit/UnityMenuSystem +/// Updated by SimonDarksideJ - Refactored to be a more generic component using System.Collections.Generic; using System.Reflection; namespace UnityEngine.UI.Extensions { - + [AddComponentMenu("UI/Extensions/Menu Manager")] + [DisallowMultipleComponent] public class MenuManager : MonoBehaviour { public Menu[] MenuScreens; diff --git a/Scripts/MenuSystem/SimpleMenu.cs b/Scripts/MenuSystem/SimpleMenu.cs index aabef1c..0731921 100644 --- a/Scripts/MenuSystem/SimpleMenu.cs +++ b/Scripts/MenuSystem/SimpleMenu.cs @@ -1,6 +1,6 @@ -/// Credit BinaryX -/// Sourced from - http://forum.unity3d.com/threads/scripts-useful-4-6-scripts-collection.264161/page-2#post-1945602 -/// Updated by ddreaper - removed dependency on a custom ScrollRect script. Now implements drag interfaces and standard Scroll Rect. +/// Credit Adam Kapos (Nezz) - http://www.songarc.net +/// Sourced from - https://github.com/YousicianGit/UnityMenuSystem +/// Updated by SimonDarksideJ - Refactored to be a more generic component namespace UnityEngine.UI.Extensions {