diff --git a/Networking/.gitignore b/Networking/.gitignore
new file mode 100644
index 0000000..07da593
--- /dev/null
+++ b/Networking/.gitignore
@@ -0,0 +1,71 @@
+# This .gitignore file should be placed at the root of your Unity project directory
+#
+# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore
+#
+/[Ll]ibrary/
+/[Tt]emp/
+/[Oo]bj/
+/[Bb]uild/
+/[Bb]uilds/
+/[Ll]ogs/
+/[Uu]ser[Ss]ettings/
+
+# MemoryCaptures can get excessive in size.
+# They also could contain extremely sensitive data
+/[Mm]emoryCaptures/
+
+# Asset meta data should only be ignored when the corresponding asset is also ignored
+!/[Aa]ssets/**/*.meta
+
+# Uncomment this line if you wish to ignore the asset store tools plugin
+# /[Aa]ssets/AssetStoreTools*
+
+# Autogenerated Jetbrains Rider plugin
+/[Aa]ssets/Plugins/Editor/JetBrains*
+
+# Visual Studio cache directory
+.vs/
+
+# Gradle cache directory
+.gradle/
+
+# Autogenerated VS/MD/Consulo solution and project files
+ExportedObj/
+.consulo/
+*.csproj
+*.unityproj
+*.sln
+*.suo
+*.tmp
+*.user
+*.userprefs
+*.pidb
+*.booproj
+*.svd
+*.pdb
+*.mdb
+*.opendb
+*.VC.db
+
+# Unity3D generated meta files
+*.pidb.meta
+*.pdb.meta
+*.mdb.meta
+
+# Unity3D generated file on crash reports
+sysinfo.txt
+
+# Builds
+*.apk
+*.aab
+*.unitypackage
+
+# Crashlytics generated file
+crashlytics-build.properties
+
+# Packed Addressables
+/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*
+
+# Temporary auto-generated Android Assets
+/[Aa]ssets/[Ss]treamingAssets/aa.meta
+/[Aa]ssets/[Ss]treamingAssets/aa/*
\ No newline at end of file
diff --git a/Networking/.idea/.idea.Networking/.idea/.gitignore b/Networking/.idea/.idea.Networking/.idea/.gitignore
new file mode 100644
index 0000000..223312c
--- /dev/null
+++ b/Networking/.idea/.idea.Networking/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Rider ignored files
+/projectSettingsUpdater.xml
+/contentModel.xml
+/.idea.Networking.iml
+/modules.xml
diff --git a/Networking/.idea/.idea.Networking/.idea/encodings.xml b/Networking/.idea/.idea.Networking/.idea/encodings.xml
new file mode 100644
index 0000000..df87cf9
--- /dev/null
+++ b/Networking/.idea/.idea.Networking/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Networking/.idea/.idea.Networking/.idea/indexLayout.xml b/Networking/.idea/.idea.Networking/.idea/indexLayout.xml
new file mode 100644
index 0000000..7b08163
--- /dev/null
+++ b/Networking/.idea/.idea.Networking/.idea/indexLayout.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Networking/.idea/.idea.Networking/.idea/vcs.xml b/Networking/.idea/.idea.Networking/.idea/vcs.xml
new file mode 100644
index 0000000..62bd7a0
--- /dev/null
+++ b/Networking/.idea/.idea.Networking/.idea/vcs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Networking/Assets/Blocks.meta b/Networking/Assets/Blocks.meta
new file mode 100644
index 0000000..9bac560
--- /dev/null
+++ b/Networking/Assets/Blocks.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8c498d857ecdd4fb7823947f3af381a8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/Common.meta b/Networking/Assets/Blocks/Common.meta
new file mode 100644
index 0000000..0f7ac6f
--- /dev/null
+++ b/Networking/Assets/Blocks/Common.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0fd8a6b3336fb7549a2beea9eec67b94
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/Common/.DS_Store.meta b/Networking/Assets/Blocks/Common/.DS_Store.meta
new file mode 100644
index 0000000..baf131d
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/.DS_Store.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: e7285dc6dc6cf4e41821900252041a87
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/.DS_Store
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/BlocksPanelSettings.asset b/Networking/Assets/Blocks/Common/BlocksPanelSettings.asset
new file mode 100644
index 0000000..cba30d9
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/BlocksPanelSettings.asset
@@ -0,0 +1,53 @@
+%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: 19101, guid: 0000000000000000e000000000000000, type: 0}
+ m_Name: BlocksPanelSettings
+ m_EditorClassIdentifier:
+ themeUss: {fileID: -4733365628477956816, guid: 2e74663645b63fe43ad48957a2398ce5, type: 3}
+ m_DisableNoThemeWarning: 0
+ m_TargetTexture: {fileID: 0}
+ m_RenderMode: 0
+ m_ColliderUpdateMode: 0
+ m_ColliderIsTrigger: 1
+ m_ScaleMode: 2
+ m_ReferenceSpritePixelsPerUnit: 100
+ m_PixelsPerUnit: 100
+ m_Scale: 1
+ m_ReferenceDpi: 96
+ m_FallbackDpi: 96
+ m_ReferenceResolution: {x: 1200, y: 800}
+ m_ScreenMatchMode: 0
+ m_Match: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+ m_BindingLogLevel: 0
+ m_ClearDepthStencil: 1
+ m_ClearColor: 0
+ m_ColorClearValue: {r: 0, g: 0, b: 0, a: 0}
+ m_VertexBudget: 0
+ m_TextureSlotCount: 8
+ m_DynamicAtlasSettings:
+ m_MinAtlasSize: 64
+ m_MaxAtlasSize: 4096
+ m_MaxSubTextureSize: 64
+ m_ActiveFilters: -1
+ m_AtlasBlitShader: {fileID: 9101, guid: 0000000000000000f000000000000000, type: 0}
+ m_RuntimeShader: {fileID: 9100, guid: 0000000000000000f000000000000000, type: 0}
+ m_RuntimeWorldShader: {fileID: 9102, guid: 0000000000000000f000000000000000, type: 0}
+ m_RuntimeGaussianBlurShader: {fileID: 20300, guid: 0000000000000000f000000000000000, type: 0}
+ m_RuntimeColorEffectShader: {fileID: 20301, guid: 0000000000000000f000000000000000, type: 0}
+ m_SDFShader: {fileID: 19011, guid: 0000000000000000f000000000000000, type: 0}
+ m_BitmapShader: {fileID: 9001, guid: 0000000000000000f000000000000000, type: 0}
+ m_SpriteShader: {fileID: 19012, guid: 0000000000000000f000000000000000, type: 0}
+ m_ICUDataAsset: {fileID: 0}
+ forceGammaRendering: 0
+ textSettings: {fileID: 0}
diff --git a/Networking/Assets/Blocks/Common/BlocksPanelSettings.asset.meta b/Networking/Assets/Blocks/Common/BlocksPanelSettings.asset.meta
new file mode 100644
index 0000000..27c27fa
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/BlocksPanelSettings.asset.meta
@@ -0,0 +1,15 @@
+fileFormatVersion: 2
+guid: 7a38f2dd4a52f3c43802f4f88af54bfe
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/BlocksPanelSettings.asset
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/BlocksRuntimeTheme.tss b/Networking/Assets/Blocks/Common/BlocksRuntimeTheme.tss
new file mode 100644
index 0000000..3e2e274
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/BlocksRuntimeTheme.tss
@@ -0,0 +1,26 @@
+@import url("unity-theme://default");
+
+@import url("Content/stylesheets/core.uss");
+@import url("Content/stylesheets/modals.uss");
+@import url("Content/stylesheets/labels.uss");
+@import url("Content/stylesheets/buttons.uss");
+@import url("Content/stylesheets/icons.uss");
+@import url("Content/stylesheets/inputs.uss");
+@import url("Content/stylesheets/scroll-view.uss");
+@import url("Content/stylesheets/progressbar.uss");
+@import url("Content/stylesheets/utilities.uss");
+@import url("Content/composites/numeric-list-element.uss");
+@import url("Content/composites/card-component.uss");
+@import url("Content/stylesheets/copy-session--header.uss");
+@import url("Content/stylesheets/list-view.uss");
+
+
+
+
+
+
+
+
+
+
+VisualElement {}
diff --git a/Networking/Assets/Blocks/Common/BlocksRuntimeTheme.tss.meta b/Networking/Assets/Blocks/Common/BlocksRuntimeTheme.tss.meta
new file mode 100644
index 0000000..1430d42
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/BlocksRuntimeTheme.tss.meta
@@ -0,0 +1,18 @@
+fileFormatVersion: 2
+guid: 2e74663645b63fe43ad48957a2398ce5
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12388, guid: 0000000000000000e000000000000000, type: 0}
+ disableValidation: 0
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/BlocksRuntimeTheme.tss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content.meta b/Networking/Assets/Blocks/Common/Content.meta
new file mode 100644
index 0000000..f112507
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 21faf7cf08d244af6b983caad63ea6b1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/Common/Content/.DS_Store.meta b/Networking/Assets/Blocks/Common/Content/.DS_Store.meta
new file mode 100644
index 0000000..b6c41d7
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/.DS_Store.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: e2eafc5e951f14078b75a83971875d2b
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/.DS_Store
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/composites.meta b/Networking/Assets/Blocks/Common/Content/composites.meta
new file mode 100644
index 0000000..9939aa7
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/composites.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 2140af3b5bc949218d7c4568001a6de1
+timeCreated: 1746544289
\ No newline at end of file
diff --git a/Networking/Assets/Blocks/Common/Content/composites/card-component.uss b/Networking/Assets/Blocks/Common/Content/composites/card-component.uss
new file mode 100644
index 0000000..9556a5c
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/composites/card-component.uss
@@ -0,0 +1,95 @@
+.blocks-base-achievement {
+ background-color: var(--color-card-background);
+ margin: var(--margin-sm);
+ padding: var(--padding-md);
+ border-radius: var(--radius-sm);
+ border-width: var(--width-border-md);
+ border-color: var(--color-border);
+ flex-grow: 1;
+ flex-shrink: 1;
+}
+
+.blocks-card-component {
+ --width-card: 300px;
+ --height-card: 350px;
+ min-height: var(--height-card);
+ max-height: var(--height-card);
+ min-width: var(--width-card);
+ max-width: var(--width-card);
+}
+
+.blocks-notification-transition {
+ transition-duration: 0.5s;
+ transition-timing-function: ease-in-out;
+}
+
+.blocks-notification {
+ width: 300px;
+ height: 200px;
+ flex-grow: 0;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+}
+
+.blocks-notification__hidden {
+ translate: 0 250px 0;
+}
+
+.blocks-card-component__title {
+ margin-top: var(--margin-md);
+ margin-bottom: var(--margin-sm);
+ -unity-text-align: middle-center;
+ font-size: var(--text-md);
+ color: var(--color-default);
+ -unity-font-style: bold;
+ white-space: normal;
+}
+
+.blocks-card-component__thumbnail {
+ background-image: url("../textures/thumbnail.png");
+ flex-grow: 1;
+ -unity-background-scale-mode: scale-to-fit;
+}
+
+.blocks-card-component__description {
+ color: grey;
+ -unity-text-align: middle-center;
+ overflow: initial;
+ white-space: normal;
+ margin-bottom: var(--margin-md);
+}
+
+.blocks-card-component__unlocked-label {
+ -unity-text-align: middle-center;
+ font-size: var(--text-md);
+ color: var(--color-default);
+ -unity-font-style: bold;
+ white-space: normal;
+ margin-bottom: 12px;
+ display: none;
+}
+
+.blocks-card-component__progress-bar {
+ display: flex;
+}
+
+
+.blocks-card-component__progress-bar__top-container {
+ align-items: center;
+ align-self: center;
+ flex-direction: row;
+}
+
+.blocks-scroll-view {
+ flex-grow: 1;
+}
+
+.blocks-grid-view {
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+ align-items: flex-start;
+ align-content: flex-start;
+ min-height: auto;
+}
diff --git a/Networking/Assets/Blocks/Common/Content/composites/card-component.uss.meta b/Networking/Assets/Blocks/Common/Content/composites/card-component.uss.meta
new file mode 100644
index 0000000..5d353de
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/composites/card-component.uss.meta
@@ -0,0 +1,18 @@
+fileFormatVersion: 2
+guid: ac8a6514e30d5487e8c3597727f1e1ff
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
+ disableValidation: 0
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/composites/card-component.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/composites/chat-message.uss b/Networking/Assets/Blocks/Common/Content/composites/chat-message.uss
new file mode 100644
index 0000000..e995339
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/composites/chat-message.uss
@@ -0,0 +1,12 @@
+:root{
+ padding-top: var(--padding-md);
+ width: 100%;
+}
+
+.blocks-chat-message__text {
+ padding-top: var(--padding-sm);
+ padding-bottom: var(--padding-md);
+ border-bottom-color: var(--color-border);
+ white-space: normal;
+ border-width: var(--width-border-md);
+}
diff --git a/Networking/Assets/Blocks/Common/Content/composites/chat-message.uss.meta b/Networking/Assets/Blocks/Common/Content/composites/chat-message.uss.meta
new file mode 100644
index 0000000..44fc27d
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/composites/chat-message.uss.meta
@@ -0,0 +1,18 @@
+fileFormatVersion: 2
+guid: a7fadc2a4fb2e466699f40e49e8984b9
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
+ disableValidation: 0
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/composites/chat-message.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/composites/chat-message.uxml b/Networking/Assets/Blocks/Common/Content/composites/chat-message.uxml
new file mode 100644
index 0000000..619eda6
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/composites/chat-message.uxml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/Networking/Assets/Blocks/Common/Content/composites/chat-message.uxml.meta b/Networking/Assets/Blocks/Common/Content/composites/chat-message.uxml.meta
new file mode 100644
index 0000000..934e842
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/composites/chat-message.uxml.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: 80bf5492419f84805a36cf30c440f229
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/composites/chat-message.uxml
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/composites/numeric-list-element.uss b/Networking/Assets/Blocks/Common/Content/composites/numeric-list-element.uss
new file mode 100644
index 0000000..cc33801
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/composites/numeric-list-element.uss
@@ -0,0 +1,30 @@
+.blocks-number-list-element{
+ flex-grow: 1;
+ flex-direction: row;
+ width: 100%;
+ -unity-text-align: middle-left;
+ border-bottom-color: var(--color-border);
+ border-width: var(--width-border-md);
+ height: var(--base-unit-lg);
+ min-width: 500px;
+}
+
+.current-user.blocks-number-list-element {
+ background-color: rgba(30,128,188,0.61);
+}
+
+.blocks-number-list-element__number{
+ font-size: var(--text-md);
+ -unity-font-style: bold;
+ width: var(--base-unit-xl);
+}
+
+.blocks-number-list-element__text{
+ font-size: var(--text-sm);
+}
+
+.blocks-number-list-element__right{
+ font-size: var(--text-sm);
+ margin-left: auto;
+ padding-left: var(--base-unit-md);
+}
diff --git a/Networking/Assets/Blocks/Common/Content/composites/numeric-list-element.uss.meta b/Networking/Assets/Blocks/Common/Content/composites/numeric-list-element.uss.meta
new file mode 100644
index 0000000..6306b6e
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/composites/numeric-list-element.uss.meta
@@ -0,0 +1,18 @@
+fileFormatVersion: 2
+guid: 1fa5a86ec0f684068824bc35f2bb6f27
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
+ disableValidation: 0
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/composites/numeric-list-element.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets.meta b/Networking/Assets/Blocks/Common/Content/stylesheets.meta
new file mode 100644
index 0000000..19a0c51
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: fe92f77c76574398bc569bc8d4022def
+timeCreated: 1746544204
\ No newline at end of file
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/buttons.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/buttons.uss
new file mode 100644
index 0000000..5ae36e7
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/buttons.uss
@@ -0,0 +1,115 @@
+.blocks-button {
+ height: var(--base-unit-xl);
+ min-width: var(--width-min-input);
+ padding: 0 var(--padding-lg);
+ letter-spacing: var(--letterspacing-lg);
+ color: var(--color-default);
+ background-color: transparent;
+ border-color: var(--color-default);
+ border-width: var(--width-border-md);
+ border-radius: var(--radius-lg);
+ -unity-font-style: bold;
+ flex-grow: 0;
+}
+
+.blocks-button:hover:enabled,
+.blocks-button:focus:enabled {
+ background-color: var(--color-default);
+ border-color: var(--color-default);
+ color: var(--color-dark-content);
+}
+
+.blocks-button:active:enabled {
+ background-color: var(--color-active);
+ border-color: var(--color-active);
+ color: var(--color-dark-content);
+}
+
+.blocks-button:disabled {
+ color: var(--color-inactive);
+ border-color: var(--color-inactive);
+ background-color: transparent;
+}
+
+.blocks-button--xs {
+ height: var(--base-unit-lg);
+ border-radius: var(--radius-sm);
+ padding: 0;
+ min-width: var(--base-unit-lg);
+}
+
+.blocks-button--sm {
+ height: var(--base-unit-lg);
+ border-radius: var(--radius-sm);
+}
+
+.blocks-button--round {
+ color: transparent;
+ height: var(--base-unit-xl);
+ width: var(--base-unit-xl);
+ min-width: var(--base-unit-xl);
+ max-width: var(--base-unit-xl);
+ min-height: var(--base-unit-xl);
+ max-height: var(--base-unit-xl);
+ border-radius: var(--radius-lg);
+ padding: 0;
+ background-size: 50% 50%;
+}
+
+.blocks-button--round:hover {
+ color: transparent;
+ -unity-background-image-tint-color: var(--color-dark-content);
+}
+
+.blocks-button--round:focus {
+ color: transparent;
+}
+
+/* Buttons to use for Tab Selection */
+.blocks-tab-button {
+ border-width: var(--width-border-md);
+ color: var(--color-inactive);
+ padding-left: var(--padding-md);
+ padding-right: var(--padding-md);
+ background-color: transparent;
+ border-color: transparent;
+ height: var(--base-unit-xl);
+ -unity-text-align: middle-center;
+ letter-spacing: var(--letterspacing-lg);
+}
+
+.blocks-tab-button__underline {
+ visibility: hidden;
+}
+
+.blocks-tab-button:focus:enabled{
+ border-color: transparent;
+ background-color: transparent;
+ color: var(--color-default);
+ border-bottom-color: var(--color-default);
+}
+
+.blocks-tab-button:hover:enabled {
+ background-color: transparent;
+ border-color: transparent;
+ color: var(--color-default);
+}
+
+.blocks-tab-button:checked:hover:enabled {
+ background-color: transparent;
+ border-color: transparent;
+ color: var(--color-default);
+ border-bottom-color: var(--color-default);
+}
+
+.blocks-tab-button:checked:enabled {
+ border-color: transparent;
+ background-color: transparent;
+ color: var(--color-active);
+ border-bottom-color: var(--color-default);
+}
+
+.blocks-tab-button .unity-toggle__checkmark {
+ display: none;
+}
+
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/buttons.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/buttons.uss.meta
new file mode 100644
index 0000000..9d3281b
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/buttons.uss.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 24a81c4df0f34b7f8c53416ae3f8d529
+timeCreated: 1746543912
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/buttons.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/copy-session--header.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/copy-session--header.uss
new file mode 100644
index 0000000..2e41de8
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/copy-session--header.uss
@@ -0,0 +1,29 @@
+.blocks-copy-session--header {
+ width: auto;
+}
+
+.blocks-copy-session--header > .blocks-button {
+ background-image: url("../textures/icon_copy.png");
+ background-size: 16px 16px;
+ border-width: 0;
+ font-size: 0;
+ max-height: 16px;
+ min-width: 16px;
+ max-width: 16px;
+ padding: 0;
+}
+
+.blocks-copy-session--header > .blocks-textfield {
+ min-width: auto;
+ min-height: auto;
+ border-width: 0;
+ flex-grow: 0;
+ padding: 4px 2px 4px 1px;
+ margin: 4px 4px 2px 2px;
+}
+
+.blocks-copy-session--header > .blocks-textfield > .unity-base-field__input {
+ -unity-text-align: middle-right;
+ justify-content: flex-end;
+ padding: 0;
+}
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/copy-session--header.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/copy-session--header.uss.meta
new file mode 100644
index 0000000..f691f6b
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/copy-session--header.uss.meta
@@ -0,0 +1,19 @@
+fileFormatVersion: 2
+guid: 6d0fe8ff6f2a1ef4fb1af3a5e8584135
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
+ disableValidation: 0
+ unsupportedSelectorAction: 0
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/copy-session--header.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/core.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/core.uss
new file mode 100644
index 0000000..0ea7188
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/core.uss
@@ -0,0 +1,63 @@
+:root {
+ /* font and text */
+ --font-sans: "Inter", sans-serif;
+ --text-sm: 14px;
+ --text-md: 18px;
+ --text-lg: 24px;
+ --text-xl: 32px;
+ --letterspacing-md: 2px;
+ --letterspacing-lg: 4px;
+
+ /* colors */
+ --color-modal-background: rgba(16, 16, 16, 0.96);
+ --color-card-background: rgb(31, 31, 31);
+ --color-dropdown-selection-background: rgb(63, 63, 63);
+
+ --color-default: rgb(255, 255, 255);
+ --color-inactive: rgba(255, 255, 255, 0.5);
+ --color-neutral: rgb(171, 171, 171);
+ --color-active: rgb(199, 199, 199);
+ --color-dark-content: rgb(0, 0, 0);
+ --color-border: rgb(66, 66, 66);
+
+ /* spacing and sizing */
+ --base-unit-xs:4px;
+ --base-unit-sm:8px;
+ --base-unit-md:16px;
+ --base-unit-lg:32px;
+ --base-unit-xls:40px;
+ --base-unit-xl:56px;
+ --base-unit-xxl:96px;
+
+ /* paddings */
+ --padding-sm: 8px;
+ --padding-md: 18px;
+ --padding-lg: 32px;
+ --padding-xl: 48px;
+ --padding-xxl: 64px;
+
+ /* margin */
+ --margin-xs: 4px;
+ --margin-sm: 16px;
+ --margin-md: 24px;
+ --margin-lg: 32px;
+ --margin-xl: 48px;
+
+ /* border-radius */
+ --radius-xs: 4px;
+ --radius-sm: 16px;
+ --radius-md: 24px;
+ --radius-lg: 28px;
+ --radius-xl: 32px;
+
+ --width-min-input: 156px;
+ --width-border-md: 2px;
+}
+
+* {
+ margin: 0;
+ padding: 0;
+ -unity-font: var(--font-sans);
+ font-size: var(--text-md);
+ letter-spacing: var(--letterspacing-md);
+}
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/core.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/core.uss.meta
new file mode 100644
index 0000000..bf1d7d1
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/core.uss.meta
@@ -0,0 +1,18 @@
+fileFormatVersion: 2
+guid: 579ba5ca033b24b4a963ed035c497332
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
+ disableValidation: 0
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/core.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/icons.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/icons.uss
new file mode 100644
index 0000000..224e488
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/icons.uss
@@ -0,0 +1,47 @@
+.blocks-icon-triangle{
+ background-image: url("../textures/icon_triangle.png");
+}
+
+.blocks-icon-x{
+ background-image: url("../textures/icon_x.png");
+}
+
+.blocks-icon-arrow{
+ background-image: url("../textures/icon_triangle.png");
+}
+
+.blocks-reticle-cross{
+ background-image: url("../textures/reticle_cross.png");
+}
+
+.blocks-reticle-opencircular{
+ background-image: url("../textures/reticle_opencircular.png");
+}
+
+.blocks-reticle-tcross{
+ background-image: url("../textures/reticle_tcross.png");
+}
+
+.blocks-reticle-circularcross{
+ background-image: url("../textures/reticle_circularcross.png");
+}
+
+.blocks-icon-pistol{
+ background-image: url("../textures/icon_pistol.png");
+}
+
+.blocks-icon-shotgun{
+ background-image: url("../textures/icon_shotgun.png");
+}
+
+.blocks-icon-machinegun{
+ background-image: url("../textures/icon_machinegun.png");
+}
+
+.blocks-icon-rocketlauncher{
+ background-image: url("../textures/icon_rocketlauncher.png");
+}
+
+.blocks-icon-reload{
+ background-image: url("../textures/reticle_reload_circle.png");
+}
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/icons.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/icons.uss.meta
new file mode 100644
index 0000000..375602d
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/icons.uss.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 9a4825ea77704dd099e1cf197a3f9728
+timeCreated: 1746616051
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/icons.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/inputs.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/inputs.uss
new file mode 100644
index 0000000..d495e3b
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/inputs.uss
@@ -0,0 +1,141 @@
+.blocks-textfield,
+.blocks-dropdown{
+ min-width: var(--width-min-input);
+ min-height: var(--base-unit-xl);
+ letter-spacing: var(--letterspacing-md);
+ border-radius: var(--radius-sm);
+ border-color: var(--color-neutral);
+ border-width: var(--width-border-md);
+ white-space: normal;
+ flex-grow: 1;
+}
+
+.blocks-textfield > .unity-base-field__input,
+.blocks-dropdown:hover:enabled > .unity-base-popup-field__input,
+.blocks-dropdown > .unity-base-popup-field__input,
+.blocks-dropdown:active:enabled > .unity-base-popup-field__input{
+ --unity-cursor-color: rgb(255, 255, 255);
+ background-color: transparent;
+ border-width: 0;
+ color: var(--color-default);
+ padding: var(--padding-md);
+}
+
+.blocks-textfield > .unity-base-text-field__input--placeholder {
+ color: var(--color-neutral);
+}
+
+.blocks-textfield > .unity-base-field__label,
+.blocks-dropdown > .unity-base-field__label{
+ display: none;
+}
+
+.blocks-dropdown > .unity-base-popup-field__input > .unity-base-popup-field__arrow{
+ background-image: url("../textures/icon_triangle.png");
+ width: var(--base-unit-md);
+ height: var(--base-unit-md);
+ margin-left: var( --margin-sm);
+ -unity-background-image-tint-color: var(--color-default);
+}
+
+.blocks-toggle {
+ align-items: center;
+}
+
+.blocks-toggle > .unity-toggle__label{
+ color: var(--color-active);
+ font-size: var( --text-xl);
+ align-items: center;
+ letter-spacing: var(--letterspacing-lg);
+ flex-grow: 1;
+}
+
+.blocks-toggle:checked > .unity-toggle__label,
+.blocks-toggle:focus:enabled > .unity-toggle__label {
+ color: var(--color-default);
+ font-size: var( --text-xl);
+ align-items: center;
+ letter-spacing: var(--letterspacing-lg);
+ flex-grow: 1;
+}
+
+.blocks-toggle > .unity-toggle__input{
+ margin-left: var( --margin-sm);
+ min-height: var(--base-unit-xl);
+ min-width: var(--base-unit-xxl);
+ max-width: var(--base-unit-xxl);
+ border-radius: var(--radius-lg);
+ border-color: darkgrey;
+ border-width: var(--width-border-md);
+}
+
+.blocks-toggle > .unity-toggle__input > .unity-toggle__checkmark{
+ transition: left 0.1s ease-in-out, scale 0.1s ease-in-out;
+ left: 8px;
+ min-width: var( --base-unit-lg);
+ min-height: var( --base-unit-lg);
+ background-color: var(--color-inactive);
+ background-image: none;
+ border-width: 0;
+ border-radius: var(--radius-sm);
+}
+
+.blocks-toggle:checked > .unity-toggle__input > .unity-toggle__checkmark{
+ scale: 1.2;
+ left: 48px;
+ background-color: var(--color-default);
+}
+
+.blocks-toggle > .unity-toggle__input:checked > .unity-toggle__checkmark,
+.blocks-toggle > .unity-toggle__input:focus:enabled:checked > .unity-toggle__checkmark,
+.blocks-toggle > .unity-toggle__input:hover:enabled:checked > .unity-toggle__checkmark{
+ background-image: none;
+}
+
+.blocks-toggle:focus:enabled > .unity-toggle__input,
+.blocks-textfield:focus,
+.blocks-dropdown:active:enabled,
+.blocks-dropdown:focus{
+ border-color: var(--color-default);
+}
+
+
+/* Unfortunately we have to style the global dropdown as it has no custom class
+ this is shown when the dropdown is open.
+*/
+
+.unity-base-dropdown__container-outer{
+ border-color: transparent;
+}
+
+.unity-base-dropdown__container-inner{
+ padding: 2px;
+ background-color: var(--color-card-background);
+ border-radius: var(--radius-sm);
+}
+
+.unity-base-dropdown__item{
+ margin: var(--base-unit-xs);
+ color: var(--color-inactive);
+}
+
+.unity-base-dropdown__item:hover:enabled{
+ background-color: var(--color-dropdown-selection-background);
+ border-radius: var(--radius-sm);
+}
+
+.unity-base-dropdown__item:checked:enabled{
+ background-color: var(--color-dropdown-selection-background);
+ border-radius: var(--radius-sm);
+ color: var(--color-default);
+}
+
+.unity-base-dropdown__item > .unity-base-dropdown__item-content > .unity-base-dropdown__checkmark{
+ display: none;
+}
+
+.unity-base-dropdown__item > .unity-base-dropdown__item-content > .unity-base-dropdown__label,
+.unity-base-dropdown__item:checked > .unity-base-dropdown__item-content > .unity-base-dropdown__label{
+ padding-left: var(--base-unit-xs);
+ padding-right: var(--base-unit-xs);
+}
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/inputs.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/inputs.uss.meta
new file mode 100644
index 0000000..a3c1fbb
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/inputs.uss.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: e01aade3b4d44466be1a74cda2e4b773
+timeCreated: 1746544115
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/inputs.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/labels.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/labels.uss
new file mode 100644
index 0000000..a1b2042
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/labels.uss
@@ -0,0 +1,26 @@
+.blocks-label{
+ color: var(--color-default);
+}
+
+.blocks-header {
+ font-size: var(--text-lg);
+ -unity-font-style: bold;
+ color: var(--color-neutral);
+ -unity-text-align: middle-center;
+ padding: 0 var(--padding-lg);
+ margin: 0;
+ width: 100%;
+}
+
+.blocks-header--sm {
+ font-size: var(--text-md);
+}
+
+.blocks-header--xs {
+ font-size: var(--text-sm);
+}
+
+.blocks-header--space-bottom {
+ margin-bottom: var(--margin-xl);
+}
+
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/labels.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/labels.uss.meta
new file mode 100644
index 0000000..7ec4c00
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/labels.uss.meta
@@ -0,0 +1,18 @@
+fileFormatVersion: 2
+guid: 3967daf31cdfb2d4b8326839de2c378e
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
+ disableValidation: 0
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/labels.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/list-view.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/list-view.uss
new file mode 100644
index 0000000..0521474
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/list-view.uss
@@ -0,0 +1,4 @@
+.blocks-list-view--no-hover .unity-collection-view__item:hover
+{
+ background-color: transparent;
+}
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/list-view.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/list-view.uss.meta
new file mode 100644
index 0000000..0b74eb1
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/list-view.uss.meta
@@ -0,0 +1,19 @@
+fileFormatVersion: 2
+guid: 0c25414d17a91d14e85428d6e27917f9
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
+ disableValidation: 0
+ unsupportedSelectorAction: 0
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/list-view.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/modals.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/modals.uss
new file mode 100644
index 0000000..cb01844
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/modals.uss
@@ -0,0 +1,54 @@
+.blocks-modal {
+ background-color: var(--color-modal-background);
+ border-radius: var(--radius-md);
+ justify-content: flex-start;
+ align-items: center;
+ flex-grow: 0;
+ flex-shrink: 1;
+ padding: var(--padding-lg) var(--padding-xl);
+}
+
+.blocks-modal__close-button {
+ position: absolute;
+ top: var(--padding-lg);
+ right: var(--padding-xl);
+}
+
+.blocks-menu
+{
+ align-content: center;
+ justify-content: center;
+ align-items: center;
+ align-self: center;
+ flex-grow: 1;
+}
+
+.blocks-debug-menu
+{
+ flex-grow: 1;
+ flex-shrink: 1;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ align-content: center;
+ width: 100%;
+}
+
+.blocks-menu--left-panel {
+ height: 100%;
+}
+
+.blocks-menu--left-panel > .blocks-modal
+{
+ flex-grow: 1;
+}
+
+.blocks-modal--left-aligned-text {}
+
+.blocks-modal--left-aligned-text .blocks-label,
+.blocks-modal--left-aligned-text .blocks-header {
+ -unity-text-align: middle-left;
+ padding: 0;
+ width: auto;
+}
+
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/modals.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/modals.uss.meta
new file mode 100644
index 0000000..d5b8f81
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/modals.uss.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: cef182fc9fb448339fe32a55e8ba31b6
+timeCreated: 1746544465
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/modals.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/progressbar.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/progressbar.uss
new file mode 100644
index 0000000..c2bb9e5
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/progressbar.uss
@@ -0,0 +1,57 @@
+:root{
+ --color-progressbar-background: rgba(16, 16, 16, 0.75);
+ --color-progressbar-border-color: rgba(0, 0, 0, 0);
+ --color-progressbar-fill: rgba(145, 213, 97, 0.75);
+ --color-progressbar-text: rgb(255, 255, 255);
+ --color-progressbar-text-low: rgb(255, 0, 0);
+ --color-progressbar-ammo-blue: rgba(19, 181, 231, 0.75);
+}
+
+.blocks-progress-bar .unity-progress-bar{
+ position: relative;
+ width: 100%;
+ background-color: black;
+ border-radius: 10px;
+ min-height: 16px;
+ max-height: 16px;
+ overflow: hidden;
+ justify-content: center;
+}
+
+.blocks-progress-bar .unity-progress-bar__container {
+ justify-content: center;
+}
+
+.blocks-progress-bar .unity-progress-bar__background {
+ position: absolute;
+ width: 100%;
+ min-height: 16px;
+ max-height: 16px;
+ background-color: var(--color-progressbar-background);
+ border-radius: 10px;
+ overflow: hidden;
+ border-width: 4px;
+ border-color: var(--color-progressbar-border-color);
+}
+
+.blocks-progress-bar .unity-progress-bar__progress {
+ position: absolute;
+ height: 8px;
+ margin: 0px;
+ border-radius: 5px;
+ padding: 0px;
+ top: 0;
+ left: 0;
+ background-color: var(--color-progressbar-fill);
+ transition: width 0.3s ease-in-out;
+}
+
+.blocks-progress-bar .unity-progress-bar__title {
+ display: none;
+}
+
+.blocks-ammo-bar .unity-progress-bar__progress {
+ background-color: var(--color-progressbar-ammo-blue);
+}
+
+
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/progressbar.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/progressbar.uss.meta
new file mode 100644
index 0000000..3e9b4c1
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/progressbar.uss.meta
@@ -0,0 +1,18 @@
+fileFormatVersion: 2
+guid: 560ab0d72fae04873ba6435f044289eb
+ScriptedImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 2
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+ script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
+ disableValidation: 0
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/progressbar.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/scroll-view.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/scroll-view.uss
new file mode 100644
index 0000000..4b7e68f
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/scroll-view.uss
@@ -0,0 +1,51 @@
+.blocks-scroll-view {
+ width: 100%;
+}
+
+.blocks-scroll-view .unity-scroll-view__content-container {
+ align-items: center;
+}
+
+.blocks-modal--left-aligned-text .unity-scroll-view__content-container {
+ justify-content: flex-start;
+ align-items: flex-start;
+ color: red;
+}
+
+.blocks-scroll-view .unity-scroller {
+ margin-left: 10px;
+ margin-right: -10px;
+}
+
+.blocks-scroll-view .unity-base-slider__dragger {
+ left: auto;
+ align-self: center;
+ width: var(--base-unit-xs);
+ border-radius: var(--radius-xs);
+ background-color: var(--color-default);
+}
+
+.blocks-scroll-view .unity-base-slider__tracker {
+ display: none;
+}
+
+.blocks-scroll-view .unity-base-slider__dragger-border {
+ display: none;
+}
+
+.blocks-scroll-view .unity-scroller__high-button {
+ display: none;
+}
+
+.blocks-scroll-view .unity-scroller__low-button {
+ display: none;
+}
+
+.blocks-scroll-view__element{
+ width: 100%;
+ height: var(--base-unit-xl);
+ -unity-text-align: middle-left;
+ border-bottom-color: var(--color-border);
+ border-width: var(--width-border-md);
+}
+
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/scroll-view.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/scroll-view.uss.meta
new file mode 100644
index 0000000..cfd2dfa
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/scroll-view.uss.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 8367ea085d4c40fa91a394d241392f22
+timeCreated: 1755704769
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/scroll-view.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/utilities.uss b/Networking/Assets/Blocks/Common/Content/stylesheets/utilities.uss
new file mode 100644
index 0000000..12403b0
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/utilities.uss
@@ -0,0 +1,51 @@
+.blocks-container--horizontal {
+ flex-grow: 0;
+ flex-shrink: 0;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ align-content: center;
+ width: 100%;
+}
+
+.blocks-container--horizontal--grow {
+ flex-grow: 1;
+}
+
+.blocks-container--space-between {
+ justify-content: space-between;
+}
+
+.blocks-container--stretch {
+ align-self: stretch;
+}
+
+.blocks-container--right {
+ justify-content: flex-end;
+}
+
+.blocks-element--space-right {
+ margin-right: var(--margin-lg);
+}
+
+.blocks-element--space-left {
+ margin-left: var(--margin-lg);
+}
+
+.blocks-element--space-bottom {
+ margin-bottom: var(--margin-sm);
+}
+
+.blocks-element--space-bottom-sm {
+ margin-bottom: var(--margin-xs);
+}
+
+.blocks-element--border-bottom {
+ border-bottom-width: var(--base-unit-xs);
+ border-bottom-color: var(--color-border);
+}
+
+.blocks-element--full-width {
+ width: 100%;
+}
+
diff --git a/Networking/Assets/Blocks/Common/Content/stylesheets/utilities.uss.meta b/Networking/Assets/Blocks/Common/Content/stylesheets/utilities.uss.meta
new file mode 100644
index 0000000..b5b070d
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/stylesheets/utilities.uss.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: c4c8f1a4b06149cba4827009b662075d
+timeCreated: 1746544393
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/stylesheets/utilities.uss
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures.meta b/Networking/Assets/Blocks/Common/Content/textures.meta
new file mode 100644
index 0000000..1bd3f08
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 8af2b6a690ed4c4485e99915cf45231c
+timeCreated: 1746544768
\ No newline at end of file
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_copy.png b/Networking/Assets/Blocks/Common/Content/textures/icon_copy.png
new file mode 100644
index 0000000..c28d15a
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/icon_copy.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_copy.png.meta b/Networking/Assets/Blocks/Common/Content/textures/icon_copy.png.meta
new file mode 100644
index 0000000..3a72519
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/icon_copy.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: 6f32ef91cb40afc4aaa897ac7acc5ba7
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/icon_copy.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_machinegun.png b/Networking/Assets/Blocks/Common/Content/textures/icon_machinegun.png
new file mode 100644
index 0000000..0789584
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/icon_machinegun.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_machinegun.png.meta b/Networking/Assets/Blocks/Common/Content/textures/icon_machinegun.png.meta
new file mode 100644
index 0000000..d964ebc
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/icon_machinegun.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: d2af5de8321b14ea895549be3e2482e2
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/icon_machinegun.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_pistol.png b/Networking/Assets/Blocks/Common/Content/textures/icon_pistol.png
new file mode 100644
index 0000000..d9ebffe
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/icon_pistol.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_pistol.png.meta b/Networking/Assets/Blocks/Common/Content/textures/icon_pistol.png.meta
new file mode 100644
index 0000000..1b1796e
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/icon_pistol.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: 3b5072ab3d04743bdb476633780e7d85
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/icon_pistol.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_rocketlauncher.png b/Networking/Assets/Blocks/Common/Content/textures/icon_rocketlauncher.png
new file mode 100644
index 0000000..8a17d3b
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/icon_rocketlauncher.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_rocketlauncher.png.meta b/Networking/Assets/Blocks/Common/Content/textures/icon_rocketlauncher.png.meta
new file mode 100644
index 0000000..4cff5c7
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/icon_rocketlauncher.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: 6b200ab23c0194d55bddae14c53d3069
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/icon_rocketlauncher.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_shotgun.png b/Networking/Assets/Blocks/Common/Content/textures/icon_shotgun.png
new file mode 100644
index 0000000..9a92406
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/icon_shotgun.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_shotgun.png.meta b/Networking/Assets/Blocks/Common/Content/textures/icon_shotgun.png.meta
new file mode 100644
index 0000000..b78e62f
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/icon_shotgun.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: df27af4ba9765418b996241565443e0f
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/icon_shotgun.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_triangle.png b/Networking/Assets/Blocks/Common/Content/textures/icon_triangle.png
new file mode 100644
index 0000000..8ea77b2
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/icon_triangle.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_triangle.png.meta b/Networking/Assets/Blocks/Common/Content/textures/icon_triangle.png.meta
new file mode 100644
index 0000000..cd5607c
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/icon_triangle.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: 2e420d5e686954d1984835153e7faa8b
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/icon_triangle.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_x.png b/Networking/Assets/Blocks/Common/Content/textures/icon_x.png
new file mode 100644
index 0000000..adcb984
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/icon_x.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/icon_x.png.meta b/Networking/Assets/Blocks/Common/Content/textures/icon_x.png.meta
new file mode 100644
index 0000000..352b1d4
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/icon_x.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: 147568b8dabcc45fbafca989d3e2b494
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/icon_x.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/reticle_circularcross.png b/Networking/Assets/Blocks/Common/Content/textures/reticle_circularcross.png
new file mode 100644
index 0000000..d4d7c97
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/reticle_circularcross.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/reticle_circularcross.png.meta b/Networking/Assets/Blocks/Common/Content/textures/reticle_circularcross.png.meta
new file mode 100644
index 0000000..a802647
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/reticle_circularcross.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: c957e948b81d34cc38ace0a4d898348f
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/reticle_circularcross.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/reticle_cross.png b/Networking/Assets/Blocks/Common/Content/textures/reticle_cross.png
new file mode 100644
index 0000000..136e0df
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/reticle_cross.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/reticle_cross.png.meta b/Networking/Assets/Blocks/Common/Content/textures/reticle_cross.png.meta
new file mode 100644
index 0000000..cc5d26c
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/reticle_cross.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: ce642e64c261f4108a7153fa8cda2397
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/reticle_cross.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/reticle_opencircular.png b/Networking/Assets/Blocks/Common/Content/textures/reticle_opencircular.png
new file mode 100644
index 0000000..34cd619
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/reticle_opencircular.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/reticle_opencircular.png.meta b/Networking/Assets/Blocks/Common/Content/textures/reticle_opencircular.png.meta
new file mode 100644
index 0000000..756cc4f
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/reticle_opencircular.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: f1ed4489e26334a3584296723c7c5b9b
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/reticle_opencircular.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/reticle_reload_circle.png b/Networking/Assets/Blocks/Common/Content/textures/reticle_reload_circle.png
new file mode 100644
index 0000000..4f71497
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/reticle_reload_circle.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/reticle_reload_circle.png.meta b/Networking/Assets/Blocks/Common/Content/textures/reticle_reload_circle.png.meta
new file mode 100644
index 0000000..a7ec96b
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/reticle_reload_circle.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: f4b5f52c4eeaa494b874f69ad3ad6502
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 0
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/reticle_reload_circle.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/reticle_tcross.png b/Networking/Assets/Blocks/Common/Content/textures/reticle_tcross.png
new file mode 100644
index 0000000..eb93e88
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/reticle_tcross.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/reticle_tcross.png.meta b/Networking/Assets/Blocks/Common/Content/textures/reticle_tcross.png.meta
new file mode 100644
index 0000000..ff70f6c
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/reticle_tcross.png.meta
@@ -0,0 +1,124 @@
+fileFormatVersion: 2
+guid: 3b472d971cf4e42188683834e6f05a4b
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/reticle_tcross.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Content/textures/thumbnail.png b/Networking/Assets/Blocks/Common/Content/textures/thumbnail.png
new file mode 100644
index 0000000..c2c0ac6
Binary files /dev/null and b/Networking/Assets/Blocks/Common/Content/textures/thumbnail.png differ
diff --git a/Networking/Assets/Blocks/Common/Content/textures/thumbnail.png.meta b/Networking/Assets/Blocks/Common/Content/textures/thumbnail.png.meta
new file mode 100644
index 0000000..1ca2ffc
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Content/textures/thumbnail.png.meta
@@ -0,0 +1,137 @@
+fileFormatVersion: 2
+guid: 9d64ab3d9efdd44d3b35a50db335af8c
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 4
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 1024
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 4
+ buildTarget: CloudRendering
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ customData:
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spriteCustomMetadata:
+ entries: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Content/textures/thumbnail.png
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Prefabs.meta b/Networking/Assets/Blocks/Common/Prefabs.meta
new file mode 100644
index 0000000..743ad4d
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Prefabs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0d18292159f0a4c70a72702db57b42d7
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/Common/Prefabs/UnityServices.prefab b/Networking/Assets/Blocks/Common/Prefabs/UnityServices.prefab
new file mode 100644
index 0000000..56558a4
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Prefabs/UnityServices.prefab
@@ -0,0 +1,100 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &625823154146548787
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8214134490659830777}
+ - component: {fileID: 8627652695361806762}
+ - component: {fileID: 5348375844202089011}
+ m_Layer: 0
+ m_Name: UnityServices
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8214134490659830777
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 625823154146548787}
+ serializedVersion: 2
+ 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: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &8627652695361806762
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 625823154146548787}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d94b93b32e10188419629795f25734b0, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Unity.Services.Core.Components::Unity.Services.Core.Components.ServicesInitialization
+ UseCustomServices: 0
+ ServicesIdentifier:
+ ShowAdvancedFeatures: 0
+ InitializeOnStart: 1
+ UseCustomEnvironment: 0
+ EnvironmentName: production
+ Events:
+ Initialized:
+ m_PersistentCalls:
+ m_Calls: []
+ InitializeFailed:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!114 &5348375844202089011
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 625823154146548787}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4d9bc7f42c0e1b349829e6e45ba8bf95, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Unity.Services.Authentication::Unity.Services.Authentication.Components.PlayerAuthentication
+ UseCustomServices: 0
+ ServicesIdentifier:
+ ShowAdvancedFeatures: 0
+ SetCustomProfile: 0
+ Profile:
+ SignInAnonymously: 1
+ FetchPlayerInfo: 0
+ FetchPlayerName: 0
+ GenerateName: 0
+ Events:
+ SignedIn:
+ m_PersistentCalls:
+ m_Calls: []
+ SignInFailed:
+ m_PersistentCalls:
+ m_Calls: []
+ SignedOut:
+ m_PersistentCalls:
+ m_Calls: []
+ Expired:
+ m_PersistentCalls:
+ m_Calls: []
+ SignInCodeReceived:
+ m_PersistentCalls:
+ m_Calls: []
+ SignInCodeExpired:
+ m_PersistentCalls:
+ m_Calls: []
diff --git a/Networking/Assets/Blocks/Common/Prefabs/UnityServices.prefab.meta b/Networking/Assets/Blocks/Common/Prefabs/UnityServices.prefab.meta
new file mode 100644
index 0000000..0e07b17
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Prefabs/UnityServices.prefab.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 4f60822af0c06433c9c52cd9de5ecb11
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Prefabs/UnityServices.prefab
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Runtime.meta b/Networking/Assets/Blocks/Common/Runtime.meta
new file mode 100644
index 0000000..056618c
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Runtime.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 74c4ed561a8bddeb6854f63ebdfe2109
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/Common/Runtime/Blocks.Common.asmdef b/Networking/Assets/Blocks/Common/Runtime/Blocks.Common.asmdef
new file mode 100644
index 0000000..bffe0c1
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Runtime/Blocks.Common.asmdef
@@ -0,0 +1,14 @@
+{
+ "name": "Blocks.Common",
+ "rootNamespace": "Blocks.Common",
+ "references": [],
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [],
+ "versionDefines": [],
+ "noEngineReferences": false
+}
diff --git a/Networking/Assets/Blocks/Common/Runtime/Blocks.Common.asmdef.meta b/Networking/Assets/Blocks/Common/Runtime/Blocks.Common.asmdef.meta
new file mode 100644
index 0000000..a683c9a
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Runtime/Blocks.Common.asmdef.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 510d22f9fb515c2299f915419086bb2b
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Runtime/Blocks.Common.asmdef
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/Common/Runtime/BlocksTheme.cs b/Networking/Assets/Blocks/Common/Runtime/BlocksTheme.cs
new file mode 100644
index 0000000..110e334
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Runtime/BlocksTheme.cs
@@ -0,0 +1,39 @@
+namespace Blocks.Common
+{
+ public static class BlocksTheme
+ {
+ public const string Label = "blocks-label";
+
+ public const string TextField = "blocks-textfield";
+
+ public const string Button = "blocks-button";
+ public const string ButtonSmall = "blocks-button--sm";
+ public const string ButtonRound = "blocks-button--round";
+ public const string ButtonExtraSmall = "blocks-button--xs";
+
+ public const string Header = "blocks-header";
+ public const string HeaderSmall = "blocks-header--sm";
+ public const string HeaderXSmall = "blocks-header--xs";
+ public const string HeaderSpaceBottom = "blocks-header--space-bottom";
+
+ public const string ContainerHorizontal = "blocks-container--horizontal";
+ public const string ContainerAlignedRight = "blocks-container--right";
+ public const string ContainerStretch = "blocks-container--stretch";
+ public const string ContainerSpaceBetween = "blocks-container--space-between";
+ public const string SpaceRight = "blocks-element--space-right";
+ public const string SpaceLeft = "blocks-element--space-left";
+ public const string SpaceBottom = "blocks-element--space-bottom";
+ public const string SpaceBottomSmall = "blocks-element--space-bottom-sm";
+ public const string FullWidth = "blocks-element--full-width";
+
+ public const string ScrollView = "blocks-scroll-view";
+ public const string ScrollViewElement = "blocks-scroll-view__element";
+
+ public const string ListViewNoHover = "blocks-list-view--no-hover";
+
+ public const string Modal = "blocks-modal";
+ public const string ProgressBar = "blocks-progress-bar";
+
+ public const string Dropdown = "blocks-dropdown";
+ }
+}
diff --git a/Networking/Assets/Blocks/Common/Runtime/BlocksTheme.cs.meta b/Networking/Assets/Blocks/Common/Runtime/BlocksTheme.cs.meta
new file mode 100644
index 0000000..4ee4123
--- /dev/null
+++ b/Networking/Assets/Blocks/Common/Runtime/BlocksTheme.cs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 611ff0e73de052bc1b34f58283186ab3
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/Common/Runtime/BlocksTheme.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession.meta b/Networking/Assets/Blocks/CommonSession.meta
new file mode 100644
index 0000000..83a7719
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9d237858540dc1bdcbef30daa3de7114
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/CommonSession/Prefabs.meta b/Networking/Assets/Blocks/CommonSession/Prefabs.meta
new file mode 100644
index 0000000..33755c7
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Prefabs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 139572fa5184347bf8b9bb111fdd1f44
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/CommonSession/Prefabs/UnityServicesWithName.prefab b/Networking/Assets/Blocks/CommonSession/Prefabs/UnityServicesWithName.prefab
new file mode 100644
index 0000000..77a9f93
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Prefabs/UnityServicesWithName.prefab
@@ -0,0 +1,67 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &926441648132743765
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 625823154146548787, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_Name
+ value: UnityServices
+ objectReference: {fileID: 0}
+ - target: {fileID: 5348375844202089011, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: GenerateName
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 5348375844202089011, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: FetchPlayerName
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 8214134490659830777, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 8214134490659830777, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 8214134490659830777, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 8214134490659830777, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 8214134490659830777, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 8214134490659830777, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 8214134490659830777, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 8214134490659830777, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 8214134490659830777, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 8214134490659830777, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 4f60822af0c06433c9c52cd9de5ecb11, type: 3}
diff --git a/Networking/Assets/Blocks/CommonSession/Prefabs/UnityServicesWithName.prefab.meta b/Networking/Assets/Blocks/CommonSession/Prefabs/UnityServicesWithName.prefab.meta
new file mode 100644
index 0000000..3b7e236
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Prefabs/UnityServicesWithName.prefab.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 579655fa7bd8b4bc5a4166bc19562233
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Prefabs/UnityServicesWithName.prefab
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime.meta b/Networking/Assets/Blocks/CommonSession/Runtime.meta
new file mode 100644
index 0000000..1fdbd7a
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 399cc951ef56db867bcd210200de514e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/Blocks.Sessions.Common.asmdef b/Networking/Assets/Blocks/CommonSession/Runtime/Blocks.Sessions.Common.asmdef
new file mode 100644
index 0000000..92f9310
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/Blocks.Sessions.Common.asmdef
@@ -0,0 +1,30 @@
+{
+ "name": "Blocks.Sessions.Common",
+ "rootNamespace": "Blocks.Sessions.Common",
+ "references": [
+ "GUID:37e17ffe38d86ae48bc3207e83ffef88",
+ "GUID:510d22f9fb515c2299f915419086bb2b"
+ ],
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [
+ "MULTIPLAYER_SERVICES_1_2_0_OR_NEWER"
+ ],
+ "versionDefines": [
+ {
+ "name": "com.unity.netcode.gameobjects",
+ "expression": "2.0.0",
+ "define": "GAMEOBJECTS_NETCODE_2_AVAILABLE"
+ },
+ {
+ "name": "com.unity.services.multiplayer",
+ "expression": "1.2.0",
+ "define": "MULTIPLAYER_SERVICES_1_2_0_OR_NEWER"
+ }
+ ],
+ "noEngineReferences": false
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/Blocks.Sessions.Common.asmdef.meta b/Networking/Assets/Blocks/CommonSession/Runtime/Blocks.Sessions.Common.asmdef.meta
new file mode 100644
index 0000000..31bb577
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/Blocks.Sessions.Common.asmdef.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 97271b4cf421601668d136f3ed0c346d
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/Blocks.Sessions.Common.asmdef
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode.meta b/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode.meta
new file mode 100644
index 0000000..8ee9431
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7fc3051e1697b2f4e98b6cf9949d2a7e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeElement.cs b/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeElement.cs
new file mode 100644
index 0000000..194cbb4
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeElement.cs
@@ -0,0 +1,108 @@
+using Blocks.Common;
+using System.Collections.Generic;
+using Unity.Properties;
+using UnityEngine;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ [UxmlElement]
+ public partial class CopySessionCodeElement : VisualElement
+ {
+ const string k_CopySessionCodeButtonText = "COPY";
+
+ [CreateProperty, UxmlAttribute]
+ public string SessionType
+ {
+ get => m_SessionType;
+ set
+ {
+ if (m_SessionType == value)
+ return;
+
+ m_SessionType = value;
+ if (panel != null)
+ UpdateBindings();
+ }
+ }
+ string m_SessionType;
+
+ CopySessionCodeViewModel m_ViewModel;
+
+ readonly List m_Bindings = new();
+
+ public CopySessionCodeElement()
+ {
+ AddToClassList(BlocksTheme.ContainerHorizontal);
+
+ var hasSessionCode = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(CopySessionCodeViewModel.HasSessionCode)),
+ bindingMode = BindingMode.ToTarget
+ };
+ SetBinding(new BindingId(nameof(enabledSelf)), hasSessionCode);
+
+ var sessionCode = new TextField
+ {
+ textEdition =
+ {
+ isReadOnly = true
+ },
+ selectAllOnMouseUp = false,
+ selectAllOnFocus = false
+ };
+ sessionCode.AddToClassList(BlocksTheme.TextField);
+ sessionCode.AddToClassList(BlocksTheme.SpaceRight);
+ var sessionCodeBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(CopySessionCodeViewModel.SessionCode)),
+ bindingMode = BindingMode.ToTarget
+ };
+ sessionCode.SetBinding("value", sessionCodeBinding);
+ Add(sessionCode);
+ m_Bindings.Add(sessionCodeBinding);
+
+ var copySessionCodeButton = new Button
+ {
+ text = k_CopySessionCodeButtonText
+ };
+ copySessionCodeButton.AddToClassList(BlocksTheme.Button);
+ copySessionCodeButton.clicked += CopySessionCode;
+ Add(copySessionCodeButton);
+ m_Bindings.Add(hasSessionCode);
+
+ RegisterCallback(_ => UpdateBindings());
+ RegisterCallback(_ => CleanupBindings());
+ }
+
+ void CopySessionCode()
+ {
+ if (string.IsNullOrEmpty(m_ViewModel?.SessionCode))
+ return;
+
+ GUIUtility.systemCopyBuffer = m_ViewModel.SessionCode;
+ }
+
+ void UpdateBindings()
+ {
+ CleanupBindings();
+
+ m_ViewModel = new CopySessionCodeViewModel(SessionType);
+ foreach (var binding in m_Bindings)
+ {
+ binding.dataSource = m_ViewModel;
+ }
+ }
+
+ void CleanupBindings()
+ {
+ m_ViewModel?.Dispose();
+ m_ViewModel = null;
+
+ foreach (var binding in m_Bindings)
+ {
+ binding.dataSource = null;
+ }
+ }
+ }
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeElement.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeElement.cs.meta
new file mode 100644
index 0000000..e8fb987
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeElement.cs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: de2ba267bbd77504ab9606732bf832e0
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeElement.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeViewModel.cs b/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeViewModel.cs
new file mode 100644
index 0000000..9365208
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeViewModel.cs
@@ -0,0 +1,109 @@
+using System;
+using System.Runtime.CompilerServices;
+using Unity.Properties;
+using Unity.Services.Multiplayer;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ public class CopySessionCodeViewModel : IDisposable, IDataSourceViewHashProvider, INotifyBindablePropertyChanged
+ {
+ const string k_NoSessionText = "No Session Code";
+
+ SessionObserver m_SessionObserver;
+ ISession m_Session;
+ long m_UpdateVersion;
+
+ [CreateProperty]
+ public bool HasSessionCode
+ {
+ get => m_HasSessionCode;
+ private set
+ {
+ if (m_HasSessionCode == value)
+ return;
+
+ m_HasSessionCode = value;
+ Notify();
+ }
+ }
+ bool m_HasSessionCode;
+
+ [CreateProperty]
+ public string SessionCode
+ {
+ get => m_SessionCode;
+ private set
+ {
+ if (m_SessionCode == value)
+ return;
+
+ m_SessionCode = value;
+ HasSessionCode = m_SessionCode != k_NoSessionText;
+ ++m_UpdateVersion;
+
+ Notify();
+ }
+ }
+ string m_SessionCode = k_NoSessionText;
+
+ public CopySessionCodeViewModel(string sessionType)
+ {
+ m_SessionObserver = new SessionObserver(sessionType);
+
+ m_SessionObserver.SessionAdded += OnSessionAdded;
+
+ if (m_SessionObserver.Session != null)
+ {
+ OnSessionAdded(m_SessionObserver.Session);
+ }
+ }
+
+ void OnSessionAdded(ISession session)
+ {
+ m_Session = session;
+ SessionCode = session?.Code;
+ m_Session.RemovedFromSession += OnSessionRemoved;
+ m_Session.Deleted += OnSessionRemoved;
+ }
+
+ void OnSessionRemoved()
+ {
+ m_Session.RemovedFromSession -= OnSessionRemoved;
+ m_Session.Deleted -= OnSessionRemoved;
+ SessionCode = k_NoSessionText;
+ m_Session = null;
+ }
+
+ public void Dispose()
+ {
+ if (m_SessionObserver != null)
+ {
+ m_SessionObserver.SessionAdded -= OnSessionAdded;
+ m_SessionObserver.Dispose();
+ m_SessionObserver = null;
+ }
+ if (m_Session != null)
+ {
+ m_Session.RemovedFromSession -= OnSessionRemoved;
+ m_Session.Deleted -= OnSessionRemoved;
+ m_Session = null;
+ }
+ }
+
+ ///
+ /// This method is used by UIToolkit to determine if any data bound to the UI has changed.
+ /// Instead of hashing the data, an m_UpdateVersion counter is incremented when changes occur.
+ ///
+ public long GetViewHashCode() => m_UpdateVersion;
+
+ ///
+ /// Suggested implementation of INotifyBindablePropertyChanged from UIToolkit.
+ ///
+ public event EventHandler propertyChanged;
+ void Notify([CallerMemberName] string property = null) =>
+ propertyChanged?.Invoke(this, new BindablePropertyChangedEventArgs(property));
+ }
+}
+
+
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeViewModel.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeViewModel.cs.meta
new file mode 100644
index 0000000..32f3f0d
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeViewModel.cs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 95e390a0b04dc0b428a3a458c263ebde
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/CopySessionCode/CopySessionCodeViewModel.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession.meta b/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession.meta
new file mode 100644
index 0000000..c1cc61d
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: e960173361b7463393e18cf7d484f83e
+timeCreated: 1748895508
\ No newline at end of file
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionButton.cs b/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionButton.cs
new file mode 100644
index 0000000..e0ba703
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionButton.cs
@@ -0,0 +1,73 @@
+using System;
+using Blocks.Common;
+using Unity.Properties;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ [UxmlElement]
+ public partial class LeaveSessionButton : Button
+ {
+ const string k_LeaveSessionButtonText = "Leave Session";
+
+ [CreateProperty, UxmlAttribute]
+ public string SessionType
+ {
+ get => m_SessionType;
+ set
+ {
+ if (m_SessionType == value)
+ {
+ return;
+ }
+
+ m_SessionType = value;
+ if (panel != null)
+ {
+ UpdateBindings();
+ }
+ }
+ }
+
+ string m_SessionType;
+
+ DataBinding m_DataBinding;
+ LeaveSessionViewModel m_ViewModel;
+
+ public LeaveSessionButton()
+ {
+ text = k_LeaveSessionButtonText;
+
+ AddToClassList(BlocksTheme.Button);
+ m_DataBinding = new DataBinding() { dataSourcePath = new PropertyPath(nameof(LeaveSessionViewModel.CanLeaveSession)), bindingMode = BindingMode.ToTarget };
+ SetBinding(new BindingId(nameof(enabledSelf)), m_DataBinding);
+ clicked += LeaveSession;
+
+ RegisterCallback(_ => UpdateBindings());
+ RegisterCallback(_ => CleanupBindings());
+ }
+
+ void LeaveSession()
+ {
+ _ = m_ViewModel.LeaveSession(m_SessionType);
+ }
+
+ void UpdateBindings()
+ {
+ CleanupBindings();
+ m_ViewModel = new LeaveSessionViewModel(m_SessionType);
+ m_DataBinding.dataSource = m_ViewModel;
+ }
+
+ void CleanupBindings()
+ {
+ if (m_DataBinding.dataSource is IDisposable disposable)
+ {
+ disposable.Dispose();
+ }
+
+ m_ViewModel = null;
+ m_DataBinding.dataSource = null;
+ }
+ }
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionButton.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionButton.cs.meta
new file mode 100644
index 0000000..b6cab74
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionButton.cs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 26c91da98adaf109abcae03e989988aa
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionButton.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionViewModel.cs b/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionViewModel.cs
new file mode 100644
index 0000000..0d1a82c
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionViewModel.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Runtime.CompilerServices;
+using System.Threading.Tasks;
+using JetBrains.Annotations;
+using Unity.Properties;
+using Unity.Services.Multiplayer;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ class LeaveSessionViewModel : IDisposable, IDataSourceViewHashProvider, INotifyBindablePropertyChanged
+ {
+ SessionObserver m_SessionObserver;
+ ISession m_Session;
+
+ [CreateProperty]
+ public bool CanLeaveSession
+ {
+ get => m_CanLeaveSession;
+ private set
+ {
+ if (m_CanLeaveSession == value)
+ {
+ return;
+ }
+
+ m_CanLeaveSession = value;
+ Notify();
+ }
+ }
+
+ bool m_CanLeaveSession;
+
+ public LeaveSessionViewModel(string sessionType)
+ {
+ m_SessionObserver = new SessionObserver(sessionType);
+ m_SessionObserver.SessionAdded += OnSessionAdded;
+ if (m_SessionObserver.Session != null)
+ {
+ OnSessionAdded(m_SessionObserver.Session);
+ }
+ }
+
+ void OnSessionAdded(ISession newSession)
+ {
+ m_Session = newSession;
+ m_Session.RemovedFromSession += OnSessionRemoved;
+ m_Session.Deleted += OnSessionRemoved;
+ CanLeaveSession = true;
+ }
+
+ void OnSessionRemoved()
+ {
+ CanLeaveSession = false;
+ CleanupSession();
+ }
+
+ public async Task LeaveSession(string sessionType)
+ {
+ var leaveTask = MultiplayerService.Instance?.Sessions[sessionType]?.LeaveAsync();
+ if (leaveTask != null)
+ await leaveTask;
+ }
+
+ void CleanupSession()
+ {
+ m_Session.RemovedFromSession -= OnSessionRemoved;
+ m_Session.Deleted -= OnSessionRemoved;
+ m_Session = null;
+ }
+
+ public void Dispose()
+ {
+ if (m_SessionObserver != null)
+ {
+ m_SessionObserver.Dispose();
+ m_SessionObserver = null;
+ }
+
+ if (m_Session != null)
+ {
+ CleanupSession();
+ }
+ }
+
+ ///
+ /// This method is used by UIToolkit to determine if any data bound to the UI has changed.
+ /// Instead of hashing the data, an m_CanLeaveSession boolean is toggled when changes occur.
+ ///
+ public long GetViewHashCode() => m_CanLeaveSession ? 1 : 0;
+
+ ///
+ /// Suggested implementation of INotifyBindablePropertyChanged from UIToolkit.
+ ///
+ public event EventHandler propertyChanged;
+
+ void Notify([CallerMemberName] string property = null)
+ {
+ propertyChanged?.Invoke(this, new BindablePropertyChangedEventArgs(property));
+ }
+ }
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionViewModel.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionViewModel.cs.meta
new file mode 100644
index 0000000..e8be4d3
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionViewModel.cs.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 9b15923ac8de40429b36be39da11e1b6
+timeCreated: 1748894877
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/LeaveSession/LeaveSessionViewModel.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount.meta b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount.meta
new file mode 100644
index 0000000..7e688c9
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e627378cef157d44391e5f80f689429c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountLabel.cs b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountLabel.cs
new file mode 100644
index 0000000..eca2e50
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountLabel.cs
@@ -0,0 +1,64 @@
+using System;
+using Blocks.Common;
+using Unity.Properties;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ [UxmlElement]
+ public partial class PlayerCountLabel : Label
+ {
+ [CreateProperty, UxmlAttribute]
+ public string SessionType
+ {
+ get => m_SessionType;
+ set
+ {
+ if (m_SessionType == value)
+ {
+ return;
+ }
+
+ m_SessionType = value;
+ if (panel != null)
+ {
+ UpdateBindings();
+ }
+ }
+ }
+
+ string m_SessionType;
+
+ DataBinding m_DataBinding;
+
+ public PlayerCountLabel()
+ {
+ AddToClassList(BlocksTheme.Label);
+ m_DataBinding = new DataBinding()
+ {
+ dataSourcePath = new PropertyPath(nameof(PlayerCountViewModel.DisplayText)),
+ bindingMode = BindingMode.ToTarget
+ };
+ SetBinding(new BindingId(nameof(text)), m_DataBinding);
+
+ RegisterCallback(_ => UpdateBindings());
+ RegisterCallback(_ => CleanupBindings());
+ }
+
+ void UpdateBindings()
+ {
+ CleanupBindings();
+ m_DataBinding.dataSource = new PlayerCountViewModel(m_SessionType);
+ }
+
+ void CleanupBindings()
+ {
+ if (m_DataBinding.dataSource is IDisposable disposable)
+ {
+ disposable.Dispose();
+ }
+
+ m_DataBinding.dataSource = null;
+ }
+ }
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountLabel.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountLabel.cs.meta
new file mode 100644
index 0000000..98f4e63
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountLabel.cs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 6ba500f520b97b346b2521ef36ef885d
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountLabel.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountViewModel.cs b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountViewModel.cs
new file mode 100644
index 0000000..a6e2b3d
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountViewModel.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Runtime.CompilerServices;
+using Unity.Properties;
+using Unity.Services.Multiplayer;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ public class PlayerCountViewModel : INotifyBindablePropertyChanged, IDataSourceViewHashProvider, IDisposable
+ {
+ const string k_DefaultDisplayText = "- / - Players";
+
+ SessionObserver m_SessionObserver;
+ ISession m_Session;
+ long m_UpdateVersion;
+
+ ///
+ /// This property is bound to so that the label displays the number of
+ /// players in the session.
+ /// It is a property using [CreateProperty] attribute to allow for data binding in UIToolkit
+ ///
+ [CreateProperty]
+ public string DisplayText
+ {
+ get => m_DisplayText;
+ set
+ {
+ if (m_DisplayText == value)
+ {
+ return;
+ }
+
+ m_DisplayText = value;
+ ++m_UpdateVersion;
+ Notify();
+ }
+ }
+ string m_DisplayText = k_DefaultDisplayText;
+
+ public PlayerCountViewModel(string sessionType)
+ {
+ m_SessionObserver = new SessionObserver(sessionType);
+ m_SessionObserver.SessionAdded += OnSessionAdded;
+
+ if (m_SessionObserver.Session != null)
+ {
+ OnSessionAdded(m_SessionObserver.Session);
+ }
+ }
+
+ void OnSessionAdded(ISession newSession)
+ {
+ m_Session = newSession;
+ m_Session.Changed += OnSessionChanged;
+ m_Session.RemovedFromSession += OnSessionRemoved;
+ m_Session.Deleted += OnSessionRemoved;
+ OnSessionChanged();
+ }
+
+ void OnSessionRemoved()
+ {
+ DisplayText = k_DefaultDisplayText;
+ CleanUpSession();
+ }
+
+ void CleanUpSession()
+ {
+ m_Session.RemovedFromSession -= OnSessionRemoved;
+ m_Session.Deleted -= OnSessionRemoved;
+ m_Session.Changed -= OnSessionChanged;
+ m_Session = null;
+ }
+
+ void OnSessionChanged()
+ {
+ DisplayText = $"{m_Session.Players.Count} / {m_Session.MaxPlayers} Players";
+ }
+
+ public void Dispose()
+ {
+ if (m_SessionObserver != null)
+ {
+ m_SessionObserver.Dispose();
+ m_SessionObserver = null;
+ }
+
+ if (m_Session != null)
+ {
+ CleanUpSession();
+ }
+ }
+
+ ///
+ /// This method is used by UIToolkit to determine if any data bound to the UI has changed.
+ /// Instead of hashing the data, an m_UpdateVersion counter is incremented when changes occur.
+ ///
+ public long GetViewHashCode() => m_UpdateVersion;
+
+ ///
+ /// Suggested implementation of INotifyBindablePropertyChanged from UIToolkit.
+ ///
+ public event EventHandler propertyChanged;
+ void Notify([CallerMemberName] string property = null)
+ {
+ propertyChanged?.Invoke(this, new BindablePropertyChangedEventArgs(property));
+ }
+ }
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountViewModel.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountViewModel.cs.meta
new file mode 100644
index 0000000..01f4880
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountViewModel.cs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 5092878c82fa2624cae291fe02975c67
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/PlayerCount/PlayerCountViewModel.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList.meta b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList.meta
new file mode 100644
index 0000000..9f701a7
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3c25d9615542e8f46b89f18602b0133c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewElement.cs b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewElement.cs
new file mode 100644
index 0000000..7c8f211
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewElement.cs
@@ -0,0 +1,115 @@
+using Blocks.Common;
+using Unity.Properties;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ [UxmlElement]
+ public partial class PlayerListViewElement : ListView
+ {
+ private const string k_PlayerListIsEmptyLabel = "No player has joined";
+
+ private string m_SessionType;
+ private DataBinding m_DataBinding;
+ private PlayerListViewModel m_ViewModel;
+
+ [CreateProperty, UxmlAttribute]
+ public string SessionType
+ {
+ get => m_SessionType;
+ set
+ {
+ if (m_SessionType == value)
+ {
+ return;
+ }
+
+ m_SessionType = value;
+ if (panel != null)
+ {
+ UpdateBindingSources();
+ }
+ }
+ }
+
+ public PlayerListViewElement()
+ {
+ selectionType = SelectionType.None;
+ virtualizationMethod = CollectionVirtualizationMethod.DynamicHeight;
+ // required for making each element inheriting an indexed array item for the data source path
+ // if not set, you need to specify the datasource path manually in the bindItem callback for each item
+ bindingSourceSelectionMode = BindingSourceSelectionMode.AutoAssign;
+
+ AddToClassList(BlocksTheme.ListViewNoHover);
+ AddToClassList(BlocksTheme.ScrollView);
+
+ makeNoneElement = MakeNoneElement;
+
+ makeItem = MakeDefaultItem;
+
+ BindItemSource();
+
+ RegisterCallback(OnAttachToPanelEvent);
+ RegisterCallback(OnDetachFromPanelEvent);
+ }
+
+
+ private void OnDetachFromPanelEvent(DetachFromPanelEvent panelEvent)
+ {
+ CleanupBindings();
+ }
+
+ private void OnAttachToPanelEvent(AttachToPanelEvent panelEvent)
+ {
+ UpdateBindingSources();
+ }
+
+ private void UpdateBindingSources()
+ {
+ CleanupBindings();
+
+ m_ViewModel = new PlayerListViewModel(m_SessionType);
+ m_DataBinding.dataSource = m_ViewModel;
+ }
+
+ private void CleanupBindings()
+ {
+ m_ViewModel?.Dispose();
+ m_ViewModel = null;
+ m_DataBinding.dataSource = null;
+ }
+
+ private static VisualElement MakeNoneElement()
+ {
+ var label = new Label(k_PlayerListIsEmptyLabel);
+ label.AddToClassList(BlocksTheme.Label);
+ return label;
+ }
+
+ private void BindItemSource()
+ {
+ m_DataBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(PlayerListViewModel.Players)),
+ bindingMode = BindingMode.ToTarget
+ };
+ SetBinding(new BindingId(nameof(itemsSource)), m_DataBinding);
+ }
+
+ private static VisualElement MakeDefaultItem()
+ {
+ var playerNameLabel = new Label { name = nameof(PlayerNameLabel) };
+ playerNameLabel.AddToClassList(BlocksTheme.Label);
+
+ var dataBinding = new DataBinding
+ {
+ dataSourcePath = PropertyPath.FromName(nameof(PlayerViewModel.Name)),
+ bindingMode = BindingMode.ToTarget
+ };
+
+ playerNameLabel.SetBinding(new BindingId(nameof(Label.text)), dataBinding);
+
+ return playerNameLabel;
+ }
+ }
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewElement.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewElement.cs.meta
new file mode 100644
index 0000000..1d2f947
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewElement.cs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: ebf8a475674a6344a8602c7b78150111
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewElement.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewModel.cs b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewModel.cs
new file mode 100644
index 0000000..a0015b6
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewModel.cs
@@ -0,0 +1,147 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using Unity.Properties;
+using Unity.Services.Multiplayer;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ public class PlayerListViewModel : INotifyBindablePropertyChanged, IDataSourceViewHashProvider, IDisposable
+ {
+ SessionObserver m_SessionObserver;
+ ISession m_Session;
+ long m_UpdateVersion;
+
+ List m_Players;
+
+ [CreateProperty]
+ public List Players
+ {
+ get => m_Players;
+ set
+ {
+ if (m_Players == value)
+ {
+ return;
+ }
+
+ m_Players = value;
+ ++m_UpdateVersion;
+ Notify();
+ }
+ }
+
+ public PlayerListViewModel(string sessionType)
+ {
+ Players = new List();
+
+ m_SessionObserver = new SessionObserver(sessionType);
+ m_SessionObserver.SessionAdded += OnSessionAdded;
+
+ if (m_SessionObserver.Session != null)
+ {
+ OnSessionAdded(m_SessionObserver.Session);
+ }
+ }
+
+ void UpdatePlayerList()
+ {
+ if (m_Session == null)
+ return;
+
+ var updatedPlayerList = new List();
+ foreach (var player in m_Session.Players)
+ {
+ updatedPlayerList.Add(new PlayerViewModel(player, m_Session));
+ }
+
+ // properly dispose the player view models first
+ DisposeAndClearPlayerList();
+ Players.AddRange(updatedPlayerList);
+
+ ++m_UpdateVersion;
+
+ Notify(nameof(Players));
+ }
+
+ private void DisposeAndClearPlayerList()
+ {
+ foreach (var player in Players)
+ {
+ player.Dispose();
+ }
+
+ Players.Clear();
+ }
+
+ void OnSessionAdded(ISession newSession)
+ {
+ m_Session = newSession;
+ m_Session.RemovedFromSession += OnSessionRemoved;
+ m_Session.Deleted += OnSessionRemoved;
+
+ m_Session.PlayerJoined += OnPlayerCountChanged;
+ m_Session.PlayerHasLeft += OnPlayerCountChanged;
+ m_Session.PlayerPropertiesChanged += OnPlayerPropertiesChanged;
+
+ UpdatePlayerList();
+ }
+
+ void OnPlayerCountChanged(string playerId)
+ {
+ UpdatePlayerList();
+ }
+
+ void OnPlayerPropertiesChanged()
+ {
+ UpdatePlayerList();
+ }
+
+ void OnSessionRemoved()
+ {
+ DisposeAndClearPlayerList();
+ CleanupSession();
+ }
+
+ void CleanupSession()
+ {
+ m_Session.RemovedFromSession -= OnSessionRemoved;
+ m_Session.Deleted -= OnSessionRemoved;
+ m_Session.PlayerHasLeft -= OnPlayerCountChanged;
+ m_Session.PlayerJoined -= OnPlayerCountChanged;
+ m_Session.PlayerPropertiesChanged -= OnPlayerPropertiesChanged;
+ m_Session = null;
+ }
+
+ public void Dispose()
+ {
+ if (m_SessionObserver != null)
+ {
+ m_SessionObserver.SessionAdded -= OnSessionAdded;
+ m_SessionObserver.Dispose();
+ m_SessionObserver = null;
+ }
+
+ if (m_Session != null)
+ {
+ CleanupSession();
+ }
+ }
+
+ ///
+ /// This method is used by UIToolkit to determine if any data bound to the UI has changed.
+ /// Instead of hashing the data, an m_UpdateVersion counter is incremented when changes occur.
+ ///
+ public long GetViewHashCode() => m_UpdateVersion;
+
+ ///
+ /// Suggested implementation of INotifyBindablePropertyChanged from UIToolkit.
+ ///
+ public event EventHandler propertyChanged;
+ void Notify([CallerMemberName] string property = null)
+ {
+ propertyChanged?.Invoke(this, new BindablePropertyChangedEventArgs(property));
+ }
+ }
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewModel.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewModel.cs.meta
new file mode 100644
index 0000000..f2a70af
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewModel.cs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 261a2bc9eb4f2eb48a133715c1244987
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerListViewModel.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerViewModel.cs b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerViewModel.cs
new file mode 100644
index 0000000..2433492
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerViewModel.cs
@@ -0,0 +1,124 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using Unity.Properties;
+using Unity.Services.Multiplayer;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ ///
+ /// Provides a DataBinding compatible representation of a player in a session.
+ ///
+ public class PlayerViewModel :
+ /* IReadOnlyPlayer, */
+ INotifyBindablePropertyChanged, IDataSourceViewHashProvider, IDisposable
+ {
+ private IReadOnlyPlayer _player;
+ private ISession _session;
+
+ private long _updateVersion;
+
+ ///
+ /// The unique identifier for the player. If not provided for a create or join request, it will be set to the ID of the caller.
+ ///
+ [CreateProperty]
+ public string Id => _player?.Id;
+
+ ///
+ /// The name of the player retrieved via the Authentication service.
+ ///
+ [CreateProperty]
+ public string Name => _player?.GetPlayerName();
+
+ ///
+ /// Indicates if the given player is the host of the current Session.
+ ///
+ [CreateProperty]
+ public bool IsHost => _session?.Host == Id;
+
+ ///
+ /// The allocation id
+ ///
+ public string AllocationId => _player?.AllocationId;
+
+ ///
+ /// Custom game-specific properties that apply to an individual player (e.g. `role` or `skill`).
+ ///
+ public IReadOnlyDictionary Properties => _player?.Properties;
+
+ ///
+ /// The time at which the member joined the Session.
+ ///
+ public DateTime Joined => _player?.Joined ?? DateTime.UnixEpoch;
+
+ ///
+ /// The last time the metadata for this member was updated.
+ ///
+ public DateTime LastUpdated => _player?.LastUpdated ?? DateTime.UnixEpoch;
+
+ ///
+ /// The Session the player is part of.
+ ///
+ public ISession Session => _session;
+
+ public PlayerViewModel(IReadOnlyPlayer player, ISession session)
+ {
+ _player = player;
+ _session = session;
+
+ _session.Changed += OnSessionChanged;
+ _session.SessionHostChanged += OnSessionHostChanged;
+ _session.PlayerPropertiesChanged += OnSessionPlayerPropertiesChanged;
+ }
+
+ private void OnSessionHostChanged(string obj)
+ {
+ _updateVersion++;
+ Notify(nameof(IsHost));
+ }
+
+ private void OnSessionPlayerPropertiesChanged()
+ {
+ _updateVersion++;
+ if (!string.IsNullOrEmpty(Name))
+ {
+ Notify(nameof(Name));
+ }
+
+ Notify(nameof(Properties));
+ }
+
+ private void OnSessionChanged()
+ {
+ _updateVersion++;
+ Notify(nameof(Session));
+ }
+
+ public void Dispose()
+ {
+ _session.Changed -= OnSessionChanged;
+ _session.SessionHostChanged -= OnSessionHostChanged;
+ _session.PlayerPropertiesChanged -= OnSessionPlayerPropertiesChanged;
+
+ _player = null;
+ _session = null;
+ }
+
+ ///
+ /// This method is used by UIToolkit to determine if any data bound to the UI has changed.
+ /// Instead of hashing the data, an m_UpdateVersion counter is incremented when changes occur.
+ ///
+ public long GetViewHashCode() => _updateVersion;
+
+ ///
+ /// Suggested implementation of INotifyBindablePropertyChanged from UIToolkit.
+ ///
+ public event EventHandler propertyChanged;
+
+ private void Notify([CallerMemberName] string property = null)
+ {
+ propertyChanged?.Invoke(this, new BindablePropertyChangedEventArgs(property));
+ }
+ }
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerViewModel.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerViewModel.cs.meta
new file mode 100644
index 0000000..5da7c14
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerViewModel.cs.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 75d4b34acea8451a8a3d375147ba9213
+timeCreated: 1761247019
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/PlayerList/PlayerViewModel.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName.meta b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName.meta
new file mode 100644
index 0000000..a48c1d7
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e56a3e1a35f34254f86a44e67062b781
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameLabel.cs b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameLabel.cs
new file mode 100644
index 0000000..f64c6ed
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameLabel.cs
@@ -0,0 +1,64 @@
+using System;
+using Blocks.Common;
+using Unity.Properties;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ [UxmlElement]
+ public partial class PlayerNameLabel : Label
+ {
+ [UxmlAttribute, CreateProperty]
+ public string SessionType
+ {
+ get => m_SessionType;
+ set
+ {
+ if (m_SessionType == value)
+ {
+ return;
+ }
+
+ m_SessionType = value;
+ if (panel != null)
+ {
+ UpdateBindings();
+ }
+ }
+ }
+ string m_SessionType;
+
+ DataBinding m_DataBinding;
+
+ public PlayerNameLabel()
+ {
+ AddToClassList(BlocksTheme.Header);
+ AddToClassList(BlocksTheme.HeaderSmall);
+ m_DataBinding = new DataBinding()
+ {
+ dataSourcePath = new PropertyPath(nameof(PlayerNameViewModel.PlayerName)),
+ bindingMode = BindingMode.ToTarget
+ };
+ SetBinding(new BindingId(nameof(text)), m_DataBinding);
+
+ RegisterCallback(_ => UpdateBindings());
+ RegisterCallback(_ => CleanupBindings());
+ }
+
+ void UpdateBindings()
+ {
+ CleanupBindings();
+ m_DataBinding.dataSource = new PlayerNameViewModel(m_SessionType);
+ }
+
+ void CleanupBindings()
+ {
+ if (m_DataBinding.dataSource is IDisposable disposable)
+ {
+ disposable.Dispose();
+ }
+
+ m_DataBinding.dataSource = null;
+ }
+ }
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameLabel.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameLabel.cs.meta
new file mode 100644
index 0000000..bd8b363
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameLabel.cs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: f97a8d9411142084183390e9f2939757
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameLabel.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameViewModel.cs b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameViewModel.cs
new file mode 100644
index 0000000..060900c
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameViewModel.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Runtime.CompilerServices;
+using Unity.Properties;
+using Unity.Services.Multiplayer;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ public class PlayerNameViewModel : INotifyBindablePropertyChanged, IDataSourceViewHashProvider, IDisposable
+ {
+ const string k_NoSession = "No Player Joined";
+
+ SessionObserver m_SessionObserver;
+ ISession m_Session;
+ long m_UpdateVersion;
+
+ ///
+ /// This property is bound to so that the label displays the current
+ /// session name.
+ ///
+ [CreateProperty]
+ public string PlayerName
+ {
+ get => m_PlayerName;
+ set
+ {
+ if (m_PlayerName == value)
+ {
+ return;
+ }
+
+ m_PlayerName = value;
+ ++m_UpdateVersion;
+ Notify();
+ }
+ }
+ string m_PlayerName = k_NoSession;
+
+ public PlayerNameViewModel(string sessionType)
+ {
+ m_SessionObserver = new SessionObserver(sessionType);
+ m_SessionObserver.SessionAdded += OnSessionAdded;
+
+ if (m_SessionObserver.Session != null)
+ {
+ OnSessionAdded(m_SessionObserver.Session);
+ }
+ }
+
+ void OnSessionAdded(ISession newSession)
+ {
+ m_Session = newSession;
+ m_Session.RemovedFromSession += OnSessionRemoved;
+ m_Session.Deleted += OnSessionRemoved;
+ m_Session.Changed += OnSessionChanged;
+ OnSessionChanged();
+ }
+
+ void OnSessionChanged()
+ {
+ PlayerName = m_Session.CurrentPlayer.GetPlayerName();
+ }
+
+ void OnSessionRemoved()
+ {
+ PlayerName = k_NoSession;
+ CleanupSession();
+ }
+
+ void CleanupSession()
+ {
+ m_Session.RemovedFromSession -= OnSessionRemoved;
+ m_Session.Deleted -= OnSessionRemoved;
+ m_Session.Changed -= OnSessionChanged;
+ m_Session = null;
+ }
+
+ public void Dispose()
+ {
+ if (m_SessionObserver != null)
+ {
+ m_SessionObserver.Dispose();
+ m_SessionObserver = null;
+ }
+
+ if (m_Session != null)
+ {
+ CleanupSession();
+ }
+ }
+
+ ///
+ /// This method is used by UIToolkit to determine if any data bound to the UI has changed.
+ /// Instead of hashing the data, an m_UpdateVersion counter is incremented when changes occur.
+ ///
+ public long GetViewHashCode() => m_UpdateVersion;
+
+ ///
+ /// Suggested implementation of INotifyBindablePropertyChanged from UIToolkit.
+ ///
+ public event EventHandler propertyChanged;
+ void Notify([CallerMemberName] string property = null)
+ {
+ propertyChanged?.Invoke(this, new BindablePropertyChangedEventArgs(property));
+ }
+ }
+}
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameViewModel.cs.meta b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameViewModel.cs.meta
new file mode 100644
index 0000000..22acab8
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameViewModel.cs.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: dfc41271b4bb8404f8777303da017982
+AssetOrigin:
+ serializedVersion: 1
+ productId: 341930
+ packageName: Unity Building Block - Multiplayer Session
+ packageVersion: 1.0
+ assetPath: Assets/Blocks/CommonSession/Runtime/PlayerName/PlayerNameViewModel.cs
+ uploadId: 814574
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/SessionInfo.meta b/Networking/Assets/Blocks/CommonSession/Runtime/SessionInfo.meta
new file mode 100644
index 0000000..ad69529
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/SessionInfo.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f3423f74f83ac4547a18d6ebfa1a0e0f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Networking/Assets/Blocks/CommonSession/Runtime/SessionInfo/SessionInfoElement.cs b/Networking/Assets/Blocks/CommonSession/Runtime/SessionInfo/SessionInfoElement.cs
new file mode 100644
index 0000000..a500f88
--- /dev/null
+++ b/Networking/Assets/Blocks/CommonSession/Runtime/SessionInfo/SessionInfoElement.cs
@@ -0,0 +1,437 @@
+using System.Collections.Generic;
+using Blocks.Common;
+using Unity.Properties;
+using UnityEngine.UIElements;
+
+namespace Blocks.Sessions.Common
+{
+ [UxmlElement]
+ public partial class SessionInfoElement : VisualElement
+ {
+
+ const string k_SessionInfoHeaderName = "SessionInfoHeader";
+ const string k_SessionInfoHeaderText = "SESSION INFO";
+
+ const string k_SessionDataHeaderName = "SessionData";
+ const string k_SessionDataHeaderText = "Session Data";
+
+ const string k_ListIsEmptyLabel = "List is empty";
+ const string k_KeyLabelPropertyName = "PropertyKeyLabel";
+ const string k_VisibilityLabelPropertyName = "PropertyVisibilityLabel";
+ const string k_ValueLabelPropertyName = "PropertyValueLabel";
+
+ const string k_SessionPropertiesHeaderName = "SessionProperties";
+ const string k_SessionPropertiesHeaderText = "Session Properties";
+
+ const string k_PlayerDataHeaderName = "PlayerData";
+ const string k_PlayerDataHeaderText = "Player Data";
+
+ const string k_PlayerHeaderName = "PlayerHeader";
+ const string k_PlayerIdLabelName = "PlayerIdLabel";
+ const string k_PlayerJoinedLabelName = "PlayerJoinedLabel";
+ const string k_PlayerLastUpdatedLabelName = "PlayerLastUpdatedLabel";
+ const string k_PlayerPropertiesListName = "PlayerPropertiesList";
+
+ const string k_PlayerPropertiesHeaderText = "Player Properties";
+
+ const string k_PlayerPropertiesIdKeyName = "PlayerPropertiesIDKey";
+ const string k_PlayerPropertiesIdValueName = "PlayerPropertiesIDValue";
+ const string k_PlayerPropertiesIdVisibilityName = "PlayerPropertiesIDVisibility";
+
+ [CreateProperty, UxmlAttribute]
+ public string SessionType
+ {
+ get => m_SessionType;
+ set
+ {
+ if (m_SessionType == value)
+ {
+ return;
+ }
+
+ m_SessionType = value;
+ if (panel != null)
+ {
+ UpdateBindings();
+ }
+ }
+ }
+ string m_SessionType;
+
+ SessionInfoViewModel m_ViewModel;
+
+ readonly List m_Bindings = new();
+
+ public SessionInfoElement()
+ {
+ AddToClassList(BlocksTheme.FullWidth);
+
+ var sessionInfoHeader = new Label
+ {
+ name = k_SessionInfoHeaderName,
+ text = k_SessionInfoHeaderText
+ };
+ sessionInfoHeader.AddToClassList(BlocksTheme.Header);
+ sessionInfoHeader.AddToClassList(BlocksTheme.HeaderSpaceBottom);
+ Add(sessionInfoHeader);
+
+ var stateLabel = new Label();
+ stateLabel.AddToClassList(BlocksTheme.Header);
+ stateLabel.AddToClassList(BlocksTheme.HeaderXSmall);
+ stateLabel.AddToClassList(BlocksTheme.SpaceBottom);
+ var stateBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(SessionInfoViewModel.SessionState)),
+ bindingMode = BindingMode.ToTarget
+ };
+ stateLabel.SetBinding(new BindingId(nameof(stateLabel.text)), stateBinding);
+ Add(stateLabel);
+ m_Bindings.Add(stateBinding);
+
+ var scrollViewParent = new ScrollView();
+ scrollViewParent.AddToClassList(BlocksTheme.ScrollView);
+ var sessionContainerBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(SessionInfoViewModel.SessionInfoDisplayStyle)),
+ bindingMode = BindingMode.ToTarget,
+ };
+ scrollViewParent.SetBinding(new BindingId("style.display"), sessionContainerBinding);
+ Add(scrollViewParent);
+ m_Bindings.Add(sessionContainerBinding);
+
+ var sessionDataHeader = new Label
+ {
+ name = k_SessionDataHeaderName,
+ text = k_SessionDataHeaderText
+ };
+ sessionDataHeader.AddToClassList(BlocksTheme.Header);
+ sessionDataHeader.AddToClassList(BlocksTheme.HeaderSmall);
+ sessionDataHeader.AddToClassList(BlocksTheme.SpaceBottomSmall);
+ scrollViewParent.Add(sessionDataHeader);
+
+ var sessionIdLabel = new Label();
+ sessionIdLabel.AddToClassList(BlocksTheme.Label);
+ var sessionIdBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(SessionInfoViewModel.SessionId)),
+ bindingMode = BindingMode.ToTarget
+ };
+ sessionIdLabel.SetBinding(new BindingId(nameof(sessionIdLabel.text)), sessionIdBinding);
+ scrollViewParent.Add(sessionIdLabel);
+ m_Bindings.Add(sessionIdBinding);
+
+ var sessionNameLabel = new Label();
+ sessionNameLabel.AddToClassList(BlocksTheme.Label);
+ var sessionNameBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(SessionInfoViewModel.Name)),
+ bindingMode = BindingMode.ToTarget
+ };
+ sessionNameLabel.SetBinding(new BindingId(nameof(sessionNameLabel.text)), sessionNameBinding);
+ scrollViewParent.Add(sessionNameLabel);
+ m_Bindings.Add(sessionNameBinding);
+
+ var maxPlayersLabel = new Label();
+ maxPlayersLabel.AddToClassList(BlocksTheme.Label);
+ var maxPlayersBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(SessionInfoViewModel.MaxPlayers)),
+ bindingMode = BindingMode.ToTarget
+ };
+ maxPlayersLabel.SetBinding(new BindingId(nameof(maxPlayersLabel.text)), maxPlayersBinding);
+ scrollViewParent.Add(maxPlayersLabel);
+ m_Bindings.Add(maxPlayersBinding);
+
+ var isPrivateLabel = new Label();
+ isPrivateLabel.AddToClassList(BlocksTheme.Label);
+ var isPrivateBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(SessionInfoViewModel.IsPrivate)),
+ bindingMode = BindingMode.ToTarget
+ };
+ isPrivateLabel.SetBinding(new BindingId(nameof(isPrivateLabel.text)), isPrivateBinding);
+ scrollViewParent.Add(isPrivateLabel);
+ m_Bindings.Add(isPrivateBinding);
+
+ var isLockedLabel = new Label();
+ isLockedLabel.AddToClassList(BlocksTheme.Label);
+ var isLockedBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(SessionInfoViewModel.IsLocked)),
+ bindingMode = BindingMode.ToTarget
+ };
+ isLockedLabel.SetBinding(new BindingId(nameof(isLockedLabel.text)), isLockedBinding);
+ scrollViewParent.Add(isLockedLabel);
+ m_Bindings.Add(isLockedBinding);
+
+ var sessionCodeLabel = new Label();
+ sessionCodeLabel.AddToClassList(BlocksTheme.Label);
+ var sessionCodeBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(SessionInfoViewModel.SessionCode)),
+ bindingMode = BindingMode.ToTarget
+ };
+ sessionCodeLabel.SetBinding(new BindingId(nameof(sessionCodeLabel.text)), sessionCodeBinding);
+ scrollViewParent.Add(sessionCodeLabel);
+ m_Bindings.Add(sessionCodeBinding);
+
+ var hostIDLabel = new Label();
+ hostIDLabel.AddToClassList(BlocksTheme.Label);
+ var hostIDBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(SessionInfoViewModel.HostID)),
+ bindingMode = BindingMode.ToTarget
+ };
+ hostIDLabel.SetBinding(new BindingId(nameof(hostIDLabel.text)), hostIDBinding);
+ scrollViewParent.Add(hostIDLabel);
+ m_Bindings.Add(hostIDBinding);
+
+ var isHostLabel = new Label();
+ isHostLabel.AddToClassList(BlocksTheme.Label);
+ isHostLabel.AddToClassList(BlocksTheme.SpaceBottomSmall);
+ var isHostBinding = new DataBinding
+ {
+ dataSourcePath = new PropertyPath(nameof(SessionInfoViewModel.IsHost)),
+ bindingMode = BindingMode.ToTarget
+ };
+ isHostLabel.SetBinding(new BindingId(nameof(isHostLabel.text)), isHostBinding);
+ scrollViewParent.Add(isHostLabel);
+ m_Bindings.Add(isHostBinding);
+
+ var propertiesListView = new ListView
+ {
+ virtualizationMethod = CollectionVirtualizationMethod.DynamicHeight,
+ makeNoneElement = () =>
+ {
+ var label = new Label(k_ListIsEmptyLabel);
+ label.AddToClassList(BlocksTheme.Label);
+ return label;
+ },
+ makeHeader = () =>
+ {
+ var sessionPropertiesHeader = new Label
+ {
+ name = k_SessionPropertiesHeaderName,
+ text = k_SessionPropertiesHeaderText
+ };
+ sessionPropertiesHeader.AddToClassList(BlocksTheme.Header);
+ sessionPropertiesHeader.AddToClassList(BlocksTheme.HeaderXSmall);
+ sessionPropertiesHeader.AddToClassList(BlocksTheme.HeaderXSmall);
+ return sessionPropertiesHeader;
+ },
+ makeItem = () =>
+ {
+ var container = new VisualElement();
+ container.AddToClassList(BlocksTheme.Label);
+
+ var keyLabel = new Label
+ {
+ name = k_KeyLabelPropertyName
+ };
+ keyLabel.AddToClassList(BlocksTheme.Label);
+ container.Add(keyLabel);
+
+ var visibilityLabel = new Label
+ {
+ name = k_VisibilityLabelPropertyName
+ };
+ visibilityLabel.AddToClassList(BlocksTheme.Label);
+ container.Add(visibilityLabel);
+
+ var valueLabel = new Label
+ {
+ name = k_ValueLabelPropertyName
+ };
+ valueLabel.AddToClassList(BlocksTheme.Label);
+ container.Add(valueLabel);
+ return container;
+ },
+ bindItem = (element, index) =>
+ {
+ var sessionProperty = m_ViewModel.SessionProperties[index];
+
+ element.Q