From ff83b2b7557c8f054df6b34afe8d8893194703f2 Mon Sep 17 00:00:00 2001 From: Felix Rohmeier Date: Sat, 19 Nov 2022 16:16:33 +0100 Subject: [PATCH] Adding share function --- Nreal/Assets/Graphics/Icons/IconRecord.png | Bin 0 -> 3010 bytes .../Assets/Graphics/Icons/IconRecord.png.meta | 145 ++ Nreal/Assets/Graphics/Icons/IconShare.png | Bin 0 -> 4026 bytes .../Assets/Graphics/Icons/IconShare.png.meta | 145 ++ .../Textures/UI/panel_btn_hover.png.meta | 12 +- .../Textures/UI/panel_btn_normal.png.meta | 12 +- .../NRSDK/Textures/UI/ui_button_idle.png.meta | 12 +- .../Prefabs/RecordButton.prefab | 318 ---- .../Scripts/RecordButton/RecordController.cs | 99 -- .../Plugins/Android/AndroidManifest.xml | 1 - .../Scripts.meta => Plugins/NativeShare.meta} | 2 +- Nreal/Assets/Plugins/NativeShare/Android.meta | 9 + .../NativeShare/Android/NSCallbackHelper.cs | 78 + .../Android/NSCallbackHelper.cs.meta} | 5 +- .../Android/NSShareResultCallbackAndroid.cs | 33 + .../NSShareResultCallbackAndroid.cs.meta | 12 + .../NativeShare/Android/NativeShare.aar | Bin 0 -> 28395 bytes .../NativeShare/Android/NativeShare.aar.meta | 33 + Nreal/Assets/Plugins/NativeShare/Editor.meta | 9 + .../NativeShare/Editor/NSPostProcessBuild.cs | 104 ++ .../Editor/NSPostProcessBuild.cs.meta | 12 + .../Editor/NativeShare.Editor.asmdef | 15 + .../Editor/NativeShare.Editor.asmdef.meta} | 4 +- .../NativeShare/NativeShare.Runtime.asmdef | 3 + .../NativeShare.Runtime.asmdef.meta} | 5 +- .../Assets/Plugins/NativeShare/NativeShare.cs | 338 ++++ .../Plugins/NativeShare/NativeShare.cs.meta | 12 + Nreal/Assets/Plugins/NativeShare/README.txt | 66 + .../Plugins/NativeShare/README.txt.meta | 8 + Nreal/Assets/Plugins/NativeShare/iOS.meta | 9 + .../iOS/NSShareResultCallbackiOS.cs | 44 + .../iOS/NSShareResultCallbackiOS.cs.meta | 12 + .../Plugins/NativeShare/iOS/NativeShare.mm | 144 ++ .../NativeShare/iOS/NativeShare.mm.meta | 33 + Nreal/Assets/Scenes/Home.unity | 1399 ++++++++++++++--- .../VideoCaptureController.cs} | 26 +- .../VideoCaptureController.cs.meta} | 0 Nreal/ProjectSettings/ProjectSettings.asset | 8 +- Nreal/UserSettings/EditorUserSettings.asset | 6 + 39 files changed, 2513 insertions(+), 660 deletions(-) create mode 100644 Nreal/Assets/Graphics/Icons/IconRecord.png create mode 100644 Nreal/Assets/Graphics/Icons/IconRecord.png.meta create mode 100644 Nreal/Assets/Graphics/Icons/IconShare.png create mode 100644 Nreal/Assets/Graphics/Icons/IconShare.png.meta delete mode 100644 Nreal/Assets/NrealExtensions/Prefabs/RecordButton.prefab delete mode 100644 Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton/RecordController.cs rename Nreal/Assets/{NrealExtensions/Prefabs/Scripts.meta => Plugins/NativeShare.meta} (77%) create mode 100644 Nreal/Assets/Plugins/NativeShare/Android.meta create mode 100644 Nreal/Assets/Plugins/NativeShare/Android/NSCallbackHelper.cs rename Nreal/Assets/{NrealExtensions/Prefabs/Scripts/RecordButton/RecordController.cs.meta => Plugins/NativeShare/Android/NSCallbackHelper.cs.meta} (68%) create mode 100644 Nreal/Assets/Plugins/NativeShare/Android/NSShareResultCallbackAndroid.cs create mode 100644 Nreal/Assets/Plugins/NativeShare/Android/NSShareResultCallbackAndroid.cs.meta create mode 100644 Nreal/Assets/Plugins/NativeShare/Android/NativeShare.aar create mode 100644 Nreal/Assets/Plugins/NativeShare/Android/NativeShare.aar.meta create mode 100644 Nreal/Assets/Plugins/NativeShare/Editor.meta create mode 100644 Nreal/Assets/Plugins/NativeShare/Editor/NSPostProcessBuild.cs create mode 100644 Nreal/Assets/Plugins/NativeShare/Editor/NSPostProcessBuild.cs.meta create mode 100644 Nreal/Assets/Plugins/NativeShare/Editor/NativeShare.Editor.asmdef rename Nreal/Assets/{NrealExtensions/Prefabs/RecordButton.prefab.meta => Plugins/NativeShare/Editor/NativeShare.Editor.asmdef.meta} (59%) create mode 100644 Nreal/Assets/Plugins/NativeShare/NativeShare.Runtime.asmdef rename Nreal/Assets/{NrealExtensions/Prefabs/Scripts/RecordButton.meta => Plugins/NativeShare/NativeShare.Runtime.asmdef.meta} (57%) create mode 100644 Nreal/Assets/Plugins/NativeShare/NativeShare.cs create mode 100644 Nreal/Assets/Plugins/NativeShare/NativeShare.cs.meta create mode 100644 Nreal/Assets/Plugins/NativeShare/README.txt create mode 100644 Nreal/Assets/Plugins/NativeShare/README.txt.meta create mode 100644 Nreal/Assets/Plugins/NativeShare/iOS.meta create mode 100644 Nreal/Assets/Plugins/NativeShare/iOS/NSShareResultCallbackiOS.cs create mode 100644 Nreal/Assets/Plugins/NativeShare/iOS/NSShareResultCallbackiOS.cs.meta create mode 100644 Nreal/Assets/Plugins/NativeShare/iOS/NativeShare.mm create mode 100644 Nreal/Assets/Plugins/NativeShare/iOS/NativeShare.mm.meta rename Nreal/Assets/{NrealExtensions/Prefabs/Scripts/RecordButton/VideoCapture2Local.cs => Scripts/VideoCaptureController.cs} (92%) rename Nreal/Assets/{NrealExtensions/Prefabs/Scripts/RecordButton/VideoCapture2Local.cs.meta => Scripts/VideoCaptureController.cs.meta} (100%) diff --git a/Nreal/Assets/Graphics/Icons/IconRecord.png b/Nreal/Assets/Graphics/Icons/IconRecord.png new file mode 100644 index 0000000000000000000000000000000000000000..d3388c3edf75db0f6f9eb1b906dd6fcdacbf1a39 GIT binary patch literal 3010 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 -/// Implements screen recording for nreal glasses and includes also the ui controlling -/// -public class RecordController : MonoBehaviour -{ - /// - /// Gets or the sets the preview image - /// - public Image RecordingIndicator; - - /// - /// Gets or the sets the recorder - /// - public VideoCapture2Local Recoder; - - /// - /// Represents the state of recording - /// - private bool recordingInProgress = false; - - /// - /// Quality of recording - /// - public enum ResolutionLevel - { - High, - Middle, - Low, - } - - public static void RequestPermission() - { - #if PLATFORM_ANDROID - if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead)) - { - Permission.RequestUserPermission(Permission.ExternalStorageRead); - } - - if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite)) - { - Permission.RequestUserPermission(Permission.ExternalStorageWrite); - } - - if (!Permission.HasUserAuthorizedPermission(Permission.Microphone)) - { - Permission.RequestUserPermission(Permission.Microphone); - } - - if (!Permission.HasUserAuthorizedPermission(Permission.Camera)) - { - Permission.RequestUserPermission(Permission.Camera); - } - #endif - } - - - /// Starts this object. - void Start() - { - RecordController.RequestPermission(); - } - - - /// - /// Toggles the recording - /// - public void ToggleRecording() - { - if (Recoder == null) - { - Recoder = new VideoCapture2Local(); - } - - if (!recordingInProgress) - { - recordingInProgress = true; - this.Recoder.OnClickPlayButton(); - RecordingIndicator.color = Color.red; - } - else - { - recordingInProgress = false; - this.Recoder.OnClickPlayButton(); - RecordingIndicator.color = new Color(1f, 1f, 1f, 0.3921569f); - } - } -} diff --git a/Nreal/Assets/Plugins/Android/AndroidManifest.xml b/Nreal/Assets/Plugins/Android/AndroidManifest.xml index 4196753d..313bffe1 100644 --- a/Nreal/Assets/Plugins/Android/AndroidManifest.xml +++ b/Nreal/Assets/Plugins/Android/AndroidManifest.xml @@ -15,7 +15,6 @@ - diff --git a/Nreal/Assets/NrealExtensions/Prefabs/Scripts.meta b/Nreal/Assets/Plugins/NativeShare.meta similarity index 77% rename from Nreal/Assets/NrealExtensions/Prefabs/Scripts.meta rename to Nreal/Assets/Plugins/NativeShare.meta index 4c933381..3496c60f 100644 --- a/Nreal/Assets/NrealExtensions/Prefabs/Scripts.meta +++ b/Nreal/Assets/Plugins/NativeShare.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0efc70168b3e4b3479f8b32938a2c836 +guid: 6e0f6f21d22f0784ca4536a5b2f0b4fd folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Nreal/Assets/Plugins/NativeShare/Android.meta b/Nreal/Assets/Plugins/NativeShare/Android.meta new file mode 100644 index 00000000..36d05499 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/Android.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7a5ec1b686319c94db4865fb2f5fdf3d +folderAsset: yes +timeCreated: 1519137951 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Nreal/Assets/Plugins/NativeShare/Android/NSCallbackHelper.cs b/Nreal/Assets/Plugins/NativeShare/Android/NSCallbackHelper.cs new file mode 100644 index 00000000..94d57f5e --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/Android/NSCallbackHelper.cs @@ -0,0 +1,78 @@ +#if UNITY_EDITOR || UNITY_ANDROID +using System.Collections; +using UnityEngine; + +namespace NativeShareNamespace +{ + public class NSCallbackHelper : MonoBehaviour + { + public NativeShare.ShareResultCallback callback; + + private NativeShare.ShareResult result = NativeShare.ShareResult.Unknown; + private string shareTarget = null; + + private bool resultReceived; + + private void Awake() + { + DontDestroyOnLoad( gameObject ); + } + + private void Update() + { + if( resultReceived ) + { + resultReceived = false; + + try + { + if( callback != null ) + callback( result, shareTarget ); + } + finally + { + Destroy( gameObject ); + } + } + } + + private IEnumerator OnApplicationFocus( bool focus ) + { + if( focus ) + { + // Share sheet is closed and now Unity activity is running again. Send Unknown result if OnShareCompleted wasn't called + yield return null; + resultReceived = true; + } + } + + public void OnShareCompleted( int resultRaw, string shareTarget ) + { + NativeShare.ShareResult shareResult = (NativeShare.ShareResult) resultRaw; + + if( result == NativeShare.ShareResult.Unknown ) + { + result = shareResult; + this.shareTarget = shareTarget; + } + else if( result == NativeShare.ShareResult.NotShared ) + { + if( shareResult == NativeShare.ShareResult.Shared ) + { + result = NativeShare.ShareResult.Shared; + this.shareTarget = shareTarget; + } + else if( shareResult == NativeShare.ShareResult.NotShared && !string.IsNullOrEmpty( shareTarget ) ) + this.shareTarget = shareTarget; + } + else + { + if( shareResult == NativeShare.ShareResult.Shared && !string.IsNullOrEmpty( shareTarget ) ) + this.shareTarget = shareTarget; + } + + resultReceived = true; + } + } +} +#endif \ No newline at end of file diff --git a/Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton/RecordController.cs.meta b/Nreal/Assets/Plugins/NativeShare/Android/NSCallbackHelper.cs.meta similarity index 68% rename from Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton/RecordController.cs.meta rename to Nreal/Assets/Plugins/NativeShare/Android/NSCallbackHelper.cs.meta index 4a59c8df..494c09d4 100644 --- a/Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton/RecordController.cs.meta +++ b/Nreal/Assets/Plugins/NativeShare/Android/NSCallbackHelper.cs.meta @@ -1,7 +1,8 @@ fileFormatVersion: 2 -guid: ac12d089ca79c1742859e35d16842eb9 +guid: 8b7cf25514ddb4f4c954e0b3a0bfe72d +timeCreated: 1594464639 +licenseType: Store MonoImporter: - externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 diff --git a/Nreal/Assets/Plugins/NativeShare/Android/NSShareResultCallbackAndroid.cs b/Nreal/Assets/Plugins/NativeShare/Android/NSShareResultCallbackAndroid.cs new file mode 100644 index 00000000..38e13032 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/Android/NSShareResultCallbackAndroid.cs @@ -0,0 +1,33 @@ +#if UNITY_EDITOR || UNITY_ANDROID +using UnityEngine; + +namespace NativeShareNamespace +{ + public class NSShareResultCallbackAndroid : AndroidJavaProxy + { + private readonly NSCallbackHelper callbackHelper; + + public NSShareResultCallbackAndroid( NativeShare.ShareResultCallback callback ) : base( "com.yasirkula.unity.NativeShareResultReceiver" ) + { + callbackHelper = new GameObject( "NSCallbackHelper" ).AddComponent(); + callbackHelper.callback = callback; + } + + public void OnShareCompleted( int result, string shareTarget ) + { + if( !callbackHelper ) + { + Debug.LogWarning( "NSCallbackHelper is destroyed!" ); + return; + } + + callbackHelper.OnShareCompleted( result, shareTarget ); + } + + public bool HasManagedCallback() + { + return callbackHelper && callbackHelper.callback != null; + } + } +} +#endif \ No newline at end of file diff --git a/Nreal/Assets/Plugins/NativeShare/Android/NSShareResultCallbackAndroid.cs.meta b/Nreal/Assets/Plugins/NativeShare/Android/NSShareResultCallbackAndroid.cs.meta new file mode 100644 index 00000000..eb876828 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/Android/NSShareResultCallbackAndroid.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 426f327c76c8b934c9f96cbb059c552b +timeCreated: 1594475580 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Nreal/Assets/Plugins/NativeShare/Android/NativeShare.aar b/Nreal/Assets/Plugins/NativeShare/Android/NativeShare.aar new file mode 100644 index 0000000000000000000000000000000000000000..84f2dc961720741288523c2bef08288538f75635 GIT binary patch literal 28395 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 File.ReadAllText( SAVE_PATH ) ); + else + m_instance = new Settings(); + } + catch( System.Exception e ) + { + Debug.LogException( e ); + m_instance = new Settings(); + } + } + + return m_instance; + } + } + + public void Save() + { + File.WriteAllText( SAVE_PATH, JsonUtility.ToJson( this, true ) ); + } + +#if UNITY_2018_3_OR_NEWER + [SettingsProvider] + public static SettingsProvider CreatePreferencesGUI() + { + return new SettingsProvider( "Project/yasirkula/Native Share", SettingsScope.Project ) + { + guiHandler = ( searchContext ) => PreferencesGUI(), + keywords = new System.Collections.Generic.HashSet() { "Native", "Share", "Android", "iOS" } + }; + } +#endif + +#if !UNITY_2018_3_OR_NEWER + [PreferenceItem( "Native Share" )] +#endif + public static void PreferencesGUI() + { + EditorGUI.BeginChangeCheck(); + + Instance.AutomatedSetup = EditorGUILayout.Toggle( "Automated Setup", Instance.AutomatedSetup ); + + EditorGUI.BeginDisabledGroup( !Instance.AutomatedSetup ); + Instance.PhotoLibraryUsageDescription = EditorGUILayout.DelayedTextField( new GUIContent( "Photo Library Usage Description", "Shown to user when they select the 'Save to Photos' option in share sheet" ), Instance.PhotoLibraryUsageDescription ); + EditorGUI.EndDisabledGroup(); + + if( EditorGUI.EndChangeCheck() ) + Instance.Save(); + } + } + + public class NSPostProcessBuild + { +#if UNITY_IOS + [PostProcessBuild] + public static void OnPostprocessBuild( BuildTarget target, string buildPath ) + { + if( !Settings.Instance.AutomatedSetup ) + return; + + if( target == BuildTarget.iOS ) + { + string plistPath = Path.Combine( buildPath, "Info.plist" ); + + PlistDocument plist = new PlistDocument(); + plist.ReadFromString( File.ReadAllText( plistPath ) ); + + PlistElementDict rootDict = plist.root; + rootDict.SetString( "NSPhotoLibraryUsageDescription", Settings.Instance.PhotoLibraryUsageDescription ); + rootDict.SetString( "NSPhotoLibraryAddUsageDescription", Settings.Instance.PhotoLibraryUsageDescription ); + + File.WriteAllText( plistPath, plist.WriteToString() ); + } + } +#endif + } +} \ No newline at end of file diff --git a/Nreal/Assets/Plugins/NativeShare/Editor/NSPostProcessBuild.cs.meta b/Nreal/Assets/Plugins/NativeShare/Editor/NSPostProcessBuild.cs.meta new file mode 100644 index 00000000..df6e5764 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/Editor/NSPostProcessBuild.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 49ddd46fdeeb9384c858b0daaebb6071 +timeCreated: 1521452119 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Nreal/Assets/Plugins/NativeShare/Editor/NativeShare.Editor.asmdef b/Nreal/Assets/Plugins/NativeShare/Editor/NativeShare.Editor.asmdef new file mode 100644 index 00000000..5e26a6ab --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/Editor/NativeShare.Editor.asmdef @@ -0,0 +1,15 @@ +{ + "name": "NativeShare.Editor", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Nreal/Assets/NrealExtensions/Prefabs/RecordButton.prefab.meta b/Nreal/Assets/Plugins/NativeShare/Editor/NativeShare.Editor.asmdef.meta similarity index 59% rename from Nreal/Assets/NrealExtensions/Prefabs/RecordButton.prefab.meta rename to Nreal/Assets/Plugins/NativeShare/Editor/NativeShare.Editor.asmdef.meta index 5f1ce8c3..86208a3f 100644 --- a/Nreal/Assets/NrealExtensions/Prefabs/RecordButton.prefab.meta +++ b/Nreal/Assets/Plugins/NativeShare/Editor/NativeShare.Editor.asmdef.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: ff701e0e2b3328e49ac48cd30676ea31 -PrefabImporter: +guid: 9ed423a4021a0c248911f8b5b1277c91 +AssemblyDefinitionImporter: externalObjects: {} userData: assetBundleName: diff --git a/Nreal/Assets/Plugins/NativeShare/NativeShare.Runtime.asmdef b/Nreal/Assets/Plugins/NativeShare/NativeShare.Runtime.asmdef new file mode 100644 index 00000000..198e3989 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/NativeShare.Runtime.asmdef @@ -0,0 +1,3 @@ +{ + "name": "NativeShare.Runtime" +} diff --git a/Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton.meta b/Nreal/Assets/Plugins/NativeShare/NativeShare.Runtime.asmdef.meta similarity index 57% rename from Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton.meta rename to Nreal/Assets/Plugins/NativeShare/NativeShare.Runtime.asmdef.meta index df20d5c3..041fc59e 100644 --- a/Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton.meta +++ b/Nreal/Assets/Plugins/NativeShare/NativeShare.Runtime.asmdef.meta @@ -1,7 +1,6 @@ fileFormatVersion: 2 -guid: 2ca1422aa2ffc984f94617d7323fea8f -folderAsset: yes -DefaultImporter: +guid: 2ace7ebb826df10459d12b4f3c4a9407 +AssemblyDefinitionImporter: externalObjects: {} userData: assetBundleName: diff --git a/Nreal/Assets/Plugins/NativeShare/NativeShare.cs b/Nreal/Assets/Plugins/NativeShare/NativeShare.cs new file mode 100644 index 00000000..f27e814a --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/NativeShare.cs @@ -0,0 +1,338 @@ +using UnityEngine; +using System.IO; +using System.Collections.Generic; +#if UNITY_ANDROID || UNITY_IOS +using NativeShareNamespace; +#endif + +#pragma warning disable 0414 +public class NativeShare +{ + public enum ShareResult { Unknown = 0, Shared = 1, NotShared = 2 }; + + public delegate void ShareResultCallback( ShareResult result, string shareTarget ); + +#if !UNITY_EDITOR && UNITY_ANDROID + private static AndroidJavaClass m_ajc = null; + private static AndroidJavaClass AJC + { + get + { + if( m_ajc == null ) + m_ajc = new AndroidJavaClass( "com.yasirkula.unity.NativeShare" ); + + return m_ajc; + } + } + + private static AndroidJavaObject m_context = null; + private static AndroidJavaObject Context + { + get + { + if( m_context == null ) + { + using( AndroidJavaObject unityClass = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) + { + m_context = unityClass.GetStatic( "currentActivity" ); + } + } + + return m_context; + } + } +#elif !UNITY_EDITOR && UNITY_IOS + [System.Runtime.InteropServices.DllImport( "__Internal" )] + private static extern void _NativeShare_Share( string[] files, int filesCount, string subject, string text, string link ); +#endif + + private string subject = string.Empty; + private string text = string.Empty; + private string title = string.Empty; + private string url = string.Empty; + +#if UNITY_EDITOR || UNITY_ANDROID + private readonly List emailRecipients = new List( 0 ); +#endif + +#if UNITY_EDITOR || UNITY_ANDROID + private readonly List targetPackages = new List( 0 ); + private readonly List targetClasses = new List( 0 ); +#endif + + private readonly List files = new List( 0 ); + private readonly List mimes = new List( 0 ); + + private ShareResultCallback callback; + + public NativeShare SetSubject( string subject ) + { + this.subject = subject ?? string.Empty; + return this; + } + + public NativeShare SetText( string text ) + { + this.text = text ?? string.Empty; + return this; + } + + public NativeShare SetUrl( string url ) + { + this.url = url ?? string.Empty; + return this; + } + + public NativeShare SetTitle( string title ) + { + this.title = title ?? string.Empty; + return this; + } + + public NativeShare SetCallback( ShareResultCallback callback ) + { + this.callback = callback; + return this; + } + + public NativeShare AddTarget( string androidPackageName, string androidClassName = null ) + { +#if UNITY_EDITOR || UNITY_ANDROID + if( !string.IsNullOrEmpty( androidPackageName ) ) + { + if( androidClassName == null ) + androidClassName = string.Empty; + + bool isUnique = true; + for( int i = 0; i < targetPackages.Count; i++ ) + { + if( targetPackages[i] == androidPackageName && targetClasses[i] == androidClassName ) + { + isUnique = false; + break; + } + } + + if( isUnique ) + { + targetPackages.Add( androidPackageName ); + targetClasses.Add( androidClassName ); + } + } +#endif + + return this; + } + + public NativeShare AddFile( string filePath, string mime = null ) + { + if( !string.IsNullOrEmpty( filePath ) && File.Exists( filePath ) ) + { + files.Add( filePath ); + mimes.Add( mime ?? string.Empty ); + } + else + Debug.LogError( "Share Error: file does not exist at path or permission denied: " + filePath ); + + return this; + } + + public NativeShare AddFile( Texture2D texture, string createdFileName = "Image.png" ) + { + if( !texture ) + Debug.LogError( "Share Error: Texture does not exist!" ); + else + { + if( string.IsNullOrEmpty( createdFileName ) ) + createdFileName = "Image.png"; + + bool saveAsJpeg; + if( createdFileName.EndsWith( ".jpeg", System.StringComparison.OrdinalIgnoreCase ) || createdFileName.EndsWith( ".jpg", System.StringComparison.OrdinalIgnoreCase ) ) + saveAsJpeg = true; + else + { + if( !createdFileName.EndsWith( ".png", System.StringComparison.OrdinalIgnoreCase ) ) + createdFileName += ".png"; + + saveAsJpeg = false; + } + + string filePath = Path.Combine( Application.temporaryCachePath, createdFileName ); + File.WriteAllBytes( filePath, GetTextureBytes( texture, saveAsJpeg ) ); + + AddFile( filePath, saveAsJpeg ? "image/jpeg" : "image/png" ); + } + + return this; + } + + public NativeShare AddEmailRecipient( string emailAddress ) + { +#if UNITY_EDITOR || UNITY_ANDROID + if( !string.IsNullOrEmpty( emailAddress ) && !emailRecipients.Contains( emailAddress ) ) + emailRecipients.Add( emailAddress ); +#endif + + return this; + } + + public void Share() + { + if( files.Count == 0 && subject.Length == 0 && text.Length == 0 && url.Length == 0 ) + { + Debug.LogWarning( "Share Error: attempting to share nothing!" ); + return; + } + +#if UNITY_EDITOR + Debug.Log( "Shared!" ); + + if( callback != null ) + callback( ShareResult.Shared, null ); +#elif UNITY_ANDROID + AJC.CallStatic( "Share", Context, new NSShareResultCallbackAndroid( callback ), targetPackages.ToArray(), targetClasses.ToArray(), files.ToArray(), mimes.ToArray(), emailRecipients.ToArray(), subject, CombineURLWithText(), title ); +#elif UNITY_IOS + NSShareResultCallbackiOS.Initialize( callback ); + if( files.Count == 0 ) + _NativeShare_Share( new string[0], 0, subject, text, GetURLWithScheme() ); + else + { + // While sharing both a URL and a file, some apps either don't show up in share sheet or omit the file + // If we append URL to text, the issue is resolved for at least some of these apps + _NativeShare_Share( files.ToArray(), files.Count, subject, CombineURLWithText(), "" ); + } +#else + Debug.LogWarning( "NativeShare is not supported on this platform!" ); +#endif + } + + #region Utility Functions + public static bool TargetExists( string androidPackageName, string androidClassName = null ) + { +#if !UNITY_EDITOR && UNITY_ANDROID + if( string.IsNullOrEmpty( androidPackageName ) ) + return false; + + if( androidClassName == null ) + androidClassName = string.Empty; + + return AJC.CallStatic( "TargetExists", Context, androidPackageName, androidClassName ); +#else + return true; +#endif + } + + public static bool FindTarget( out string androidPackageName, out string androidClassName, string packageNameRegex, string classNameRegex = null ) + { + androidPackageName = null; + androidClassName = null; + +#if !UNITY_EDITOR && UNITY_ANDROID + if( string.IsNullOrEmpty( packageNameRegex ) ) + return false; + + if( classNameRegex == null ) + classNameRegex = string.Empty; + + string result = AJC.CallStatic( "FindMatchingTarget", Context, packageNameRegex, classNameRegex ); + if( string.IsNullOrEmpty( result ) ) + return false; + + int splitIndex = result.IndexOf( '>' ); + if( splitIndex <= 0 || splitIndex >= result.Length - 1 ) + return false; + + androidPackageName = result.Substring( 0, splitIndex ); + androidClassName = result.Substring( splitIndex + 1 ); + + return true; +#else + return false; +#endif + } + #endregion + + #region Internal Functions + private string GetURLWithScheme() + { + return ( url.Length == 0 || url.Contains( "://" ) ) ? url : ( "https://" + url ); + } + + private string CombineURLWithText() + { + if( url.Length == 0 || text.IndexOf( url, System.StringComparison.OrdinalIgnoreCase ) >= 0 ) + return text; + else if( text.Length == 0 ) + return GetURLWithScheme(); + else + return string.Concat( text, " ", GetURLWithScheme() ); + } + + private byte[] GetTextureBytes( Texture2D texture, bool isJpeg ) + { + try + { + return isJpeg ? texture.EncodeToJPG( 100 ) : texture.EncodeToPNG(); + } + catch( UnityException ) + { + return GetTextureBytesFromCopy( texture, isJpeg ); + } + catch( System.ArgumentException ) + { + return GetTextureBytesFromCopy( texture, isJpeg ); + } + +#pragma warning disable 0162 + return null; +#pragma warning restore 0162 + } + + private byte[] GetTextureBytesFromCopy( Texture2D texture, bool isJpeg ) + { + // Texture is marked as non-readable, create a readable copy and share it instead + Debug.LogWarning( "Sharing non-readable textures is slower than sharing readable textures" ); + + Texture2D sourceTexReadable = null; + RenderTexture rt = RenderTexture.GetTemporary( texture.width, texture.height ); + RenderTexture activeRT = RenderTexture.active; + + try + { + Graphics.Blit( texture, rt ); + RenderTexture.active = rt; + + sourceTexReadable = new Texture2D( texture.width, texture.height, isJpeg ? TextureFormat.RGB24 : TextureFormat.RGBA32, false ); + sourceTexReadable.ReadPixels( new Rect( 0, 0, texture.width, texture.height ), 0, 0, false ); + sourceTexReadable.Apply( false, false ); + } + catch( System.Exception e ) + { + Debug.LogException( e ); + + Object.DestroyImmediate( sourceTexReadable ); + return null; + } + finally + { + RenderTexture.active = activeRT; + RenderTexture.ReleaseTemporary( rt ); + } + + try + { + return isJpeg ? sourceTexReadable.EncodeToJPG( 100 ) : sourceTexReadable.EncodeToPNG(); + } + catch( System.Exception e ) + { + Debug.LogException( e ); + return null; + } + finally + { + Object.DestroyImmediate( sourceTexReadable ); + } + } + #endregion +} +#pragma warning restore 0414 \ No newline at end of file diff --git a/Nreal/Assets/Plugins/NativeShare/NativeShare.cs.meta b/Nreal/Assets/Plugins/NativeShare/NativeShare.cs.meta new file mode 100644 index 00000000..244f53f6 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/NativeShare.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1bc4e4b9af3315e4a829993a8f7d5636 +timeCreated: 1498727250 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Nreal/Assets/Plugins/NativeShare/README.txt b/Nreal/Assets/Plugins/NativeShare/README.txt new file mode 100644 index 00000000..76afe8d8 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/README.txt @@ -0,0 +1,66 @@ += Native Share for Android & iOS = + +Online documentation & example code available at: https://github.com/yasirkula/UnityNativeShare +E-mail: yasirkula@gmail.com + + +1. ABOUT +This plugin helps you natively share files (images, videos, documents, etc.) and/or plain text on Android & iOS. A ContentProvider is used to share the media on Android. + + +2. HOW TO +2.1. Android Setup +NativeShare no longer requires any manual setup on Android. If you were using an older version of the plugin, you need to remove NativeShare's "" from your AndroidManifest.xml. + +For reference, the legacy documentation is available at: https://github.com/yasirkula/UnityNativeShare/wiki/Manual-Setup-for-Android + +2.2. iOS Setup +There are two ways to set up the plugin on iOS: + +a. Automated Setup for iOS +- (optional) change the value of 'Photo Library Usage Description' at 'Project Settings/yasirkula/Native Share' + +b. Manual Setup for iOS +- set the value of 'Automated Setup' to false at 'Project Settings/yasirkula/Native Share' +- build your project +- enter a Photo Library Usage Description to Info.plist in Xcode (in case user decides to save the shared media to Photos) +- also enter a Photo Library Additions Usage Description to Info.plist in Xcode, if exists + + +3. FAQ +- Can I share on a specific app? +On Android, you can share on a specific app via AddTarget. For iOS, you can check out this post and see if it works for you: https://forum.unity.com/threads/native-share-for-android-ios-open-source.519865/page-4#post-4011874 + +- I can't share image with text on X app +It is just not possible to share an image/file with text/subject on some apps (e.g. Facebook), they intentionally omit either the image or the text from the shared content. These apps require you to use their own SDKs for complex share actions. For best compatibility, I'd recommend you to share either only image or only text. + +- I can't build the project to Android, it says "Android resource linking failed: unexpected element found in " in the error message +NativeShare adds "" element to AndroidManifest.xml due to the new package visibility change (https://developer.android.com/training/package-visibility). The build error can be fixed by following these steps: https://developers.google.com/ar/develop/unity/android-11-build (in my tests, changing "Gradle installed with Unity" wasn't necessary). In the worst case, if you are OK with NativeShare not working on some of the affected devices, then you can open NativeShare.aar with WinRAR or 7-Zip and then remove the "..." element from AndroidManifest.xml. + +- Can't share, it says "java.lang.ClassNotFoundException: com.yasirkula.unity.NativeShare" in Logcat +If you are sure that your plugin is up-to-date, then enable "Custom Proguard File" option from Player Settings and add the following line to that file: -keep class com.yasirkula.unity.* { *; } + + +4. SCRIPTING API +Simply create a new NativeShare object and customize it by chaining the following functions as you like: + +- SetSubject( string subject ): sets the subject (primarily used in e-mail applications) +- SetText( string text ): sets the shared text. Note that the Facebook app will omit text, if exists +- SetUrl( string url ): sets the shared url. On supported iOS apps, this url is used to generate a preview of the target webpage. Other iOS apps may append the url to the text or omit it. While sharing a file on iOS or while sharing anything on Android, the url is appended to the text (unless the text already contains the url) +- AddFile( string filePath, string mime = null ): adds the file at path to the share action. You can add multiple files of different types. The MIME of the file is automatically determined if left null; however, if the file doesn't have an extension and/or you already know the MIME of the file, you can enter the MIME manually. MIME has no effect on iOS +- AddFile( Texture2D texture, string createdFileName = "Image.png" ): saves the texture to Application.temporaryCachePath with the specified filename and adds the image file to the share action +- AddEmailRecipient( string emailAddress ): auto-populates the recipients field of e-mail applications on Android platform. Has no effect on iOS +- SetTitle( string title ): sets the title of the share dialog on Android platform. Has no effect on iOS +- AddTarget( string androidPackageName, string androidClassName = null ): shares content on a specific application on Android platform. If androidClassName is left null, list of activities in the share dialog will be narrowed down to the activities in the specified androidPackageName that can handle this share action. Note that androidClassName, if provided, must be the full name of the activity (with its package). You can call this function multiple times. This function has no effect on iOS +- SetCallback( ShareResultCallback callback ): invokes the callback function after the share action is completed. ShareResultCallback has the following signature: void ShareResultCallback( ShareResult result, string shareTarget ) + - "ShareResult result" can take 3 values: + - Unknown: we can't determine whether or not the user has shared the content + - Shared: user has probably shared the content. This value guarantees that the user has at least selected an app from the share sheet. But it is impossible to say whether the user has actually shared the content or cancelled the operation right after selecting the app from the share sheet + - NotShared: either the user has closed the share sheet immediately or selected an app from the share sheet but then decided not to share the content (unfortunately, most apps return Shared for the latter case) + - "string shareTarget" stores information about the app that the user has selected from the share sheet. It can be null or empty, if this information isn't provided. Usually, this is the package name/class name of the selected application. You can use this value to e.g. determine if the user has picked Twitter from the share sheet: shareTarget != null && shareTarget.ToLowerInvariant().Contains( "twitter" ) + +Finally, calling the Share() function of the NativeShare object will present the share sheet. + + +5. KNOWN LIMITATIONS +- Gif files are shared as static images on iOS (to learn more, please see this issue: https://github.com/yasirkula/UnityNativeShare/issues/22) \ No newline at end of file diff --git a/Nreal/Assets/Plugins/NativeShare/README.txt.meta b/Nreal/Assets/Plugins/NativeShare/README.txt.meta new file mode 100644 index 00000000..991f1d38 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/README.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 008f9918bb19fa94b83c2210cf539039 +timeCreated: 1563308465 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Nreal/Assets/Plugins/NativeShare/iOS.meta b/Nreal/Assets/Plugins/NativeShare/iOS.meta new file mode 100644 index 00000000..6d611db0 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/iOS.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d770bec7dc391e949b3a37a50fceb1d1 +folderAsset: yes +timeCreated: 1498722622 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Nreal/Assets/Plugins/NativeShare/iOS/NSShareResultCallbackiOS.cs b/Nreal/Assets/Plugins/NativeShare/iOS/NSShareResultCallbackiOS.cs new file mode 100644 index 00000000..754c3c7f --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/iOS/NSShareResultCallbackiOS.cs @@ -0,0 +1,44 @@ +#if UNITY_EDITOR || UNITY_IOS +using UnityEngine; + +namespace NativeShareNamespace +{ + public class NSShareResultCallbackiOS : MonoBehaviour + { + private static NSShareResultCallbackiOS instance; + private NativeShare.ShareResultCallback callback; + + public static void Initialize( NativeShare.ShareResultCallback callback ) + { + if( instance == null ) + { + instance = new GameObject( "NSShareResultCallbackiOS" ).AddComponent(); + DontDestroyOnLoad( instance.gameObject ); + } + else if( instance.callback != null ) + instance.callback( NativeShare.ShareResult.Unknown, null ); + + instance.callback = callback; + } + + public void OnShareCompleted( string message ) + { + NativeShare.ShareResultCallback _callback = callback; + callback = null; + + if( _callback != null ) + { + if( string.IsNullOrEmpty( message ) ) + _callback( NativeShare.ShareResult.Unknown, null ); + else + { + NativeShare.ShareResult result = (NativeShare.ShareResult) ( message[0] - '0' ); // Convert first char to digit and then to ShareResult + string shareTarget = message.Length > 1 ? message.Substring( 1 ) : null; + + _callback( result, shareTarget ); + } + } + } + } +} +#endif \ No newline at end of file diff --git a/Nreal/Assets/Plugins/NativeShare/iOS/NSShareResultCallbackiOS.cs.meta b/Nreal/Assets/Plugins/NativeShare/iOS/NSShareResultCallbackiOS.cs.meta new file mode 100644 index 00000000..ec9f89c9 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/iOS/NSShareResultCallbackiOS.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d3cf1e26478b1b346b977d48854afe7a +timeCreated: 1594490254 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Nreal/Assets/Plugins/NativeShare/iOS/NativeShare.mm b/Nreal/Assets/Plugins/NativeShare/iOS/NativeShare.mm new file mode 100644 index 00000000..58254804 --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/iOS/NativeShare.mm @@ -0,0 +1,144 @@ +#import +#import +#ifdef UNITY_4_0 || UNITY_5_0 +#import "iPhone_View.h" +#else +extern UIViewController* UnityGetGLViewController(); +#endif + +#define CHECK_IOS_VERSION( version ) ([[[UIDevice currentDevice] systemVersion] compare:version options:NSNumericSearch] != NSOrderedAscending) + +// Credit: https://github.com/ChrisMaire/unity-native-sharing + +// Credit: https://stackoverflow.com/a/29916845/2373034 +@interface UNativeShareEmailItemProvider : NSObject +@property (nonatomic, strong) NSString *subject; +@property (nonatomic, strong) NSString *body; +@end + +// Credit: https://stackoverflow.com/a/29916845/2373034 +@implementation UNativeShareEmailItemProvider +- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController +{ + return [self body]; +} + +- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType +{ + return [self body]; +} + +- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType +{ + return [self subject]; +} +@end + +extern "C" void _NativeShare_Share( const char* files[], int filesCount, const char* subject, const char* text, const char* link ) +{ + NSMutableArray *items = [NSMutableArray new]; + + // When there is a subject on iOS 7 or later, text is provided together with subject via a UNativeShareEmailItemProvider + // Credit: https://stackoverflow.com/a/29916845/2373034 + if( strlen( subject ) > 0 && CHECK_IOS_VERSION( @"7.0" ) ) + { + UNativeShareEmailItemProvider *emailItem = [UNativeShareEmailItemProvider new]; + emailItem.subject = [NSString stringWithUTF8String:subject]; + emailItem.body = [NSString stringWithUTF8String:text]; + + [items addObject:emailItem]; + } + else if( strlen( text ) > 0 ) + [items addObject:[NSString stringWithUTF8String:text]]; + + // Credit: https://forum.unity.com/threads/native-share-for-android-ios-open-source.519865/page-13#post-6942362 + if( strlen( link ) > 0 ) + { + NSString *urlRaw = [NSString stringWithUTF8String:link]; + NSURL *url = [NSURL URLWithString:urlRaw]; + if( url == nil ) + { + // Try escaping the URL + if( CHECK_IOS_VERSION( @"9.0" ) ) + { + url = [NSURL URLWithString:[urlRaw stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]]; + if( url == nil ) + url = [NSURL URLWithString:[urlRaw stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]]; + } + else + url = [NSURL URLWithString:[urlRaw stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + } + + if( url != nil ) + [items addObject:url]; + else + NSLog( @"Couldn't create a URL from link: %@", urlRaw ); + } + + for( int i = 0; i < filesCount; i++ ) + { + NSString *filePath = [NSString stringWithUTF8String:files[i]]; + UIImage *image = [UIImage imageWithContentsOfFile:filePath]; + if( image != nil ) + [items addObject:image]; + else + [items addObject:[NSURL fileURLWithPath:filePath]]; + } + + UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil]; + if( strlen( subject ) > 0 ) + [activity setValue:[NSString stringWithUTF8String:subject] forKey:@"subject"]; + else if( [items count] == 0 ) + { + NSLog( @"Share canceled because there is nothing to share..." ); + UnitySendMessage( "NSShareResultCallbackiOS", "OnShareCompleted", "2" ); + + return; + } + + if( CHECK_IOS_VERSION( @"8.0" ) ) + { + activity.completionWithItemsHandler = ^( UIActivityType activityType, BOOL completed, NSArray *returnedItems, NSError *activityError ) + { + NSLog( @"Shared to %@ with result: %d", activityType, completed ); + + if( activityError != nil ) + NSLog( @"Share error: %@", activityError ); + + const char *resultMessage = [[NSString stringWithFormat:@"%d%@", completed ? 1 : 2, activityType] UTF8String]; + char *result = (char*) malloc( strlen( resultMessage ) + 1 ); + strcpy( result, resultMessage ); + + UnitySendMessage( "NSShareResultCallbackiOS", "OnShareCompleted", result ); + }; + } + else if( CHECK_IOS_VERSION( @"6.0" ) ) + { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + activity.completionHandler = ^( UIActivityType activityType, BOOL completed ) + { + NSLog( @"Shared to %@ with result: %d", activityType, completed ); + + const char *resultMessage = [[NSString stringWithFormat:@"%d%@", completed ? 1 : 2, activityType] UTF8String]; + char *result = (char*) malloc( strlen( resultMessage ) + 1 ); + strcpy( result, resultMessage ); + + UnitySendMessage( "NSShareResultCallbackiOS", "OnShareCompleted", result ); + }; +#pragma clang diagnostic pop + } + else + UnitySendMessage( "NSShareResultCallbackiOS", "OnShareCompleted", "" ); + + UIViewController *rootViewController = UnityGetGLViewController(); + if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone ) // iPhone + { + [rootViewController presentViewController:activity animated:YES completion:nil]; + } + else // iPad + { + UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:activity]; + [popup presentPopoverFromRect:CGRectMake( rootViewController.view.frame.size.width / 2, rootViewController.view.frame.size.height / 2, 1, 1 ) inView:rootViewController.view permittedArrowDirections:0 animated:YES]; + } +} \ No newline at end of file diff --git a/Nreal/Assets/Plugins/NativeShare/iOS/NativeShare.mm.meta b/Nreal/Assets/Plugins/NativeShare/iOS/NativeShare.mm.meta new file mode 100644 index 00000000..513d22bc --- /dev/null +++ b/Nreal/Assets/Plugins/NativeShare/iOS/NativeShare.mm.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 2eb72520cd4ae2f44a30055928cb384c +timeCreated: 1498727312 +licenseType: Store +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + Any: + second: + enabled: 0 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + data: + first: + iPhone: iOS + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Nreal/Assets/Scenes/Home.unity b/Nreal/Assets/Scenes/Home.unity index 8f8142b8..1477d9c1 100644 --- a/Nreal/Assets/Scenes/Home.unity +++ b/Nreal/Assets/Scenes/Home.unity @@ -1923,6 +1923,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 170136551} m_CullTransparentMesh: 0 +--- !u!1 &190005210 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 190005211} + - component: {fileID: 190005213} + - component: {fileID: 190005212} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &190005211 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 190005210} + 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: 1673619955} + 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!114 &190005212 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 190005210} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.5529412, g: 0.5529412, b: 0.5529412, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 8 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 8 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Imprint +--- !u!222 &190005213 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 190005210} + m_CullTransparentMesh: 1 --- !u!4 &195758829 stripped Transform: m_CorrespondingSourceObject: {fileID: 6364563258831008498, guid: d092e18be9b873f4ea809c276aa8792b, @@ -1951,28 +2030,53 @@ PrefabInstance: - target: {fileID: 8288902924350622702, guid: d48ec07b4c5ca954796f489d8c49c058, type: 3} propertyPath: m_Text - value: Imprint + value: Recording objectReference: {fileID: 0} - target: {fileID: 8288902924397068526, guid: d48ec07b4c5ca954796f489d8c49c058, type: 3} propertyPath: m_Sprite value: - objectReference: {fileID: 21300000, guid: ad5df0a202aa0664aa132f268e664317, + objectReference: {fileID: 21300000, guid: 8697a3aaf89a97e40a3089567d2dafbb, + type: 3} + - target: {fileID: 8288902925528648973, guid: d48ec07b4c5ca954796f489d8c49c058, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8288902925528648973, guid: d48ec07b4c5ca954796f489d8c49c058, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} - target: {fileID: 8288902925528648973, guid: d48ec07b4c5ca954796f489d8c49c058, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target value: - objectReference: {fileID: 484613167} + objectReference: {fileID: 1793089062} + - target: {fileID: 8288902925528648973, guid: d48ec07b4c5ca954796f489d8c49c058, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} - target: {fileID: 8288902925528648973, guid: d48ec07b4c5ca954796f489d8c49c058, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName - value: Show + value: OnClickPlayButton + objectReference: {fileID: 0} + - target: {fileID: 8288902925528648973, guid: d48ec07b4c5ca954796f489d8c49c058, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: NrealExt.Functions.Record.VideoCaptureController, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 8288902925528648973, guid: d48ec07b4c5ca954796f489d8c49c058, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine objectReference: {fileID: 0} - target: {fileID: 8288902925528648974, guid: d48ec07b4c5ca954796f489d8c49c058, type: 3} propertyPath: m_Name - value: BuImprint + value: BuShare objectReference: {fileID: 0} - target: {fileID: 8288902925528648975, guid: d48ec07b4c5ca954796f489d8c49c058, type: 3} @@ -6814,6 +6918,184 @@ RectTransform: m_AnchoredPosition: {x: 90, y: 32.4} m_SizeDelta: {x: 160, y: 45} m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &854905464 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 8288902924397068526, guid: d48ec07b4c5ca954796f489d8c49c058, + type: 3} + m_PrefabInstance: {fileID: 223974226} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &855988586 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 855988587} + - component: {fileID: 855988590} + - component: {fileID: 855988589} + - component: {fileID: 855988588} + m_Layer: 0 + m_Name: cancelBtn + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &855988587 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 855988586} + 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: 2147323337} + m_Father: {fileID: 1469086326} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 125, y: 48} + m_SizeDelta: {x: 160, y: 45} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &855988588 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 855988586} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 2 + 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: 21300000, guid: 5505cd2125511484da016a1192cee114, + type: 3} + m_PressedSprite: {fileID: 21300000, guid: 5505cd2125511484da016a1192cee114, type: 3} + m_SelectedSprite: {fileID: 21300000, guid: 5505cd2125511484da016a1192cee114, type: 3} + m_DisabledSprite: {fileID: 21300000, guid: 864158aa50ca68141b7fff88638b6fe8, type: 3} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 855988589} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1793089062} + m_TargetAssemblyTypeName: NrealExt.Functions.Record.VideoCaptureController, + Assembly-CSharp + m_MethodName: OnClickShareNo + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &855988589 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 855988586} + 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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 864158aa50ca68141b7fff88638b6fe8, type: 3} + m_Type: 0 + 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 &855988590 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 855988586} + m_CullTransparentMesh: 0 +--- !u!1 &881471161 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 881471162} + m_Layer: 0 + m_Name: Offset + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &881471162 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 881471161} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.025, z: 1.3} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1095584138} + m_Father: {fileID: 2015252867} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &881676647 GameObject: m_ObjectHideFlags: 0 @@ -7634,7 +7916,7 @@ PrefabInstance: - {fileID: 2841333386195521169, guid: d092e18be9b873f4ea809c276aa8792b, type: 3} - {fileID: 3658800093834657070, guid: d092e18be9b873f4ea809c276aa8792b, type: 3} m_SourcePrefab: {fileID: 100100000, guid: d092e18be9b873f4ea809c276aa8792b, type: 3} ---- !u!1 &1102372206 +--- !u!1 &1095584137 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7642,53 +7924,149 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1102372207} - - component: {fileID: 1102372209} - - component: {fileID: 1102372208} - m_Layer: 5 - m_Name: 7 + - component: {fileID: 1095584138} + - component: {fileID: 1095584141} + - component: {fileID: 1095584140} + - component: {fileID: 1095584139} + m_Layer: 0 + m_Name: Canvas m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1102372207 +--- !u!224 &1095584138 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1102372206} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1095584137} + 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: 835457208} - m_RootOrder: 7 + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_Children: + - {fileID: 1469086326} + m_Father: {fileID: 881471162} + 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.000061035156, y: -49.99994} - m_SizeDelta: {x: -50, y: -50.157715} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1102372208 +--- !u!114 &1095584139 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1102372206} + m_GameObject: {fileID: 1095584137} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 6750858741a2f3744a27ca80b2f55710, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.392} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: + m_IgnoreReversedGraphics: 1 +--- !u!114 &1095584140 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095584137} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 21 + m_PresetInfoIsWorld: 1 +--- !u!223 &1095584141 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095584137} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 100 + m_TargetDisplay: 0 +--- !u!1 &1102372206 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1102372207} + - component: {fileID: 1102372209} + - component: {fileID: 1102372208} + m_Layer: 5 + m_Name: 7 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1102372207 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1102372206} + 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: 835457208} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.000061035156, y: -49.99994} + m_SizeDelta: {x: -50, y: -50.157715} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1102372208 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1102372206} + 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: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} @@ -8893,12 +9271,6 @@ Transform: type: 3} m_PrefabInstance: {fileID: 566185954} m_PrefabAsset: {fileID: 0} ---- !u!224 &1255703644 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - m_PrefabInstance: {fileID: 2616499008966165094} - m_PrefabAsset: {fileID: 0} --- !u!1 &1260066304 GameObject: m_ObjectHideFlags: 0 @@ -11200,6 +11572,84 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1467447960} m_CullTransparentMesh: 0 +--- !u!1 &1469086325 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1469086326} + - component: {fileID: 1469086328} + - component: {fileID: 1469086327} + m_Layer: 0 + m_Name: MenuPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1469086326 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1469086325} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.08, y: 1.08, z: 1.08} + m_Children: + - {fileID: 1889751161} + - {fileID: 855988587} + - {fileID: 2107659373} + m_Father: {fileID: 1095584138} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 430, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1469086327 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1469086325} + 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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7c99c82e5e5ee784c956e2e0c387852b, 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: 4 +--- !u!222 &1469086328 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1469086325} + m_CullTransparentMesh: 0 --- !u!4 &1477720007 stripped Transform: m_CorrespondingSourceObject: {fileID: 6364563258831008498, guid: d092e18be9b873f4ea809c276aa8792b, @@ -12435,6 +12885,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1620159960} m_CullTransparentMesh: 0 +--- !u!1 &1638832382 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1638832383} + - component: {fileID: 1638832385} + - component: {fileID: 1638832384} + m_Layer: 0 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1638832383 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1638832382} + 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: 1889751161} + 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: 15, y: 0} + m_SizeDelta: {x: -30, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1638832384 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1638832382} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 8b7806a64d6a99541bc94106151b1c1d, type: 3} + m_FontSize: 18 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Yes +--- !u!222 &1638832385 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1638832382} + m_CullTransparentMesh: 0 --- !u!1 &1661587414 GameObject: m_ObjectHideFlags: 0 @@ -12585,25 +13114,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1664336926} m_CullTransparentMesh: 0 ---- !u!1 &1682297896 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 6364563258831008502, guid: d092e18be9b873f4ea809c276aa8792b, - type: 3} - m_PrefabInstance: {fileID: 1088739301} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1682297900 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1682297896} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 51041193df2c3754cbee70967d898ed2, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1696213446 +--- !u!1 &1673619954 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12611,28 +13122,180 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1696213447} - - component: {fileID: 1696213449} - - component: {fileID: 1696213448} + - component: {fileID: 1673619955} + - component: {fileID: 1673619958} + - component: {fileID: 1673619957} + - component: {fileID: 1673619956} m_Layer: 5 - m_Name: 8 + m_Name: Imprint m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1696213447 +--- !u!224 &1673619955 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1696213446} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1673619954} + 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: 905807387} + m_Children: + - {fileID: 190005211} + m_Father: {fileID: 1773568996} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -24, y: -12} + m_SizeDelta: {x: 40, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1673619956 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1673619954} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 2 + 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: 21300000, guid: 5505cd2125511484da016a1192cee114, + type: 3} + m_PressedSprite: {fileID: 21300000, guid: 5505cd2125511484da016a1192cee114, type: 3} + m_SelectedSprite: {fileID: 21300000, guid: 5505cd2125511484da016a1192cee114, type: 3} + m_DisabledSprite: {fileID: 21300000, guid: 864158aa50ca68141b7fff88638b6fe8, type: 3} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1673619957} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 484613167} + m_TargetAssemblyTypeName: ImpressumController, Assembly-CSharp + m_MethodName: Show + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1673619957 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1673619954} + 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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 864158aa50ca68141b7fff88638b6fe8, 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!222 &1673619958 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1673619954} + m_CullTransparentMesh: 1 +--- !u!1 &1682297896 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 6364563258831008502, guid: d092e18be9b873f4ea809c276aa8792b, + type: 3} + m_PrefabInstance: {fileID: 1088739301} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1682297900 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1682297896} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 51041193df2c3754cbee70967d898ed2, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &1696213446 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1696213447} + - component: {fileID: 1696213449} + - component: {fileID: 1696213448} + m_Layer: 5 + m_Name: 8 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1696213447 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1696213446} + 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: 905807387} m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -13133,7 +13796,7 @@ RectTransform: m_LocalScale: {x: 0.75, y: 0.75, z: 0.75} m_Children: - {fileID: 881676648} - - {fileID: 1255703644} + - {fileID: 1673619955} m_Father: {fileID: 484613166} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -13686,6 +14349,51 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1785607656} m_CullTransparentMesh: 0 +--- !u!1 &1793089056 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8288902925528648974, guid: d48ec07b4c5ca954796f489d8c49c058, + type: 3} + m_PrefabInstance: {fileID: 223974226} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1793089059 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 8288902925528648973, guid: d48ec07b4c5ca954796f489d8c49c058, + type: 3} + m_PrefabInstance: {fileID: 223974226} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1793089056} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1793089062 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1793089056} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9ee1b910643d9854994626f5b170172c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_PlayButton: {fileID: 1793089059} + m_Previewer: {fileID: 0} + m_SliderMic: {fileID: 0} + m_TextMic: {fileID: 0} + m_SliderApp: {fileID: 0} + m_TextApp: {fileID: 0} + RecordingIndicator: {fileID: 854905464} + blendMode: 0 + resolutionLevel: 0 + cullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + audioState: 1 + useGreenBackGround: 0 + ShareDialog: {fileID: 2015252866} --- !u!1 &1812143093 GameObject: m_ObjectHideFlags: 0 @@ -14541,6 +15249,142 @@ PrefabInstance: - {fileID: 2841333386195521169, guid: d092e18be9b873f4ea809c276aa8792b, type: 3} - {fileID: 2077098541580280392, guid: d092e18be9b873f4ea809c276aa8792b, type: 3} m_SourcePrefab: {fileID: 100100000, guid: d092e18be9b873f4ea809c276aa8792b, type: 3} +--- !u!1 &1889751160 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1889751161} + - component: {fileID: 1889751164} + - component: {fileID: 1889751163} + - component: {fileID: 1889751162} + m_Layer: 0 + m_Name: shareBtn + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1889751161 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889751160} + 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: 1638832383} + - {fileID: 2134508616} + m_Father: {fileID: 1469086326} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -125, y: 48} + m_SizeDelta: {x: 160, y: 45} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1889751162 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889751160} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 2 + 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: 21300000, guid: 5505cd2125511484da016a1192cee114, + type: 3} + m_PressedSprite: {fileID: 21300000, guid: 5505cd2125511484da016a1192cee114, type: 3} + m_SelectedSprite: {fileID: 21300000, guid: 5505cd2125511484da016a1192cee114, type: 3} + m_DisabledSprite: {fileID: 21300000, guid: 864158aa50ca68141b7fff88638b6fe8, type: 3} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1889751163} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1793089062} + m_TargetAssemblyTypeName: NrealExt.Functions.Record.VideoCaptureController, + Assembly-CSharp + m_MethodName: OnClickShareYes + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1889751163 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889751160} + 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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 864158aa50ca68141b7fff88638b6fe8, type: 3} + m_Type: 0 + 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 &1889751164 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889751160} + m_CullTransparentMesh: 0 --- !u!1 &1901102667 GameObject: m_ObjectHideFlags: 0 @@ -15358,7 +16202,52 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2001447813} m_CullTransparentMesh: 0 ---- !u!1 &2024564477 +--- !u!1 &2015252866 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2015252867} + - component: {fileID: 2015252868} + m_Layer: 0 + m_Name: ShareMsg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &2015252867 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2015252866} + 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: 881471162} + m_Father: {fileID: 0} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2015252868 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2015252866} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4ed91386db3cbfc40bc1793eeb84542d, type: 3} + m_Name: + m_EditorClassIdentifier: + IsVisible: 1 +--- !u!1 &2024564477 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -16097,6 +16986,85 @@ PrefabInstance: - {fileID: 3658800093834657070, guid: d092e18be9b873f4ea809c276aa8792b, type: 3} - {fileID: 2077098541580280392, guid: d092e18be9b873f4ea809c276aa8792b, type: 3} m_SourcePrefab: {fileID: 100100000, guid: d092e18be9b873f4ea809c276aa8792b, type: 3} +--- !u!1 &2107659372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2107659373} + - component: {fileID: 2107659375} + - component: {fileID: 2107659374} + m_Layer: 0 + m_Name: titleTxt + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2107659373 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2107659372} + 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: 1469086326} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 210, y: -30.000008} + m_SizeDelta: {x: 350, y: 34.91} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &2107659374 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2107659372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 8b7806a64d6a99541bc94106151b1c1d, type: 3} + m_FontSize: 20 + m_FontStyle: 1 + m_BestFit: 1 + m_MinSize: 2 + m_MaxSize: 20 + m_Alignment: 3 + m_AlignByGeometry: 1 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Do you want to share your experience? +--- !u!222 &2107659375 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2107659372} + m_CullTransparentMesh: 0 --- !u!1 &2127836226 GameObject: m_ObjectHideFlags: 0 @@ -16172,6 +17140,81 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2127836226} m_CullTransparentMesh: 0 +--- !u!1 &2134508615 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2134508616} + - component: {fileID: 2134508618} + - component: {fileID: 2134508617} + m_Layer: 0 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2134508616 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2134508615} + 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: 1889751161} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -25, y: 0} + m_SizeDelta: {x: 25, y: 25} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2134508617 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2134508615} + 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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 3141f7bb42807bc458a13a33cb9c304c, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2134508618 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2134508615} + m_CullTransparentMesh: 1 --- !u!1 &2138788670 GameObject: m_ObjectHideFlags: 0 @@ -16247,158 +17290,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2138788670} m_CullTransparentMesh: 0 ---- !u!1001 &2616499008966165094 -PrefabInstance: +--- !u!1 &2147323336 +GameObject: m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 1773568996} - m_Modifications: - - target: {fileID: 2616499008055510584, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target - value: - objectReference: {fileID: 2616499008966165095} - - target: {fileID: 2616499008055510584, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName - value: OnClickPlayButton - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510584, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName - value: NrealExt.Functions.Record.VideoCapture2Local, Assembly-CSharp - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_AnchorMax.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_AnchorMin.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_AnchorMin.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_SizeDelta.x - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_SizeDelta.y - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_AnchoredPosition.x - value: -10 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_AnchoredPosition.y - value: -10 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510586, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510587, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 2616499008055510589, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - propertyPath: m_Name - value: BuRecord - objectReference: {fileID: 0} - m_RemovedComponents: - - {fileID: 2616499008055510587, guid: ff701e0e2b3328e49ac48cd30676ea31, type: 3} - m_SourcePrefab: {fileID: 100100000, guid: ff701e0e2b3328e49ac48cd30676ea31, type: 3} ---- !u!114 &2616499008966165095 stripped + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2147323337} + - component: {fileID: 2147323339} + - component: {fileID: 2147323338} + m_Layer: 0 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2147323337 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2147323336} + 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: 855988587} + 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!114 &2147323338 MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 8353675521435871486, guid: ff701e0e2b3328e49ac48cd30676ea31, - type: 3} - m_PrefabInstance: {fileID: 2616499008966165094} + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 2147323336} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9ee1b910643d9854994626f5b170172c, type: 3} + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} m_Name: m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 8b7806a64d6a99541bc94106151b1c1d, type: 3} + m_FontSize: 18 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: No +--- !u!222 &2147323339 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2147323336} + m_CullTransparentMesh: 0 --- !u!4 &6364563259237651490 stripped Transform: m_CorrespondingSourceObject: {fileID: 6364563258831008498, guid: d092e18be9b873f4ea809c276aa8792b, @@ -16634,10 +17604,15 @@ PrefabInstance: propertyPath: m_LocalPosition.y value: -0.5 objectReference: {fileID: 0} + - target: {fileID: 8794644098809934788, guid: d3f38da892e646b47b3ee00a4580eb7e, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.7 + objectReference: {fileID: 0} - target: {fileID: 8794644099010868389, guid: d3f38da892e646b47b3ee00a4580eb7e, type: 3} propertyPath: m_RootOrder - value: 9 + value: 10 objectReference: {fileID: 0} - target: {fileID: 8794644099010868389, guid: d3f38da892e646b47b3ee00a4580eb7e, type: 3} diff --git a/Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton/VideoCapture2Local.cs b/Nreal/Assets/Scripts/VideoCaptureController.cs similarity index 92% rename from Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton/VideoCapture2Local.cs rename to Nreal/Assets/Scripts/VideoCaptureController.cs index 06ae7cae..9b8e91fe 100644 --- a/Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton/VideoCapture2Local.cs +++ b/Nreal/Assets/Scripts/VideoCaptureController.cs @@ -26,7 +26,7 @@ namespace NrealExt.Functions.Record #endif /// A video capture 2 local example. [HelpURL("https://developer.nreal.ai/develop/unity/video-capture")] - public class VideoCapture2Local : MonoBehaviour + public class VideoCaptureController : MonoBehaviour { [SerializeField] private Button m_PlayButton; [SerializeField] private NRPreviewer m_Previewer; @@ -41,6 +41,8 @@ public class VideoCapture2Local : MonoBehaviour public LayerMask cullingMask = -1; public NRVideoCapture.AudioState audioState = NRVideoCapture.AudioState.ApplicationAudio; public bool useGreenBackGround = false; + public GameObject ShareDialog; + private string SharePath; public enum ResolutionLevel { @@ -63,6 +65,7 @@ public string VideoSavePath GalleryDataProvider galleryDataTool; + void Awake() { if (m_SliderMic != null) @@ -147,7 +150,7 @@ public void OnClickPlayButton() void RefreshUIState() { bool flag = m_VideoCapture == null || !m_VideoCapture.IsRecording; - RecordingIndicator.color = flag ? Color.green : Color.red; + RecordingIndicator.color = flag ? Color.white : Color.red; } /// Starts video capture. @@ -273,11 +276,30 @@ void OnStoppedVideoCaptureMode(NRVideoCapture.VideoCaptureResult result) StartCoroutine(DelayInsertVideoToGallery(path, filename, "Record")); + SharePath = path; + ShareDialog.SetActive(true); + // Release video capture resource. m_VideoCapture.Dispose(); m_VideoCapture = null; } + public void OnClickShareNo() + { + ShareDialog.SetActive(false); + } + + public void OnClickShareYes() + { + new NativeShare() + .AddFile(SharePath) + .SetSubject("Watch my AR experience").SetText("PlanB. Famous Cube on nreal:").SetUrl("https://play.google.com/store/apps/details?id=com.PlanB.PFC.Nreal") + .SetCallback((result, shareTarget) => Debug.Log("Share result: " + result + ", selected app: " + shareTarget)) + .Share(); + + ShareDialog.SetActive(false); + } + void OnDestroy() { // Release video capture resource. diff --git a/Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton/VideoCapture2Local.cs.meta b/Nreal/Assets/Scripts/VideoCaptureController.cs.meta similarity index 100% rename from Nreal/Assets/NrealExtensions/Prefabs/Scripts/RecordButton/VideoCapture2Local.cs.meta rename to Nreal/Assets/Scripts/VideoCaptureController.cs.meta diff --git a/Nreal/ProjectSettings/ProjectSettings.asset b/Nreal/ProjectSettings/ProjectSettings.asset index bb196a59..26083fa4 100644 --- a/Nreal/ProjectSettings/ProjectSettings.asset +++ b/Nreal/ProjectSettings/ProjectSettings.asset @@ -135,7 +135,7 @@ PlayerSettings: 16:10: 1 16:9: 1 Others: 1 - bundleVersion: 1.1.2 + bundleVersion: 1.2.0 preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 @@ -151,6 +151,7 @@ PlayerSettings: m_ColorGamuts: 00000000 targetPixelDensity: 30 resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 applicationIdentifier: @@ -160,7 +161,7 @@ PlayerSettings: iPhone: 0 tvOS: 0 overrideDefaultApplicationIdentifier: 1 - AndroidBundleVersionCode: 112 + AndroidBundleVersionCode: 120 AndroidMinSdkVersion: 26 AndroidTargetSdkVersion: 30 AndroidPreferredInstallLocation: 1 @@ -608,7 +609,9 @@ PlayerSettings: switchPlayerConnectionEnabled: 1 switchUseNewStyleFilepaths: 0 switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 ps4NPTitleSecret: ps4NPTrophyPackPath: @@ -767,6 +770,7 @@ PlayerSettings: metroFTAName: metroFTAFileTypes: [] metroProtocolName: + vcxProjDefaultLanguage: XboxOneProductId: XboxOneUpdateKey: XboxOneSandboxId: diff --git a/Nreal/UserSettings/EditorUserSettings.asset b/Nreal/UserSettings/EditorUserSettings.asset index c056ad77..565218b7 100644 --- a/Nreal/UserSettings/EditorUserSettings.asset +++ b/Nreal/UserSettings/EditorUserSettings.asset @@ -15,6 +15,12 @@ EditorUserSettings: value: 22424703114646753f3d28095f075a1d1904571e242134341d280f27fbd33839efa923e7ee2e26 flags: 0 RecentlyUsedScenePath-3: + value: 22424703114646753f3d28095f075a1d1904570322383324601f1421f6f53534c1e838fdf53533303c10a1290a371526 + flags: 0 + RecentlyUsedScenePath-4: + value: 22424703114646753f3d28095f075a1d1904570322383324600a123df6f23b34eee224c0e93c30722c0ce6281d + flags: 0 + RecentlyUsedScenePath-5: value: 22424703114646680e0b0227036c771f1b12563f22213229 flags: 0 vcSharedLogLevel: