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: