From 3eb5fd21986a7d1b655dd74ebc367791333ce4cb Mon Sep 17 00:00:00 2001 From: tverona1 Date: Sat, 27 Jul 2019 16:48:07 -0700 Subject: [PATCH] Preliminary support for tabs and also fix an issue with scroll view collider - Added preliminary support for tabs: Added config support for "categoryType" specifying "none" or "auto". None means no tabs. Auto means that we create 3 tabs - Quest, Go/GearVR and 2D. These apps types are distinguished based on package information. - Added support in UI for showing / hiding 2D apps. - Fixed an issue with scroll view collider: Looks like Unity UI scroll view object does not interact very well in a VR environment. This one was a doozy. I noticed, although the scroll view masks UI that falls outside its rectangle (as it should), it does not suppress colliders. This means that it's possible to interact with colliders that get scrolled above the scroll view (i.e. like clicking on a cell to launch an app when that cell is outside the scroll view). The bigger problem is that this interfered with the tabs, which are above the scroll view. After contemplating several solutions, I ended up with a simple but effective one: // To fix this issue, we cast a ray from current pointer to the scroll view's box collider. // If we get a hit, it means we're inside the scroll view - so we enable all the children box // colliders, which will behave as expected. // If we do not get a hit, it means that we're outside the scroll view - so we disable all the children // box colliders, which addresses the issue above. --- Assets/Plugins/Android/AppInfo.java | 2 +- Assets/Prefabs/Scroll View.prefab | 304 ++++++++++++++++++ Assets/Prefabs/Scroll View.prefab.meta | 7 + Assets/Prefabs/Tab.prefab | 411 +++++++++++++++++++++++++ Assets/Prefabs/Tab.prefab.meta | 7 + Assets/Scenes/QuestAppLauncher.unity | 353 +++------------------ Assets/Scripts/Config.cs | 8 + Assets/Scripts/GridPopulation.cs | 269 +++++++++++----- Assets/Scripts/ScrollRectOverride.cs | 84 +++++ Assets/Scripts/SettingsHandler.cs | 9 +- Assets/ScrollViewResize.cs | 19 -- Assets/ScrollViewResize.cs.meta | 11 - 12 files changed, 1063 insertions(+), 421 deletions(-) create mode 100644 Assets/Prefabs/Scroll View.prefab create mode 100644 Assets/Prefabs/Scroll View.prefab.meta create mode 100644 Assets/Prefabs/Tab.prefab create mode 100644 Assets/Prefabs/Tab.prefab.meta delete mode 100644 Assets/ScrollViewResize.cs delete mode 100644 Assets/ScrollViewResize.cs.meta diff --git a/Assets/Plugins/Android/AppInfo.java b/Assets/Plugins/Android/AppInfo.java index 8b1198d..7f58372 100644 --- a/Assets/Plugins/Android/AppInfo.java +++ b/Assets/Plugins/Android/AppInfo.java @@ -49,7 +49,7 @@ public class AppInfo extends UnityPlayerActivity { public boolean isQuestApp(int i) { try { - PackageInfo info = this.getPackageManager().getPackageInfo(getPackageName(i), 0); + PackageInfo info = this.getPackageManager().getPackageInfo(getPackageName(i), PackageManager.GET_CONFIGURATIONS); if (null == info.reqFeatures) { return false; } diff --git a/Assets/Prefabs/Scroll View.prefab b/Assets/Prefabs/Scroll View.prefab new file mode 100644 index 0000000..9a3e923 --- /dev/null +++ b/Assets/Prefabs/Scroll View.prefab @@ -0,0 +1,304 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1038337479447180685 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1038337479447180674} + - component: {fileID: 1038337479447180672} + - component: {fileID: 1038337479447180675} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1038337479447180674 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479447180685} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1038337479646307570} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1038337479447180672 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479447180685} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 75 + m_Right: 75 + m_Top: 45 + m_Bottom: 45 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 834, y: 548} + m_Spacing: {x: 75, y: 75} + m_Constraint: 0 + m_ConstraintCount: 3 +--- !u!114 &1038337479447180675 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479447180685} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1038337479646307581 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1038337479646307570} + - component: {fileID: 1038337479646307569} + - component: {fileID: 1038337479646307568} + - component: {fileID: 1038337479646307571} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1038337479646307570 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479646307581} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1038337479447180674} + m_Father: {fileID: 1038337479902361241} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!222 &1038337479646307569 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479646307581} + m_CullTransparentMesh: 0 +--- !u!114 &1038337479646307568 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479646307581} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1038337479646307571 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479646307581} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &1038337479902361240 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1038337479902361241} + - component: {fileID: 1038337479902361244} + - component: {fileID: 1038337479902361247} + - component: {fileID: 1038337479902361234} + - component: {fileID: 1038337479902361246} + - component: {fileID: 1038337479902361245} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1038337479902361241 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479902361240} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1038337479646307570} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1038337479902361244 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479902361240} + m_CullTransparentMesh: 0 +--- !u!114 &1038337479902361247 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479902361240} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.010234957, g: 0.09975823, b: 0.21698111, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1038337479902361234 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479902361240} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6c51693ac45aa2d4480f322a70ef9a67, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1038337479447180674} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 1038337479646307570} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.ScrollRect+ScrollRectEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null + trackingSpace: {fileID: 0} +--- !u!65 &1038337479902361246 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479902361240} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 0} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &1038337479902361245 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1038337479902361240} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bfe52246b03c5b747a5406863e688439, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/Prefabs/Scroll View.prefab.meta b/Assets/Prefabs/Scroll View.prefab.meta new file mode 100644 index 0000000..78ef08a --- /dev/null +++ b/Assets/Prefabs/Scroll View.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 562cc35cb12e2ed4ca247c09eebe2bbf +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Tab.prefab b/Assets/Prefabs/Tab.prefab new file mode 100644 index 0000000..2191d6d --- /dev/null +++ b/Assets/Prefabs/Tab.prefab @@ -0,0 +1,411 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8840711930865071119 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8840711930865071118} + - component: {fileID: 8840711930865071117} + - component: {fileID: 8798264517337242548} + m_Layer: 5 + m_Name: Tab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8840711930865071118 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711930865071119} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 8840711931830097598} + - {fileID: 8840711931729524043} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!65 &8840711930865071117 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711930865071119} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 800, y: 150, z: 0.05} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &8798264517337242548 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711930865071119} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 0} + toggleTransition: 1 + graphic: {fileID: 0} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null + m_IsOn: 0 +--- !u!1 &8840711931729524044 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8840711931729524043} + - component: {fileID: 8840711931729524041} + - component: {fileID: 8840711931729524042} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8840711931729524043 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711931729524044} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8840711930865071118} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8840711931729524041 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711931729524044} + m_CullTransparentMesh: 0 +--- !u!114 &8840711931729524042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711931729524044} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_text: Tab1 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_outlineColor: + serializedVersion: 2 + rgba: 4278190080 + m_fontSize: 86 + m_fontSizeBase: 86 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 86 + m_fontStyle: 0 + m_textAlignment: 514 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_firstOverflowCharacterIndex: -1 + m_linkedTextComponent: {fileID: 0} + m_isLinkedTextComponent: 0 + m_isTextTruncated: 0 + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_ignoreRectMaskCulling: 0 + m_ignoreCulling: 1 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_VertexBufferAutoSizeReduction: 1 + m_firstVisibleCharacter: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_textInfo: + textComponent: {fileID: 8840711931729524042} + characterCount: 4 + spriteCount: 0 + spaceCount: 0 + wordCount: 1 + linkCount: 0 + lineCount: 1 + pageCount: 1 + materialCount: 1 + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_spriteAnimator: {fileID: 0} + m_hasFontAssetChanged: 0 + m_subTextObjects: + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &8840711931830097599 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8840711931830097598} + - component: {fileID: 8840711931830097596} + - component: {fileID: 8840711931830097597} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8840711931830097598 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711931830097599} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 8840711932046455112} + m_Father: {fileID: 8840711930865071118} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8840711931830097596 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711931830097599} + m_CullTransparentMesh: 0 +--- !u!114 &8840711931830097597 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711931830097599} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.24313727, g: 0.427451, b: 0.6627451, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 1b4315b5ae6fc624a8bf15d6e111a8e2, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8840711932046455113 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8840711932046455112} + - component: {fileID: 8840711932046455110} + - component: {fileID: 8840711932046455111} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8840711932046455112 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711932046455113} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8840711931830097598} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8840711932046455110 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711932046455113} + m_CullTransparentMesh: 0 +--- !u!114 &8840711932046455111 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8840711932046455113} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.007843138, g: 0.08235294, b: 0.18039216, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 6603caf6d1a24824ebd61679517369f1, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 diff --git a/Assets/Prefabs/Tab.prefab.meta b/Assets/Prefabs/Tab.prefab.meta new file mode 100644 index 0000000..c6b449e --- /dev/null +++ b/Assets/Prefabs/Tab.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ddc317ff29baa074582e48d133ea0fcc +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/QuestAppLauncher.unity b/Assets/Scenes/QuestAppLauncher.unity index ea24a69..5ce51b8 100644 --- a/Assets/Scenes/QuestAppLauncher.unity +++ b/Assets/Scenes/QuestAppLauncher.unity @@ -691,81 +691,12 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 129491541} m_CullTransparentMesh: 0 ---- !u!1 &159978199 +--- !u!1 &154827158 stripped GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 159718, guid: 126d619cf4daa52469682f85c1378b4a, + type: 3} + m_PrefabInstance: {fileID: 1811954864} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 159978200} - - component: {fileID: 159978202} - - component: {fileID: 159978201} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &159978200 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 159978199} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 363824040} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!114 &159978201 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 159978199} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 ---- !u!114 &159978202 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 159978199} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 75 - m_Right: 75 - m_Top: 45 - m_Bottom: 45 - m_ChildAlignment: 0 - m_StartCorner: 0 - m_StartAxis: 0 - m_CellSize: {x: 834, y: 548} - m_Spacing: {x: 75, y: 75} - m_Constraint: 0 - m_ConstraintCount: 3 --- !u!1001 &174121771 PrefabInstance: m_ObjectHideFlags: 0 @@ -1383,96 +1314,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 340813588} m_Mesh: {fileID: 4300000, guid: 37ba10a26a648144fa2390c8adfb2c8a, type: 3} ---- !u!1 &363824039 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 363824040} - - component: {fileID: 363824043} - - component: {fileID: 363824042} - - component: {fileID: 363824041} - m_Layer: 5 - m_Name: Viewport - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &363824040 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 363824039} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 159978200} - m_Father: {fileID: 1684574659} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -30} - m_SizeDelta: {x: 0, y: -60} - m_Pivot: {x: 0, y: 1} ---- !u!114 &363824041 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 363824039} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!114 &363824042 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 363824039} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &363824043 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 363824039} - m_CullTransparentMesh: 0 --- !u!1 &380981304 GameObject: m_ObjectHideFlags: 0 @@ -2137,6 +1978,41 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 668816589} m_CullTransparentMesh: 0 +--- !u!1 &673732997 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 673732998} + m_Layer: 5 + m_Name: Scroll_Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &673732998 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 673732997} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1950750522} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &684313056 GameObject: m_ObjectHideFlags: 0 @@ -5750,142 +5626,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1608941300} m_CullTransparentMesh: 0 ---- !u!1 &1684574658 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1684574659} - - component: {fileID: 1684574662} - - component: {fileID: 1684574661} - - component: {fileID: 1684574664} - - component: {fileID: 1684574660} - - component: {fileID: 1684574663} - m_Layer: 5 - m_Name: Scroll View - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1684574659 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1684574658} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 363824040} - m_Father: {fileID: 1950750522} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!65 &1684574660 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1684574658} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 0} - m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &1684574661 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1684574658} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.010234957, g: 0.09975823, b: 0.21698111, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1684574662 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1684574658} - m_CullTransparentMesh: 0 ---- !u!114 &1684574663 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1684574658} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: bfe52246b03c5b747a5406863e688439, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &1684574664 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1684574658} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6c51693ac45aa2d4480f322a70ef9a67, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 159978200} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 1 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 363824040} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 0} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 0 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.ScrollRect+ScrollRectEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null --- !u!1 &1706204891 GameObject: m_ObjectHideFlags: 0 @@ -6368,9 +6108,16 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0d75ad87b4f70d345becda5841f29b7a, type: 3} m_Name: m_EditorClassIdentifier: - gridContainer: {fileID: 1950750521} - gridContent: {fileID: 159978199} - prefab: {fileID: 4824380111246446992, guid: 8767e935b90413e48ae368ff87547352, type: 3} + panelContainer: {fileID: 1950750521} + scrollContainer: {fileID: 673732997} + tabContainer: {fileID: 907885703} + trackingSpace: {fileID: 154827158} + prefabCell: {fileID: 4824380111246446992, guid: 8767e935b90413e48ae368ff87547352, + type: 3} + prefabScrollView: {fileID: 1038337479902361240, guid: 562cc35cb12e2ed4ca247c09eebe2bbf, + type: 3} + prefabTab: {fileID: 8840711930865071119, guid: ddc317ff29baa074582e48d133ea0fcc, + type: 3} --- !u!4 &1860838376 Transform: m_ObjectHideFlags: 0 @@ -7160,7 +6907,7 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 907885704} - - {fileID: 1684574659} + - {fileID: 673732998} - {fileID: 129491542} - {fileID: 2124784240} m_Father: {fileID: 1113839879} diff --git a/Assets/Scripts/Config.cs b/Assets/Scripts/Config.cs index 95b8987..85de797 100644 --- a/Assets/Scripts/Config.cs +++ b/Assets/Scripts/Config.cs @@ -12,6 +12,11 @@ namespace QuestAppLauncher [Serializable] public class Config { + // Supported category types + public const string Category_None = "none"; + public const string Category_Auto = "auto"; + public const string Category_Custom = "custom"; + /// /// Grid size /// @@ -24,6 +29,9 @@ namespace QuestAppLauncher public GridSize gridSize = new GridSize(); public bool show2D = false; + + // Category types: "none", "automatic", "custom" + public string categoryType = Category_Auto; } /// diff --git a/Assets/Scripts/GridPopulation.cs b/Assets/Scripts/GridPopulation.cs index e834f00..f5d382a 100644 --- a/Assets/Scripts/GridPopulation.cs +++ b/Assets/Scripts/GridPopulation.cs @@ -26,17 +26,35 @@ namespace QuestAppLauncher const string IconOverrideExtSearch = "*.jpg"; // Grid container game object - public GameObject gridContainer; + public GameObject panelContainer; - // Grid content game object - public GameObject gridContent; + // Scroll container game object + public GameObject scrollContainer; - // App info GameObject (a cell in the grid content) - public GameObject prefab; + // Tab container + public GameObject tabContainer; + + // Tracking space + public GameObject trackingSpace; + + // App info prefab (a cell in the grid content) + public GameObject prefabCell; + + // Scroll view prefab + public GameObject prefabScrollView; + + // Tab prefab + public GameObject prefabTab; // Reference to executing populate routine private Coroutine populateCoroutine; + // Built-in tab names + private const string Tab_None = "None"; + private const string Tab_Quest = "Quest"; + private const string Tab_Go = "Go/Gear"; + private const string Tab_2D = "2D"; + #region MonoBehaviour handler void Start() @@ -57,7 +75,7 @@ namespace QuestAppLauncher #endregion #region Private Functions - + /// /// Static method for launching an Android app /// @@ -123,7 +141,7 @@ namespace QuestAppLauncher SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); } - public void SetGridSize(int rows, int cols) + public void SetGridSize(GameObject gridContent, int rows, int cols) { // Make sure grid size have sane value cols = Math.Min(cols, 10); @@ -132,7 +150,7 @@ namespace QuestAppLauncher rows = Math.Max(rows, 1); // Get cell size, spacing & padding from the grid layout - var gridLayoutGroup = this.gridContent.GetComponent(); + var gridLayoutGroup = gridContent.GetComponent(); var cellHeight = gridLayoutGroup.cellSize.y; var cellWidth = gridLayoutGroup.cellSize.x; var paddingX = gridLayoutGroup.padding.horizontal; @@ -150,7 +168,7 @@ namespace QuestAppLauncher Debug.Log(string.Format("Grid size calculated width x height: {0} x {1}", width, height)); // Adjust grid container rect transform - var gridTransform = this.gridContainer.GetComponent(); + var gridTransform = this.panelContainer.GetComponent(); gridTransform.sizeDelta = new Vector2(width, height); // Adjust grid container Y position to maintain constant height. @@ -185,21 +203,26 @@ namespace QuestAppLauncher Config config = new Config(); ConfigPersistence.LoadConfig(config); - // Clear any existing elements in grid - for (int i = 0; i < this.gridContent.transform.childCount; i++) - { - Destroy(this.gridContent.transform.GetChild(i).gameObject); - } - - // Set grid size - SetGridSize(config.gridSize.rows, config.gridSize.cols); - using (AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) using (AndroidJavaObject currentActivity = unity.GetStatic("currentActivity")) { // Dictionary to hold package name -> app index, app name - var packageNameToAppName = new Dictionary(); + var packageNameToAppName = new Dictionary(); var excludedPackageNames = new HashSet(); + var tabList = new List(); + + if (config.categoryType.Equals(Config.Category_None, StringComparison.OrdinalIgnoreCase)) + { + // If no categories, just create a placeholder tab + tabList.Add(Tab_None); + } + else + { + // Create built-in categories + tabList.Add(Tab_Quest); + tabList.Add(Tab_Go); + tabList.Add(Tab_2D); + } // Get # of installed apps int numApps = currentActivity.Call("getSize"); @@ -236,19 +259,30 @@ namespace QuestAppLauncher continue; } - if (!config.show2D) + // Determine app type (Quest, Go or 2D) + string tabName; + if (currentActivity.Call("is2DApp", i)) { - var is2D = currentActivity.Call("is2DApp", i); - if (is2D) + if (!config.show2D) { // Skip 2D apps Debug.LogFormat("Skipping 2D [{0}] Package: {1}, name: {2}", i, packageName, appName); continue; } + + tabName = Tab_2D; + } + else if (currentActivity.Call("isQuestApp", i)) + { + tabName = Tab_Quest; + } + else + { + tabName = Tab_Go; } - packageNameToAppName.Add(packageName, (i, appName)); - Debug.Log("[" + i + "] package: " + packageName + ", name: " + appName); + packageNameToAppName.Add(packageName, (i, tabName, appName)); + Debug.LogFormat("[{0}] package: {1}, name: {2}, tab: {3}", i, packageName, appName, tabName); yield return null; } @@ -264,7 +298,8 @@ namespace QuestAppLauncher var entry = overriddenName.Split(','); if (2 == entry.Length && packageNameToAppName.ContainsKey(entry[0])) { - packageNameToAppName[entry[0]] = (packageNameToAppName[entry[0]].Index, entry[1]); + packageNameToAppName[entry[0]] = (packageNameToAppName[entry[0]].Index, + packageNameToAppName[entry[0]].TabName, entry[1]); } } } @@ -296,60 +331,136 @@ namespace QuestAppLauncher yield return null; - // Populate grid with app information (name & icon) - // Sort by app name - foreach (var app in packageNameToAppName.OrderBy(key => key.Value.AppName)) - { - // Create new instances of our app info prefab - var newObj = (GameObject)Instantiate(this.prefab, this.gridContent.transform); - - // Set app entry info - var appEntry = newObj.GetComponent("AppEntry") as AppEntry; - appEntry.packageId = app.Key; - appEntry.appName = app.Value.AppName; - - // Get app icon - byte[] bytesIcon = null; - bool useApkIcon = true; - if (iconOverrides.ContainsKey(app.Key)) - { - // Use overridden icon - try - { - bytesIcon = File.ReadAllBytes(iconOverrides[app.Key]); - useApkIcon = false; - } - catch (Exception e) - { - - // Fall back to using the apk icon - Debug.Log(string.Format("Error reading app icon from file [{0}]: {1}", iconOverrides[app.Key], e.Message)); - } - } - - if (useApkIcon) - { - // Use built-in icon from the apk - bytesIcon = (byte[])(Array)currentActivity.Call("getIcon", app.Value.Index); - } - - // Set the icon image - var image = newObj.transform.Find("AppIcon").GetComponentInChildren(); - var texture = new Texture2D(2, 2, TextureFormat.RGB24, false); - texture.filterMode = FilterMode.Trilinear; - texture.anisoLevel = 16; - texture.LoadImage(bytesIcon); - var rect = new Rect(0, 0, texture.width, texture.height); - image.sprite = Sprite.Create(texture, rect, new Vector2(0.5f, 0.5f)); - - // Set app name in text - var text = newObj.transform.Find("AppName").GetComponentInChildren(); - text.text = app.Value.AppName; - - yield return null; - } + // Populate the panel content + yield return PopulatePanelContent(currentActivity, config, tabList, packageNameToAppName, iconOverrides); + } + } + + private IEnumerator PopulatePanelContent( + AndroidJavaObject currentActivity, + Config config, + List tabList, + Dictionary apps, + Dictionary iconOverrides) + { + // Destroy existing scrollviews and tabs + for (int i = 0; i < this.tabContainer.transform.childCount; i++) + { + Destroy(this.tabContainer.transform.GetChild(i).gameObject); + Destroy(this.scrollContainer.transform.GetChild(i).gameObject); + } + + var gridContents = new Dictionary(); + bool isFirstTab = true; + + // Create scroll views and tabs + foreach (string tabName in tabList) + { + Debug.LogFormat("Populating tab '{0}'", tabName); + + // Create scroll view + var scrollView = (GameObject)Instantiate(this.prefabScrollView, this.scrollContainer.transform); + var scrollRectOverride = scrollView.GetComponent(); + scrollRectOverride.trackingSpace = this.trackingSpace.transform; + scrollRectOverride.name = tabName; + + var gridContent = scrollRectOverride.content.gameObject; + scrollView.SetActive(isFirstTab); + + // Set grid size + SetGridSize(gridContent, config.gridSize.rows, config.gridSize.cols); + + // Create tab + var tab = (GameObject)Instantiate(this.prefabTab, this.tabContainer.transform); + tab.GetComponentInChildren().text = tabName; + + var toggle = tab.GetComponent(); + toggle.isOn = isFirstTab; + toggle.group = this.tabContainer.GetComponent(); + toggle.onValueChanged.AddListener(scrollView.SetActive); + + if (config.categoryType.Equals(Config.Category_None, StringComparison.OrdinalIgnoreCase)) + { + // Hide the "None" tab + tab.SetActive(false); + } + + // Record the grid content + gridContents[tabName] = (scrollView.GetComponent().content.gameObject, + scrollView, tab, false); + isFirstTab = false; + } + + // Populate grid with app information (name & icon) + // Sort by app name + foreach (var app in apps.OrderBy(key => key.Value.AppName)) + { + // Create new instances of our app info prefabCell + var gridContent = gridContents[app.Value.TabName].gridContent; + var newObj = (GameObject)Instantiate(this.prefabCell, gridContent.transform); + + // Mark that this grid content is in use + gridContents[app.Value.TabName] = (gridContent, gridContents[app.Value.TabName].scrollView, + gridContents[app.Value.TabName].tab, true); + + // Set app entry info + var appEntry = newObj.GetComponent("AppEntry") as AppEntry; + appEntry.packageId = app.Key; + appEntry.appName = app.Value.AppName; + + // Get app icon + byte[] bytesIcon = null; + bool useApkIcon = true; + if (iconOverrides.ContainsKey(app.Key)) + { + // Use overridden icon + try + { + bytesIcon = File.ReadAllBytes(iconOverrides[app.Key]); + useApkIcon = false; + } + catch (Exception e) + { + // Fall back to using the apk icon + Debug.Log(string.Format("Error reading app icon from file [{0}]: {1}", iconOverrides[app.Key], e.Message)); + } + } + + if (useApkIcon) + { + // Use built-in icon from the apk + bytesIcon = (byte[])(Array)currentActivity.Call("getIcon", app.Value.Index); + } + + // Set the icon image + var image = newObj.transform.Find("AppIcon").GetComponentInChildren(); + var texture = new Texture2D(2, 2, TextureFormat.RGB24, false); + texture.filterMode = FilterMode.Trilinear; + texture.anisoLevel = 16; + texture.LoadImage(bytesIcon); + var rect = new Rect(0, 0, texture.width, texture.height); + image.sprite = Sprite.Create(texture, rect, new Vector2(0.5f, 0.5f)); + + // Set app name in text + var text = newObj.transform.Find("AppName").GetComponentInChildren(); + text.text = app.Value.AppName; + + yield return null; + } + + // Remove any empty scroll views and tabs + foreach (string tabName in tabList) + { + if (gridContents[tabName].isInUse) + { + continue; + } + + Debug.LogFormat("Removing empty tab '{0}'", tabName); + Destroy(gridContents[tabName].scrollView); + Destroy(gridContents[tabName].tab); } } - #endregion } -} + #endregion +} \ No newline at end of file diff --git a/Assets/Scripts/ScrollRectOverride.cs b/Assets/Scripts/ScrollRectOverride.cs index 704f37f..a7f72c7 100644 --- a/Assets/Scripts/ScrollRectOverride.cs +++ b/Assets/Scripts/ScrollRectOverride.cs @@ -2,21 +2,77 @@ using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; +using ControllerSelection; namespace QuestAppLauncher { public class ScrollRectOverride : ScrollRect, IMoveHandler, IPointerClickHandler, IScrollHandler { + // Scrolling speed multiplier private const float speedMultiplier = 15f; + + // Height of a single cell in the grid private float cellHeight = 0f; + // Tracking space used for ray cast + public Transform trackingSpace = null; + + // Box collider used for ray cast + private BoxCollider boxCollider = null; + + // Whether the pointer is within bounds of the scroll rect + private bool isInBounds = false; + + private OVRInput.Controller activeController = OVRInput.Controller.None; + void Start() { this.cellHeight = this.transform.GetComponentInChildren().cellSize.y; + this.boxCollider = GetComponent(); } void Update() { + // The scroll view has a viewport that masks the UI that is outside the scroll view. + // However, it does not filter any ray casting that is outside the mask! + // This means that the box colliders of the individual cells still get hit outside the scroll view itself, + // which can interfer with the tabs above the scroll view. + // + // To fix this issue, we cast a ray from current pointer to the scroll view's box collider. + // If we get a hit, it means we're inside the scroll view - so we enable all the children box + // colliders, which will behave as expected. + // If we do not get a hit, it means that we're outside the scroll view - so we disable all the children + // box colliders, which addresses the issue above. + this.activeController = OVRInputHelpers.GetControllerForButton(OVRInput.Button.PrimaryIndexTrigger, this.activeController); + Ray pointer = OVRInputHelpers.GetSelectionRay(this.activeController, this.trackingSpace); + + RaycastHit hit; + if (this.boxCollider.Raycast(pointer, out hit, 500)) + { + // We got a hit in the scroll view. Check if we're already within the bounds - if so, do nothing. + if (!isInBounds) + { + // We entered the scroll view, so enable box colliders on children. + foreach (var boxCollider in this.content.gameObject.GetComponentsInChildren()) + { + boxCollider.enabled = true; + } + + isInBounds = true; + } + } + else if (isInBounds) + { + // We are outside the scroll view and were previously inside, so disable box colliders on children. + Debug.Log("ScrollRectOverride: Disabling box colliders on children"); + foreach (var boxCollider in this.content.gameObject.GetComponentsInChildren()) + { + boxCollider.enabled = false; + } + + isInBounds = false; + } + // Get vector from either left or right thumbstick var moveVector = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick); if (moveVector.x == 0 && moveVector.y == 0) @@ -24,6 +80,12 @@ namespace QuestAppLauncher moveVector = OVRInput.Get(OVRInput.Axis2D.SecondaryThumbstick); } + if (moveVector.y == 0) + { + // No y-movement, so return + return; + } + // Scroll by a fixed amount proportional to thumbstick position on each frame // and map this to a fraction of the total viewport size: // moveVector.y: The thumbstick vertical position normalized to [-1,1]. @@ -36,6 +98,28 @@ namespace QuestAppLauncher this.verticalNormalizedPosition = Mathf.Clamp01(this.verticalNormalizedPosition + verticalIncrement); } + void OnEnable() + { + // When this scroll view is enabled, make sure we resize the box collider appropriately. + ResizeBoxCollider(); + } + + protected override void OnRectTransformDimensionsChange() + { + // When the scroll view rect size changes, make sure we resize the box collider appropriately. + ResizeBoxCollider(); + } + + private void ResizeBoxCollider() + { + // Resize the scroll view's box collider to match the scroll view rect size. + var rect = transform.GetComponent(); + var boxCollider = transform.GetComponent(); + boxCollider.size = new Vector3(rect.rect.width, rect.rect.height, 0); + + Debug.LogFormat("Resizing box collider: {0} x {1}", boxCollider.size.x, boxCollider.size.y); + } + public void OnPointerClick(PointerEventData e) { } diff --git a/Assets/Scripts/SettingsHandler.cs b/Assets/Scripts/SettingsHandler.cs index d230996..68e901e 100644 --- a/Assets/Scripts/SettingsHandler.cs +++ b/Assets/Scripts/SettingsHandler.cs @@ -84,7 +84,6 @@ namespace QuestAppLauncher private void PersistConfig() { bool saveConfig = false; - bool resizeGrid = false; bool rePopulate = false; // Update grid size @@ -96,7 +95,7 @@ namespace QuestAppLauncher { this.config.gridSize.cols = cols; this.config.gridSize.rows = rows; - resizeGrid = true; + rePopulate = true; saveConfig = true; } @@ -121,12 +120,6 @@ namespace QuestAppLauncher Debug.Log("Re-populating panel"); this.gridPopulation.GetComponent().StartPopulate(); } - else if (resizeGrid) - { - // Update grid size - Debug.Log(string.Format("Resizing pael: {0} x {1}", cols, rows)); - this.gridPopulation.GetComponent().SetGridSize(this.config.gridSize.rows, this.config.gridSize.cols); - } } } } \ No newline at end of file diff --git a/Assets/ScrollViewResize.cs b/Assets/ScrollViewResize.cs deleted file mode 100644 index 13c2f8f..0000000 --- a/Assets/ScrollViewResize.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.EventSystems; - -namespace QuestAppLauncher -{ - public class ScrollViewResize : UIBehaviour - { - protected override void OnRectTransformDimensionsChange() - { - var rect = transform.GetComponent(); - var boxCollider = transform.GetComponent(); - boxCollider.size = new Vector3(rect.rect.width, rect.rect.height, 0); - - Debug.LogFormat("Resizing box collider: {0} x {1}", boxCollider.size.x, boxCollider.size.y); - } - } -} \ No newline at end of file diff --git a/Assets/ScrollViewResize.cs.meta b/Assets/ScrollViewResize.cs.meta deleted file mode 100644 index 62f332f..0000000 --- a/Assets/ScrollViewResize.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bfe52246b03c5b747a5406863e688439 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: