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: