From aede77d0fe96e4c0c803bdd9df2678131b64dae2 Mon Sep 17 00:00:00 2001 From: jilfranco-unity Date: Tue, 14 Feb 2023 17:25:47 -0500 Subject: [PATCH 1/2] A new branch for the UI work post project rename to avoid a ton of merge issues --- .../Assets/Prefabs/UI.prefab | 264 +++++++++++++++++ .../Assets/Prefabs/UI.prefab.meta | 7 + .../Assets/Scripts/UI.meta | 8 + .../Assets/Scripts/UI/IPMenuUI.cs | 154 ++++++++++ .../Assets/Scripts/UI/IPMenuUI.cs.meta | 11 + .../Assets/Scripts/UI/InGameUI.cs | 265 ++++++++++++++++++ .../Assets/Scripts/UI/InGameUI.cs.meta | 11 + .../Assets/UI.meta | 8 + .../Assets/UI/PanelSettings.asset | 37 +++ .../Assets/UI/PanelSettings.asset.meta | 8 + .../Assets/UI/Template_ConnectionUI.uxml | 15 + .../Assets/UI/Template_ConnectionUI.uxml.meta | 10 + .../Assets/UI/Template_PrefabRow.uxml | 7 + .../Assets/UI/Template_PrefabRow.uxml.meta | 10 + .../Assets/UI/UI_ConnectionType.uxml | 10 + .../Assets/UI/UI_ConnectionType.uxml.meta | 10 + .../Assets/UI/UI_ConnectionUIHolder.uxml | 7 + .../Assets/UI/UI_ConnectionUIHolder.uxml.meta | 10 + .../Assets/UI/UI_IPMenu.uxml | 23 ++ .../Assets/UI/UI_IPMenu.uxml.meta | 10 + .../Assets/UI/UI_InGameUI.uxml | 44 +++ .../Assets/UI/UI_InGameUI.uxml.meta | 10 + .../Assets/UI/USS_Clients.uss | 44 +++ .../Assets/UI/USS_Clients.uss.meta | 11 + .../Assets/UI/USS_StyleSheet.uss | 184 ++++++++++++ .../Assets/UI/USS_StyleSheet.uss.meta | 11 + .../Assets/UI/UnityDefaultRuntimeTheme.tss | 4 + .../UI/UnityDefaultRuntimeTheme.tss.meta | 11 + 28 files changed, 1204 insertions(+) create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/Prefabs/UI.prefab create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/Prefabs/UI.prefab.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI/IPMenuUI.cs create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI/IPMenuUI.cs.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI/InGameUI.cs create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI/InGameUI.cs.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/PanelSettings.asset create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/PanelSettings.asset.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/Template_ConnectionUI.uxml create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/Template_ConnectionUI.uxml.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/Template_PrefabRow.uxml create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/Template_PrefabRow.uxml.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/UI_ConnectionType.uxml create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/UI_ConnectionType.uxml.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/UI_ConnectionUIHolder.uxml create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/UI_ConnectionUIHolder.uxml.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/UI_IPMenu.uxml create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/UI_IPMenu.uxml.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/UI_InGameUI.uxml create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/UI_InGameUI.uxml.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/USS_Clients.uss create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/USS_Clients.uss.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/USS_StyleSheet.uss create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/USS_StyleSheet.uss.meta create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/UnityDefaultRuntimeTheme.tss create mode 100644 Basic/DynamicAddressablesNetworkPrefabs/Assets/UI/UnityDefaultRuntimeTheme.tss.meta diff --git a/Basic/DynamicAddressablesNetworkPrefabs/Assets/Prefabs/UI.prefab b/Basic/DynamicAddressablesNetworkPrefabs/Assets/Prefabs/UI.prefab new file mode 100644 index 000000000..c2a15eef9 --- /dev/null +++ b/Basic/DynamicAddressablesNetworkPrefabs/Assets/Prefabs/UI.prefab @@ -0,0 +1,264 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &4061078000728451377 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4484396944538767948} + - component: {fileID: 1868617790277435607} + m_Layer: 0 + m_Name: ConnectionType + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4484396944538767948 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4061078000728451377} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5916229021262027593} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1868617790277435607 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4061078000728451377} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_PanelSettings: {fileID: 11400000, guid: c023b7db6d50c9e45b6a080ccc23874f, type: 2} + m_ParentUI: {fileID: 0} + sourceAsset: {fileID: 9197481963319205126, guid: 720681dc71c9789408a1fab0f21e0f93, type: 3} + m_SortingOrder: 1 +--- !u!1 &5916229021262027592 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5916229021262027593} + - component: {fileID: 1216736892} + - component: {fileID: 1085470603439750153} + m_Layer: 0 + m_Name: UI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5916229021262027593 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5916229021262027592} + 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_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5916229021887624318} + - {fileID: 5916229022476518943} + - {fileID: 5916229022061089010} + - {fileID: 4484396944538767948} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1216736892 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5916229021262027592} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6c1ed03cc3b245b4ca88b95ef9bea14e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ConnectionsUIDoc: {fileID: 5916229021887624317} + m_InGameUIDoc: {fileID: 5916229022476518942} + m_ConnectionTemplatePrefab: {fileID: 9197481963319205126, guid: 559dc6bda8f869d4b828b29a963e1e89, type: 3} + m_RowTemplatePrefab: {fileID: 9197481963319205126, guid: e61c0a6ba4a28444da358d17a074172f, type: 3} + m_ShowLoadAllAsyncButton: 1 + m_ShowTrySpawnSynchronouslyButton: 1 + m_ShowSpawnUsingVisibilityButton: 1 +--- !u!114 &1085470603439750153 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5916229021262027592} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ada9189cf150a904bb8090bcb9e80a6c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IPMenuUIDocument: {fileID: 5916229022061089011} + m_ConnectionTypeUIDocument: {fileID: 1868617790277435607} +--- !u!1 &5916229021887624316 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5916229021887624318} + - component: {fileID: 5916229021887624317} + m_Layer: 0 + m_Name: Connections + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5916229021887624318 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5916229021887624316} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5916229021262027593} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5916229021887624317 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5916229021887624316} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_PanelSettings: {fileID: 11400000, guid: c023b7db6d50c9e45b6a080ccc23874f, type: 2} + m_ParentUI: {fileID: 0} + sourceAsset: {fileID: 9197481963319205126, guid: aa2f8502baa527549a2a096d7db99736, type: 3} + m_SortingOrder: 1 +--- !u!1 &5916229022061089009 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5916229022061089010} + - component: {fileID: 5916229022061089011} + m_Layer: 0 + m_Name: IPMenu + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5916229022061089010 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5916229022061089009} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5916229021262027593} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5916229022061089011 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5916229022061089009} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_PanelSettings: {fileID: 11400000, guid: c023b7db6d50c9e45b6a080ccc23874f, type: 2} + m_ParentUI: {fileID: 0} + sourceAsset: {fileID: 9197481963319205126, guid: f34559e6fa10dd7498466b9da1869b6d, type: 3} + m_SortingOrder: 0 +--- !u!1 &5916229022476518941 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5916229022476518943} + - component: {fileID: 5916229022476518942} + m_Layer: 0 + m_Name: InGameUI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5916229022476518943 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5916229022476518941} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5916229021262027593} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5916229022476518942 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5916229022476518941} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_PanelSettings: {fileID: 11400000, guid: c023b7db6d50c9e45b6a080ccc23874f, type: 2} + m_ParentUI: {fileID: 0} + sourceAsset: {fileID: 9197481963319205126, guid: 16051812210b8ab4bb7c93577ca1410b, type: 3} + m_SortingOrder: 1 diff --git a/Basic/DynamicAddressablesNetworkPrefabs/Assets/Prefabs/UI.prefab.meta b/Basic/DynamicAddressablesNetworkPrefabs/Assets/Prefabs/UI.prefab.meta new file mode 100644 index 000000000..a6a1ff2a3 --- /dev/null +++ b/Basic/DynamicAddressablesNetworkPrefabs/Assets/Prefabs/UI.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: efffbf0d4e88eee4c8782180ff1ce1a2 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI.meta b/Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI.meta new file mode 100644 index 000000000..17a573621 --- /dev/null +++ b/Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 311dfd29d74e0644693df66b0db992d2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI/IPMenuUI.cs b/Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI/IPMenuUI.cs new file mode 100644 index 000000000..d119e2aad --- /dev/null +++ b/Basic/DynamicAddressablesNetworkPrefabs/Assets/Scripts/UI/IPMenuUI.cs @@ -0,0 +1,154 @@ +using System; +using System.Text.RegularExpressions; +using UnityEngine; +using UnityEngine.UIElements; + +namespace Game.UI +{ + public class IPMenuUI : MonoBehaviour + { + // UI Documents + [SerializeField] + UIDocument m_IPMenuUIDocument; + [SerializeField] + UIDocument m_ConnectionTypeUIDocument; + + // UI Roots + VisualElement m_IPMenuUIRoot; + VisualElement m_ConnectionTypeUIRoot; + + // UI Elements + TextField m_IPInputField; + TextField m_PortInputField; + Button m_ButtonHost; + Button m_ButtonServer; + Button m_ButtonClient; + Button m_ButtonDisconnect; + Label m_ConnectionTypeLabel; + + public string IpAddress { get; private set; } = "127.0.0.1"; + public ushort Port { get; private set; } = 9998; + + void Awake() + { + SetupIPInputUI(); + + // register UI elements to methods using callbacks for when they're clicked + m_ButtonHost.clickable.clicked += HostStarted; + m_ButtonServer.clickable.clicked += ServerStarted; + m_ButtonClient.clickable.clicked += ClientStarted; + m_ButtonDisconnect.clickable.clicked += OnShutdownRequested; + m_IPInputField.RegisterValueChangedCallback(OnIpAddressChanged); + m_PortInputField.RegisterValueChangedCallback(OnPortChanged); + } + + void OnDestroy() + { + // un-register UI elements from methods using callbacks for when they're clicked + m_ButtonHost.clickable.clicked -= HostStarted; + m_ButtonServer.clickable.clicked -= ServerStarted; + m_ButtonClient.clickable.clicked -= ClientStarted; + m_ButtonDisconnect.clickable.clicked -= OnShutdownRequested; + m_IPInputField.UnregisterValueChangedCallback(OnIpAddressChanged); + m_PortInputField.UnregisterValueChangedCallback(OnPortChanged); + } + + void Start() + { + ResetUI(); + m_IPInputField.value = IpAddress; + m_PortInputField.value = Port.ToString(); + } + + void HostStarted() + { + SwitchToInGameUI("Host"); + } + + void ClientStarted() + { + SwitchToInGameUI("Client"); + } + + void ServerStarted() + { + SwitchToInGameUI("Server"); + } + + void SwitchToInGameUI(string connectionType) + { + SetUIElementVisibility(m_IPMenuUIRoot, false); + SetUIElementVisibility(m_ConnectionTypeUIRoot, true); + m_ConnectionTypeLabel.text = connectionType; + } + + void OnShutdownRequested() + { + ResetUI(); + } + + void OnClientDisconnect(ulong clientId) + { + ResetUI(); + } + + void ResetUI() + { + SetUIElementVisibility(m_IPMenuUIRoot, true); + SetUIElementVisibility(m_ConnectionTypeUIRoot, false); + } + + void OnIpAddressChanged(ChangeEvent ipAddress) + { + SanitizeAndSetIpAddress(ipAddress.newValue); + } + + void OnPortChanged(ChangeEvent port) + { + SanitizeAndSetPort(port.newValue); + } + + void SanitizeAndSetPort(string portToSanitize) + { + var sanitizedPort = Sanitize(portToSanitize); + m_PortInputField.value = sanitizedPort; + ushort.TryParse(sanitizedPort, out var parsedPort); + Port = parsedPort; + m_PortInputField.value = Port.ToString(); + } + + void SanitizeAndSetIpAddress(string ipAddressToSanitize) + { + IpAddress = Sanitize(ipAddressToSanitize); + m_IPInputField.value = IpAddress; + } + + /// + /// Sanitize user port InputField box allowing only alphanumerics and '.' + /// + /// string to sanitize. + /// Sanitized text string. + string Sanitize(string stringToBeSanitized) + { + return Regex.Replace(stringToBeSanitized, "[^A-Za-z0-9.]", ""); + } + + void SetUIElementVisibility(VisualElement element, bool isVisible) + { + element.style.display = isVisible ? DisplayStyle.Flex : DisplayStyle.None; + } + + void SetupIPInputUI() + { + m_IPMenuUIRoot = m_IPMenuUIDocument.rootVisualElement; + m_ConnectionTypeUIRoot = m_ConnectionTypeUIDocument.rootVisualElement; + m_IPInputField = m_IPMenuUIRoot.Q("IPAddressField"); + m_PortInputField = m_IPMenuUIRoot.Q("PortField"); + m_ButtonHost = m_IPMenuUIRoot.Q