From 9ab5ab4348d958bb860f9e87aacc027cbc964ced Mon Sep 17 00:00:00 2001 From: rob1997 Date: Tue, 27 Aug 2024 15:27:03 +0300 Subject: [PATCH 1/5] use editor instead of moving providers for Connection Providers --- .../HyperPlayConnectionProvider.asset | 17 --- .../HyperPlayConnectionProvider.asset.meta | 8 -- .../Web3AuthConnectionProvider.asset | 35 ------ .../Web3AuthConnectionProvider.asset.meta | 8 -- .../Editor/ConnectionHandlerEditor.cs | 108 +++++++++++++----- .../Editor/ReadWriteProvider.cs | 42 ------- .../Editor/ReadWriteProvider.cs.meta | 3 - .../MetamaskConnectionProvider.asset | 16 --- .../MetamaskConnectionProvider.asset.meta | 8 -- .../WalletConnectConnectionProvider.asset | 18 --- ...WalletConnectConnectionProvider.asset.meta | 8 -- .../Scripts/Connection/ConnectionProvider.cs | 5 - .../Scenes/SampleLogin - Connect Modal.unity | 6 +- 13 files changed, 82 insertions(+), 200 deletions(-) delete mode 100644 Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources/HyperPlayConnectionProvider.asset delete mode 100644 Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources/HyperPlayConnectionProvider.asset.meta delete mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources/Web3AuthConnectionProvider.asset delete mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources/Web3AuthConnectionProvider.asset.meta delete mode 100644 Packages/io.chainsafe.web3-unity/Editor/ReadWriteProvider.cs delete mode 100644 Packages/io.chainsafe.web3-unity/Editor/ReadWriteProvider.cs.meta delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Resources/MetamaskConnectionProvider.asset delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Resources/MetamaskConnectionProvider.asset.meta delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Resources/WalletConnectConnectionProvider.asset delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Resources/WalletConnectConnectionProvider.asset.meta diff --git a/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources/HyperPlayConnectionProvider.asset b/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources/HyperPlayConnectionProvider.asset deleted file mode 100644 index c30bdef28..000000000 --- a/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources/HyperPlayConnectionProvider.asset +++ /dev/null @@ -1,17 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 73b5e9380c5275043b3558f49f807100, type: 3} - m_Name: HyperPlayConnectionProvider - m_EditorClassIdentifier: - k__BackingField: HyperPlay - k__BackingField: {fileID: 8599114313589093787, guid: 71b112e16f898d140935553a4b33ae1f, type: 3} - k__BackingField: 1 diff --git a/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources/HyperPlayConnectionProvider.asset.meta b/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources/HyperPlayConnectionProvider.asset.meta deleted file mode 100644 index 751745b49..000000000 --- a/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources/HyperPlayConnectionProvider.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 70ad5245d5b5895448ba4fd9ad57ea95 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources/Web3AuthConnectionProvider.asset b/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources/Web3AuthConnectionProvider.asset deleted file mode 100644 index b1d9f4ffe..000000000 --- a/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources/Web3AuthConnectionProvider.asset +++ /dev/null @@ -1,35 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6b435f36106e244449abb70cf6f41008, type: 3} - m_Name: Web3AuthConnectionProvider - m_EditorClassIdentifier: - k__BackingField: Web3Auth - k__BackingField: {fileID: 8599114313589093787, guid: 163bbaaeb51883442a20ea7532888a43, type: 3} - k__BackingField: 1 - clientId: BDoIQpmwh4ow7oDMshLsPTj0JHGnS-0ZsB14fMzZ6CnxB0kMJf4o3oWvFWiISuL_p7PzyGx4v7iGHDQQF4lNL-s - redirectUri: torusapp://io.chainsafe.gamingsdk.sdkdemoscene/auth - network: 1 - modalPrefab: {fileID: 1060439634540712661, guid: 42c53f26848d1d54a9ffe18fae333758, type: 3} - enableWalletGui: 1 - web3AuthWalletGUIPrefab: {fileID: 7656622686525558909, guid: b394e6c49b9bd734089cea0293265bd3, type: 3} - walletGuiConfig: - DisplayWalletIcon: 1 - AutoPopUpWalletOnTx: 1 - AutoConfirmTransactions: 0 - WalletIcon: {fileID: 21300000, guid: 55a46a48cd53d834f99fda690cfea4b1, type: 3} - WalletLogo: {fileID: 21300000, guid: ab400fd9b39316240b30631965553264, type: 3} - DisplayFont: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - PrimaryBackgroundColour: {r: 0, g: 0, b: 0, a: 0.7254902} - MenuBackgroundColour: {r: 0, g: 0, b: 0, a: 1} - PrimaryTextColour: {r: 1, g: 1, b: 1, a: 1} - SecondaryTextColour: {r: 0.42745098, g: 0.85882354, b: 0.29411766, a: 1} - BorderButtonColour: {r: 1, g: 1, b: 1, a: 1} diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources/Web3AuthConnectionProvider.asset.meta b/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources/Web3AuthConnectionProvider.asset.meta deleted file mode 100644 index abf411a79..000000000 --- a/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources/Web3AuthConnectionProvider.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5a662f0c96c53db48b29a3aa7ab0f102 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs b/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs index 2a950fcdd..8b1ad2949 100644 --- a/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs +++ b/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs @@ -1,4 +1,7 @@ +using System; using System.Collections.Generic; +using System.IO; +using System.Linq; using ChainSafe.Gaming.UnityPackage.Connection; using Newtonsoft.Json; using UnityEditor; @@ -8,6 +11,8 @@ [CustomEditor(typeof(ConnectionHandler))] public class ConnectionHandlerEditor : Editor { + readonly List _providerTypes = new List(); + public struct Provider { [JsonProperty("name")] @@ -18,23 +23,35 @@ public struct Provider } private bool _foldout; - + + private void OnEnable() + { + AppDomain.CurrentDomain.GetAssemblies().ToList().ForEach(assembly => + { + _providerTypes.AddRange(assembly.GetTypes().Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(ConnectionProvider)))); + }); + } + public override void OnInspectorGUI() { base.OnInspectorGUI(); - var providers = Resources.LoadAll(string.Empty); - _foldout = EditorGUILayout.Foldout(_foldout, "Connection Providers"); if (_foldout) { - List availableProviders = new List(); + EditorGUILayout.BeginVertical("Box"); + // Get provider display name. var providersProperty = serializedObject.FindProperty("providers"); - int arraySize = providersProperty.arraySize; + ConnectionProvider[] allProviders = Resources.LoadAll(string.Empty); + // Get available providers. + List availableProviders = new List(); + + int arraySize = providersProperty.arraySize; + for (int i = 0; i < arraySize; i++) { var providerProperty = providersProperty.GetArrayElementAtIndex(i); @@ -51,46 +68,79 @@ public override void OnInspectorGUI() availableProviders.Add(providerProperty.objectReferenceValue as ConnectionProvider); } - foreach (var provider in providers) + foreach (Type providerType in _providerTypes) { - if (provider == null) + EditorGUILayout.BeginVertical("Box"); + + string providerDisplayName = providerType.Name; + + if (providerDisplayName.Contains(nameof(ConnectionProvider))) { - Debug.LogWarning($"Error loading {provider.Name} Provider."); - - continue; + providerDisplayName = providerDisplayName.Replace(nameof(ConnectionProvider), string.Empty); } - EditorGUI.BeginChangeCheck(); + EditorGUILayout.LabelField(providerDisplayName, EditorStyles.boldLabel); - bool isAvailable = availableProviders.Contains(provider); - - isAvailable = GUILayout.Toggle(isAvailable, provider.Name); + ConnectionProvider provider = allProviders.FirstOrDefault(p => p.GetType() == providerType); - if (EditorGUI.EndChangeCheck()) + if (provider != null) { - if (isAvailable) + bool isAvailable = availableProviders.Contains(provider); + + EditorGUILayout.BeginHorizontal(); + + EditorGUI.BeginChangeCheck(); + + isAvailable = EditorGUILayout.Toggle(isAvailable, GUILayout.MaxWidth(20)); + + if (EditorGUI.EndChangeCheck()) { - providersProperty.InsertArrayElementAtIndex(arraySize); + if (isAvailable) + { + providersProperty.InsertArrayElementAtIndex(providersProperty.arraySize); + + providersProperty.GetArrayElementAtIndex(providersProperty.arraySize - 1).objectReferenceValue = provider; + } - providersProperty.GetArrayElementAtIndex(arraySize).objectReferenceValue = provider; + else + { + int index = availableProviders.IndexOf(provider); + + providersProperty.DeleteArrayElementAtIndex(index); + } + + serializedObject.ApplyModifiedProperties(); } + + EditorGUI.BeginDisabledGroup(true); + + EditorGUILayout.ObjectField(provider, typeof(ConnectionProvider), false); + + EditorGUI.EndDisabledGroup(); + + EditorGUILayout.EndHorizontal(); + } - else + else + { + if (GUILayout.Button("Add Provider", GUILayout.MaxWidth(100))) { - providersProperty.DeleteArrayElementAtIndex(availableProviders.IndexOf(provider)); + ConnectionProvider newProvider = (ConnectionProvider) CreateInstance(providerType); + + AssetDatabase.CreateAsset(newProvider, Path.Combine("Assets", nameof(Resources), $"{providerType.Name}.asset")); + + providersProperty.InsertArrayElementAtIndex(providersProperty.arraySize); + + providersProperty.GetArrayElementAtIndex(providersProperty.arraySize - 1).objectReferenceValue = newProvider; + + serializedObject.ApplyModifiedProperties(); } - - serializedObject.ApplyModifiedProperties(); - - return; } - EditorGUI.BeginDisabledGroup(true); - - EditorGUILayout.ObjectField(provider, typeof(ConnectionProvider), false); - - EditorGUI.EndDisabledGroup(); + EditorGUILayout.EndVertical(); } + + EditorGUILayout.EndVertical(); } } } diff --git a/Packages/io.chainsafe.web3-unity/Editor/ReadWriteProvider.cs b/Packages/io.chainsafe.web3-unity/Editor/ReadWriteProvider.cs deleted file mode 100644 index 7eb46d1a5..000000000 --- a/Packages/io.chainsafe.web3-unity/Editor/ReadWriteProvider.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.IO; -using System.Linq; -using ChainSafe.Gaming.UnityPackage.Connection; -using UnityEditor; -using UnityEngine; - -namespace ChainSafe.GamingSdk.Editor -{ - /// - /// Make connection providers read-write by moving it from packages into Assets/Resources. - /// - [InitializeOnLoad] - public class ReadWriteProvider - { - static ReadWriteProvider() - { - TryMovingConnectionProviders(); - } - - private static void TryMovingConnectionProviders() - { - var providers = Resources.LoadAll(string.Empty) - .Where(p => AssetDatabase.GetAssetPath(p).Contains("io.chainsafe.web3-unity")); - - foreach (var provider in providers) - { - string source = AssetDatabase.GetAssetPath(provider); - - string directory = Path.Combine(Application.dataPath, nameof(Resources)); - - string destination = Path.Combine(directory, Path.GetFileName(source)); - - if (!Directory.Exists(directory)) - { - Directory.CreateDirectory(directory); - } - - File.Move(source, destination); - } - } - } -} \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Editor/ReadWriteProvider.cs.meta b/Packages/io.chainsafe.web3-unity/Editor/ReadWriteProvider.cs.meta deleted file mode 100644 index 375538082..000000000 --- a/Packages/io.chainsafe.web3-unity/Editor/ReadWriteProvider.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 135f06edc29a460fab5cd314e9eb2de9 -timeCreated: 1723447911 \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Resources/MetamaskConnectionProvider.asset b/Packages/io.chainsafe.web3-unity/Runtime/Resources/MetamaskConnectionProvider.asset deleted file mode 100644 index 051c73007..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Resources/MetamaskConnectionProvider.asset +++ /dev/null @@ -1,16 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1b64d00084d2c544aa644a8a6010964d, type: 3} - m_Name: MetamaskConnectionProvider - m_EditorClassIdentifier: - k__BackingField: Metamask - k__BackingField: {fileID: 8599114313589093787, guid: 1200437cb83a29c4fb63faa44cf63f0d, type: 3} diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Resources/MetamaskConnectionProvider.asset.meta b/Packages/io.chainsafe.web3-unity/Runtime/Resources/MetamaskConnectionProvider.asset.meta deleted file mode 100644 index 1c2fc6272..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Resources/MetamaskConnectionProvider.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a15bdaf25319d6f44b48ff2159e4b7fb -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Resources/WalletConnectConnectionProvider.asset b/Packages/io.chainsafe.web3-unity/Runtime/Resources/WalletConnectConnectionProvider.asset deleted file mode 100644 index 6ccc016ab..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Resources/WalletConnectConnectionProvider.asset +++ /dev/null @@ -1,18 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 582efc0fde77aab43a77ee4237ba305a, type: 3} - m_Name: WalletConnectConnectionProvider - m_EditorClassIdentifier: - k__BackingField: WalletConnect - k__BackingField: {fileID: 8599114313589093787, guid: 4591cfadb2bf9824da90ebf4005728a8, type: 3} - k__BackingField: 1 - walletConnectConfig: {fileID: 11400000, guid: fde7db0e37b4a884da1149e9f1999093, type: 2} diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Resources/WalletConnectConnectionProvider.asset.meta b/Packages/io.chainsafe.web3-unity/Runtime/Resources/WalletConnectConnectionProvider.asset.meta deleted file mode 100644 index cbee4d3c6..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Resources/WalletConnectConnectionProvider.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f891ba0f7fed9084982e95c96826fcb7 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/ConnectionProvider.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/ConnectionProvider.cs index 36d06576f..a7abcb327 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/ConnectionProvider.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/ConnectionProvider.cs @@ -17,11 +17,6 @@ public abstract class ConnectionProvider : ScriptableObject, IWeb3BuilderService /// public abstract bool IsAvailable { get; } - /// - /// Name of connection provider. - /// - [field: SerializeField] public string Name { get; private set; } - /// /// Button to connect to the wallet. /// diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.6.0/Web3.Unity Samples/Scenes/SampleLogin - Connect Modal.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.6.0/Web3.Unity Samples/Scenes/SampleLogin - Connect Modal.unity index 2dd0e7a9c..1d9b25cc3 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.6.0/Web3.Unity Samples/Scenes/SampleLogin - Connect Modal.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.6.0/Web3.Unity Samples/Scenes/SampleLogin - Connect Modal.unity @@ -346,10 +346,10 @@ MonoBehaviour: m_EditorClassIdentifier: gelatoApiKey: 7MFQqyGS1Iui_e_MgmFW1BfbFeJ06g8nnL2oUTlIJug_ providers: - - {fileID: 11400000, guid: 835338196b5038d4b9351fadba9dac38, type: 2} - - {fileID: 11400000, guid: e5b50e2ca9fe0504daf70376bceb84ac, type: 2} - - {fileID: 11400000, guid: 0d7bd7ae4b3e79d489bbc54514343f5c, type: 2} - {fileID: 11400000, guid: e56cb66917f860e489d3ed4480b4681c, type: 2} + - {fileID: 11400000, guid: 0d7bd7ae4b3e79d489bbc54514343f5c, type: 2} + - {fileID: 11400000, guid: e5b50e2ca9fe0504daf70376bceb84ac, type: 2} + - {fileID: 11400000, guid: 835338196b5038d4b9351fadba9dac38, type: 2} --- !u!114 &1658652865 MonoBehaviour: m_ObjectHideFlags: 0 From 45995e77fc12ddc8c98ddb042bc067771e16d265 Mon Sep 17 00:00:00 2001 From: rob1997 Date: Wed, 28 Aug 2024 01:05:08 +0300 Subject: [PATCH 2/5] inline editors for connection providers --- .../Editor/ConnectionHandlerEditor.cs | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs b/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs index 8b1ad2949..21c8d21e6 100644 --- a/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs +++ b/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs @@ -11,8 +11,12 @@ [CustomEditor(typeof(ConnectionHandler))] public class ConnectionHandlerEditor : Editor { - readonly List _providerTypes = new List(); + private readonly List _providerTypes = new List(); + private Dictionary _editors = new Dictionary(); + + private Dictionary _editorFoldouts = new Dictionary(); + public struct Provider { [JsonProperty("name")] @@ -30,6 +34,10 @@ private void OnEnable() { _providerTypes.AddRange(assembly.GetTypes().Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(ConnectionProvider)))); }); + + _editors = _providerTypes.ToDictionary(t => t, t => default(Editor)); + + _editorFoldouts = _providerTypes.ToDictionary(t => t, t => false); } public override void OnInspectorGUI() @@ -40,7 +48,7 @@ public override void OnInspectorGUI() if (_foldout) { - EditorGUILayout.BeginVertical("Box"); + EditorGUILayout.BeginVertical(); // Get provider display name. var providersProperty = serializedObject.FindProperty("providers"); @@ -70,17 +78,21 @@ public override void OnInspectorGUI() foreach (Type providerType in _providerTypes) { - EditorGUILayout.BeginVertical("Box"); - + EditorGUILayout.BeginVertical(GUI.skin.box); + string providerDisplayName = providerType.Name; if (providerDisplayName.Contains(nameof(ConnectionProvider))) { providerDisplayName = providerDisplayName.Replace(nameof(ConnectionProvider), string.Empty); } + + EditorGUI.indentLevel++; - EditorGUILayout.LabelField(providerDisplayName, EditorStyles.boldLabel); + _editorFoldouts[providerType] = EditorGUILayout.Foldout(_editorFoldouts[providerType], providerDisplayName); + EditorGUI.indentLevel--; + ConnectionProvider provider = allProviders.FirstOrDefault(p => p.GetType() == providerType); if (provider != null) @@ -113,12 +125,30 @@ public override void OnInspectorGUI() } EditorGUI.BeginDisabledGroup(true); - + EditorGUILayout.ObjectField(provider, typeof(ConnectionProvider), false); EditorGUI.EndDisabledGroup(); EditorGUILayout.EndHorizontal(); + + if (_editorFoldouts[providerType]) + { + Editor editor = _editors[providerType]; + + if (!editor) + { + CreateCachedEditor(provider, null, ref editor); + + _editors[providerType] = editor; + } + + EditorGUILayout.BeginVertical(GUI.skin.box); + + editor.OnInspectorGUI(); + + EditorGUILayout.EndVertical(); + } } else From 33749e5a461c16ad08dd8cf14ad367c3ba4372d6 Mon Sep 17 00:00:00 2001 From: rob1997 Date: Wed, 28 Aug 2024 01:08:52 +0300 Subject: [PATCH 3/5] small improvement for inline editor foldout --- .../Editor/ConnectionHandlerEditor.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs b/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs index 21c8d21e6..585946730 100644 --- a/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs +++ b/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs @@ -87,16 +87,16 @@ public override void OnInspectorGUI() providerDisplayName = providerDisplayName.Replace(nameof(ConnectionProvider), string.Empty); } - EditorGUI.indentLevel++; - - _editorFoldouts[providerType] = EditorGUILayout.Foldout(_editorFoldouts[providerType], providerDisplayName); - - EditorGUI.indentLevel--; - ConnectionProvider provider = allProviders.FirstOrDefault(p => p.GetType() == providerType); - + if (provider != null) { + EditorGUI.indentLevel++; + + _editorFoldouts[providerType] = EditorGUILayout.Foldout(_editorFoldouts[providerType], providerDisplayName); + + EditorGUI.indentLevel--; + bool isAvailable = availableProviders.Contains(provider); EditorGUILayout.BeginHorizontal(); @@ -153,6 +153,8 @@ public override void OnInspectorGUI() else { + EditorGUILayout.LabelField(providerDisplayName); + if (GUILayout.Button("Add Provider", GUILayout.MaxWidth(100))) { ConnectionProvider newProvider = (ConnectionProvider) CreateInstance(providerType); From 10e17fe0d231d7aa552804fa1a3037a60a12e889 Mon Sep 17 00:00:00 2001 From: rob1997 Date: Thu, 29 Aug 2024 14:13:51 +0300 Subject: [PATCH 4/5] added default asset value custom attribute for adding default values to asset references --- .../Runtime/Resources.meta | 8 ------ .../Scripts/HyperPlayConnectionProvider.cs | 4 +++ .../Runtime/Resources.meta | 8 ------ .../WalletGUI/Scripts/Web3AuthWalletGUI.cs | 19 ++++++++----- .../Runtime/Web3AuthConnectionProvider.cs | 12 ++++++-- .../Editor/ConnectionHandlerEditor.cs | 21 +++++++++----- .../Editor/DefaultAssetValuePropertyDrawer.cs | 28 +++++++++++++++++++ .../DefaultAssetValuePropertyDrawer.cs.meta | 11 ++++++++ .../Scripts/Connection/ConnectionProvider.cs | 2 +- .../Connection/MetamaskConnectionProvider.cs | 6 +++- .../RestorableConnectionProvider.cs | 2 +- .../WalletConnectConnectionProvider.cs | 4 +++ .../Scripts/DefaultAssetValueAttribute.cs | 16 +++++++++++ .../DefaultAssetValueAttribute.cs.meta | 11 ++++++++ 14 files changed, 117 insertions(+), 35 deletions(-) delete mode 100644 Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources.meta delete mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources.meta create mode 100644 Packages/io.chainsafe.web3-unity/Editor/DefaultAssetValuePropertyDrawer.cs create mode 100644 Packages/io.chainsafe.web3-unity/Editor/DefaultAssetValuePropertyDrawer.cs.meta create mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/DefaultAssetValueAttribute.cs create mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/DefaultAssetValueAttribute.cs.meta diff --git a/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources.meta b/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources.meta deleted file mode 100644 index fa5da854b..000000000 --- a/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Resources.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0a26dcfb4051398409745656f6a3a2cc -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Scripts/HyperPlayConnectionProvider.cs b/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Scripts/HyperPlayConnectionProvider.cs index 6362bb5c5..59508f04b 100644 --- a/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Scripts/HyperPlayConnectionProvider.cs +++ b/Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Scripts/HyperPlayConnectionProvider.cs @@ -5,6 +5,7 @@ using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Evm.Wallet; using UnityEngine; +using UnityEngine.UI; namespace ChainSafe.Gaming.HyperPlay { @@ -14,6 +15,9 @@ namespace ChainSafe.Gaming.HyperPlay [CreateAssetMenu(menuName = "ChainSafe/Connection Provider/HyperPlay", fileName = nameof(HyperPlayConnectionProvider))] public class HyperPlayConnectionProvider : RestorableConnectionProvider { + [field: SerializeField, DefaultAssetValue("Packages/io.chainsafe.web3-unity.hyperplay/Runtime/Prefabs/HyperPlayRow.prefab")] + public override Button ConnectButtonRow { get; protected set; } + public override bool IsAvailable => Application.isEditor || !Application.isMobilePlatform; private bool _storedSessionAvailable; diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources.meta b/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources.meta deleted file mode 100644 index eb97e2042..000000000 --- a/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Resources.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3b7a427c677a5a7489abfb303571409b -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Runtime/WalletGUI/Scripts/Web3AuthWalletGUI.cs b/Packages/io.chainsafe.web3-unity.web3auth/Runtime/WalletGUI/Scripts/Web3AuthWalletGUI.cs index 7060df749..f1c529972 100644 --- a/Packages/io.chainsafe.web3-unity.web3auth/Runtime/WalletGUI/Scripts/Web3AuthWalletGUI.cs +++ b/Packages/io.chainsafe.web3-unity.web3auth/Runtime/WalletGUI/Scripts/Web3AuthWalletGUI.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using ChainSafe.Gaming; using ChainSafe.Gaming.UnityPackage; using ChainSafe.GamingSdk.Web3Auth; using TMPro; @@ -150,17 +151,21 @@ private void SetButtonsAndLines() [Serializable] public class Web3AuthWalletConfig { - public bool DisplayWalletIcon; - public bool AutoPopUpWalletOnTx; + public bool DisplayWalletIcon = true; + public bool AutoPopUpWalletOnTx = true; public bool AutoConfirmTransactions; + [DefaultAssetValue("Packages/io.chainsafe.web3-unity.web3auth/Runtime/Sprites/OpenWalletIcon.png")] public Sprite WalletIcon; + [DefaultAssetValue("Packages/io.chainsafe.web3-unity.web3auth/Runtime/Sprites/Logo.png")] public Sprite WalletLogo; + [DefaultAssetValue("Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset")] public TMP_FontAsset DisplayFont; - public Color PrimaryBackgroundColour; - public Color MenuBackgroundColour; - public Color PrimaryTextColour; - public Color SecondaryTextColour; - public Color BorderButtonColour; + + public Color PrimaryBackgroundColour = new Color(0f, 0f, 0f, .725f); + public Color MenuBackgroundColour = Color.black; + public Color PrimaryTextColour = Color.white; + public Color SecondaryTextColour = new Color(.4f, .85f, .3f); + public Color BorderButtonColour = Color.white; } #endregion diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Web3AuthConnectionProvider.cs b/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Web3AuthConnectionProvider.cs index b04b9c09d..4fc354370 100644 --- a/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Web3AuthConnectionProvider.cs +++ b/Packages/io.chainsafe.web3-unity.web3auth/Runtime/Web3AuthConnectionProvider.cs @@ -13,6 +13,7 @@ using Microsoft.Extensions.DependencyInjection; using Nethereum.Hex.HexTypes; using UnityEngine; +using UnityEngine.UI; using Network = Web3Auth.Network; /// @@ -21,18 +22,25 @@ [CreateAssetMenu(menuName = "ChainSafe/Connection Provider/Web3Auth", fileName = nameof(Web3AuthConnectionProvider))] public class Web3AuthConnectionProvider : RestorableConnectionProvider, ILogoutHandler, IWeb3InitializedHandler { + [field: SerializeField, DefaultAssetValue("Packages/io.chainsafe.web3-unity.web3auth/Runtime/Prefabs/Web3AuthRow.prefab")] + public override Button ConnectButtonRow { get; protected set; } + [SerializeField] private string clientId; [SerializeField] private string redirectUri; [SerializeField] private Network network; [Space] - [SerializeField] private GameObject modalPrefab; + [SerializeField, DefaultAssetValue("Packages/io.chainsafe.web3-unity.web3auth/Runtime/Prefabs/Web3Auth.prefab")] + private GameObject modalPrefab; [Space] [SerializeField] private bool enableWalletGui; - [SerializeField] private Web3AuthWalletGUI web3AuthWalletGUIPrefab; + + [SerializeField, DefaultAssetValue("Packages/io.chainsafe.web3-unity.web3auth/Runtime/WalletGUI/Prefabs/Web3AuthWalletGUI.prefab")] + private Web3AuthWalletGUI web3AuthWalletGUIPrefab; + [SerializeField] private Web3AuthWalletGUI.Web3AuthWalletConfig walletGuiConfig; private Web3AuthModal _modal; diff --git a/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs b/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs index 585946730..97551ebf9 100644 --- a/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs +++ b/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs @@ -17,6 +17,10 @@ public class ConnectionHandlerEditor : Editor private Dictionary _editorFoldouts = new Dictionary(); + private ConnectionProvider[] _allProviders = Array.Empty(); + + private readonly List _availableProviders = new List(); + public struct Provider { [JsonProperty("name")] @@ -38,6 +42,8 @@ private void OnEnable() _editors = _providerTypes.ToDictionary(t => t, t => default(Editor)); _editorFoldouts = _providerTypes.ToDictionary(t => t, t => false); + + _allProviders = Resources.LoadAll(string.Empty); } public override void OnInspectorGUI() @@ -53,10 +59,8 @@ public override void OnInspectorGUI() // Get provider display name. var providersProperty = serializedObject.FindProperty("providers"); - ConnectionProvider[] allProviders = Resources.LoadAll(string.Empty); - // Get available providers. - List availableProviders = new List(); + _availableProviders.Clear(); int arraySize = providersProperty.arraySize; @@ -73,7 +77,7 @@ public override void OnInspectorGUI() return; } - availableProviders.Add(providerProperty.objectReferenceValue as ConnectionProvider); + _availableProviders.Add(providerProperty.objectReferenceValue as ConnectionProvider); } foreach (Type providerType in _providerTypes) @@ -87,7 +91,7 @@ public override void OnInspectorGUI() providerDisplayName = providerDisplayName.Replace(nameof(ConnectionProvider), string.Empty); } - ConnectionProvider provider = allProviders.FirstOrDefault(p => p.GetType() == providerType); + ConnectionProvider provider = _allProviders.FirstOrDefault(p => p.GetType() == providerType); if (provider != null) { @@ -97,7 +101,7 @@ public override void OnInspectorGUI() EditorGUI.indentLevel--; - bool isAvailable = availableProviders.Contains(provider); + bool isAvailable = _availableProviders.Contains(provider); EditorGUILayout.BeginHorizontal(); @@ -116,7 +120,7 @@ public override void OnInspectorGUI() else { - int index = availableProviders.IndexOf(provider); + int index = _availableProviders.IndexOf(provider); providersProperty.DeleteArrayElementAtIndex(index); } @@ -161,6 +165,9 @@ public override void OnInspectorGUI() AssetDatabase.CreateAsset(newProvider, Path.Combine("Assets", nameof(Resources), $"{providerType.Name}.asset")); + //Update the list of providers. + _allProviders = Resources.LoadAll(string.Empty); + providersProperty.InsertArrayElementAtIndex(providersProperty.arraySize); providersProperty.GetArrayElementAtIndex(providersProperty.arraySize - 1).objectReferenceValue = newProvider; diff --git a/Packages/io.chainsafe.web3-unity/Editor/DefaultAssetValuePropertyDrawer.cs b/Packages/io.chainsafe.web3-unity/Editor/DefaultAssetValuePropertyDrawer.cs new file mode 100644 index 000000000..14261f422 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Editor/DefaultAssetValuePropertyDrawer.cs @@ -0,0 +1,28 @@ +using ChainSafe.Gaming; +using UnityEditor; +using UnityEngine; + +[CustomPropertyDrawer(typeof(DefaultAssetValueAttribute))] +public class DefaultAssetValuePropertyDrawer : PropertyDrawer +{ + private DefaultAssetValueAttribute _attribute; + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + EditorGUI.PropertyField(position, property, label, true); + + if (property.propertyType != SerializedPropertyType.ObjectReference || property.objectReferenceValue != null) + { + return; + } + + _attribute ??= (DefaultAssetValueAttribute)attribute; + + var asset = AssetDatabase.LoadAssetAtPath(_attribute.Path, fieldInfo.FieldType); + + if (asset != null) + { + property.objectReferenceValue = asset; + } + } +} diff --git a/Packages/io.chainsafe.web3-unity/Editor/DefaultAssetValuePropertyDrawer.cs.meta b/Packages/io.chainsafe.web3-unity/Editor/DefaultAssetValuePropertyDrawer.cs.meta new file mode 100644 index 000000000..ad3d86483 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Editor/DefaultAssetValuePropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ecccce350df11fa48bfde1fac6483da5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/ConnectionProvider.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/ConnectionProvider.cs index a7abcb327..1977b7486 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/ConnectionProvider.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/ConnectionProvider.cs @@ -20,7 +20,7 @@ public abstract class ConnectionProvider : ScriptableObject, IWeb3BuilderService /// /// Button to connect to the wallet. /// - [field: SerializeField] public Button ConnectButtonRow { get; private set; } + public abstract Button ConnectButtonRow { get; protected set; } /// /// Initialize Connection provider. diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/MetamaskConnectionProvider.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/MetamaskConnectionProvider.cs index 9de763bb0..0315a6997 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/MetamaskConnectionProvider.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/MetamaskConnectionProvider.cs @@ -5,15 +5,19 @@ #endif using ChainSafe.Gaming.Web3.Build; using UnityEngine; +using UnityEngine.UI; namespace ChainSafe.Gaming.UnityPackage.Connection { /// - /// Metamask connection provider used for connecting to a Metamask wallet. + /// Metamask's connection provider used for connecting to a Metamask wallet. /// [CreateAssetMenu(menuName = "ChainSafe/Connection Provider/Metamask", fileName = nameof(MetamaskConnectionProvider))] public class MetamaskConnectionProvider : ConnectionProvider { + [field: SerializeField, DefaultAssetValue("Packages/io.chainsafe.web3-unity/Runtime/Prefabs/MetamaskRow.prefab")] + public override Button ConnectButtonRow { get; protected set; } + public override bool IsAvailable => Application.platform == RuntimePlatform.WebGLPlayer && Application.isEditor == false; public override Task Initialize() diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/RestorableConnectionProvider.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/RestorableConnectionProvider.cs index 4e45e8022..5c87f5c9f 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/RestorableConnectionProvider.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/RestorableConnectionProvider.cs @@ -16,7 +16,7 @@ namespace ChainSafe.Gaming public abstract class RestorableConnectionProvider : ConnectionProvider { [field: SerializeField, Tooltip("Should this connection provider remember a previous session.")] - public bool RememberSession { get; private set; } + public bool RememberSession { get; private set; } = true; public override Web3Builder ConfigureServices(Web3Builder web3Builder) { diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/WalletConnectConnectionProvider.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/WalletConnectConnectionProvider.cs index 8b3ecebde..8d96ac006 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/WalletConnectConnectionProvider.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Connection/WalletConnectConnectionProvider.cs @@ -3,6 +3,7 @@ using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Evm.Wallet; using UnityEngine; +using UnityEngine.UI; namespace ChainSafe.Gaming.UnityPackage.Connection { @@ -12,6 +13,9 @@ namespace ChainSafe.Gaming.UnityPackage.Connection [CreateAssetMenu(menuName = "ChainSafe/Connection Provider/Wallet Connect", fileName = nameof(WalletConnectConnectionProvider))] public class WalletConnectConnectionProvider : RestorableConnectionProvider { + [field: SerializeField, DefaultAssetValue("Packages/io.chainsafe.web3-unity/Runtime/Prefabs/WalletConnectRow.prefab")] + public override Button ConnectButtonRow { get; protected set; } + [SerializeField] private WalletConnectConfigSO walletConnectConfig; private bool _storedSessionAvailable; diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/DefaultAssetValueAttribute.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/DefaultAssetValueAttribute.cs new file mode 100644 index 000000000..4b3a17fc3 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/DefaultAssetValueAttribute.cs @@ -0,0 +1,16 @@ +using System; +using UnityEngine; + +namespace ChainSafe.Gaming +{ + [AttributeUsage(AttributeTargets.Field)] + public class DefaultAssetValueAttribute : PropertyAttribute + { + public string Path { get; private set; } + + public DefaultAssetValueAttribute(string path) + { + Path = path; + } + } +} diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/DefaultAssetValueAttribute.cs.meta b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/DefaultAssetValueAttribute.cs.meta new file mode 100644 index 000000000..fc8efd4b1 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/DefaultAssetValueAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff265dbbaffaf2d408f675a322d21996 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From f0741e3507ca7511346d88324d9ab497fa7bdd68 Mon Sep 17 00:00:00 2001 From: rob1997 Date: Thu, 29 Aug 2024 15:20:35 +0300 Subject: [PATCH 5/5] more optimizations --- .../Editor/ConnectionHandlerEditor.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs b/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs index 97551ebf9..d3c3a338b 100644 --- a/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs +++ b/Packages/io.chainsafe.web3-unity/Editor/ConnectionHandlerEditor.cs @@ -17,7 +17,7 @@ public class ConnectionHandlerEditor : Editor private Dictionary _editorFoldouts = new Dictionary(); - private ConnectionProvider[] _allProviders = Array.Empty(); + private List _allProviders = new List(); private readonly List _availableProviders = new List(); @@ -43,7 +43,7 @@ private void OnEnable() _editorFoldouts = _providerTypes.ToDictionary(t => t, t => false); - _allProviders = Resources.LoadAll(string.Empty); + _allProviders = Resources.LoadAll(string.Empty).ToList(); } public override void OnInspectorGUI() @@ -59,6 +59,8 @@ public override void OnInspectorGUI() // Get provider display name. var providersProperty = serializedObject.FindProperty("providers"); + _allProviders = _allProviders.Where(p => p != null).ToList(); + // Get available providers. _availableProviders.Clear(); @@ -166,7 +168,7 @@ public override void OnInspectorGUI() AssetDatabase.CreateAsset(newProvider, Path.Combine("Assets", nameof(Resources), $"{providerType.Name}.asset")); //Update the list of providers. - _allProviders = Resources.LoadAll(string.Empty); + _allProviders.Add(newProvider); providersProperty.InsertArrayElementAtIndex(providersProperty.arraySize);