Jo Jo funguje Kappa

This commit is contained in:
Dominik G.
2025-10-06 18:15:27 +02:00
parent 807e8fc5f3
commit 515160b1ec
11 changed files with 3103 additions and 76 deletions

View File

@@ -13,4 +13,14 @@ MonoBehaviour:
m_Name: DefaultNetworkPrefabs
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkPrefabsList
IsDefault: 1
List: []
List:
- Override: 0
Prefab: {fileID: 7059514996416789454, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 2809934685114486836, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}

View File

@@ -0,0 +1,133 @@
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
// Project namespaces
using MegaKoop.Steam; // SteamManager, SteamLobbyService
using MegaKoop.Game.Networking; // SteamCoopNetworkManager, SteamP2PTransport, LobbyGameSceneCoordinator
public static class CharacterSceneSetupGenerator
{
private const string WizardPrefabPath = "Assets/Game/Hero/Wizard.prefab";
[MenuItem("Tools/MegaKoop/Setup Character Scene Objects", priority = 1000)]
public static void SetupCharacterScene()
{
var scene = SceneManager.GetActiveScene();
if (!scene.IsValid())
{
EditorUtility.DisplayDialog("Character Scene Setup", "No valid scene is open. Please open your CharacterScene and run again.", "OK");
return;
}
Undo.IncrementCurrentGroup();
int group = Undo.GetCurrentGroup();
// 1) Ensure SteamServices root and required components
var servicesRoot = GameObject.Find("SteamServices");
if (servicesRoot == null)
{
servicesRoot = new GameObject("SteamServices");
Undo.RegisterCreatedObjectUndo(servicesRoot, "Create SteamServices");
}
EnsureComponent<SteamManager>(servicesRoot, "Add SteamManager");
var lobby = EnsureComponent<SteamLobbyService>(servicesRoot, "Add SteamLobbyService");
var coop = EnsureComponent<SteamCoopNetworkManager>(servicesRoot, "Add SteamCoopNetworkManager");
EnsureComponent<SteamP2PTransport>(servicesRoot, "Add SteamP2PTransport");
var coordinator = EnsureComponent<LobbyGameSceneCoordinator>(servicesRoot, "Add LobbyGameSceneCoordinator");
// Keep servicesRoot persistent across scenes to match runtime behavior
if (!Application.isPlaying)
{
// Editor-time: mark as DontSaveInBuild is not needed; users expect this object in scene.
// At runtime, code calls DontDestroyOnLoad itself.
}
// 2) Ensure Wizard template exists in scene root
var wizardInScene = GameObject.Find("Wizard");
if (wizardInScene == null)
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(WizardPrefabPath);
if (prefab != null)
{
var instantiated = PrefabUtility.InstantiatePrefab(prefab, scene) as GameObject;
if (instantiated != null)
{
Undo.RegisterCreatedObjectUndo(instantiated, "Instantiate Wizard Template");
instantiated.name = "Wizard"; // Ensure exact name for coordinator lookup
instantiated.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
}
}
else
{
// Fallback: create a simple placeholder
var placeholder = GameObject.CreatePrimitive(PrimitiveType.Capsule);
Undo.RegisterCreatedObjectUndo(placeholder, "Create Wizard Placeholder");
placeholder.name = "Wizard";
placeholder.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
// Controller components are optional for template; coordinator will add bridges on clones.
placeholder.AddComponent<CharacterController>();
placeholder.AddComponent<MegaKoop.Game.ThirdPersonCharacterController>();
}
}
// 3) Optional: ensure a basic ground so CharacterController can stand
if (GameObject.Find("Ground") == null)
{
var ground = GameObject.CreatePrimitive(PrimitiveType.Plane);
Undo.RegisterCreatedObjectUndo(ground, "Create Ground");
ground.name = "Ground";
ground.transform.position = Vector3.zero;
ground.transform.localScale = Vector3.one * 2f;
}
// 4) Optional: ensure there is at least one light
if (Object.FindObjectOfType<Light>() == null)
{
var lightGO = new GameObject("Directional Light");
Undo.RegisterCreatedObjectUndo(lightGO, "Create Directional Light");
var light = lightGO.AddComponent<Light>();
light.type = LightType.Directional;
light.intensity = 1.1f;
lightGO.transform.rotation = Quaternion.Euler(50f, -30f, 0f);
}
// 5) Hint coordinator to use current scene name if it differs
if (coordinator != null)
{
// If you want the coordinator to target this scene specifically, uncomment the next line:
// SetPrivateField(coordinator, "characterSceneName", scene.name);
}
EditorSceneManager.MarkSceneDirty(scene);
Undo.CollapseUndoOperations(group);
EditorUtility.DisplayDialog("Character Scene Setup", "Character scene objects have been set up successfully.", "OK");
}
private static T EnsureComponent<T>(GameObject go, string undoName) where T : Component
{
var c = go.GetComponent<T>();
if (c == null)
{
c = Undo.AddComponent<T>(go);
}
return c;
}
// Example helper if you later want to set private serialized fields via reflection
private static void SetPrivateField(object target, string fieldName, object value)
{
var t = target.GetType();
var f = t.GetField(fieldName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (f != null)
{
f.SetValue(target, value);
EditorUtility.SetDirty((Object)target);
}
}
}
#endif

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 78e4bcab8a4eb484f99e4ef14054c921

2602
Game/Hero/Wizard 2.0.prefab Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ae082cf2d3a36684fb23d8ec0e643150
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1857,6 +1857,8 @@ GameObject:
- component: {fileID: -6761485100369211516}
- component: {fileID: -2990689074187600234}
- component: {fileID: 7618815643042096284}
- component: {fileID: 2662658783078050447}
- component: {fileID: 2417536914360261273}
m_Layer: 0
m_Name: Wizard
m_TagString: Untagged
@@ -2019,6 +2021,77 @@ CapsuleCollider:
m_Height: 2.0070767
m_Direction: 1
m_Center: {x: 0, y: 0.9898484, z: 0}
--- !u!114 &2662658783078050447
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7059514996416789454}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject
GlobalObjectIdHash: 913186323
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
SyncOwnerTransformWhenParented: 1
AllowOwnerToParent: 0
--- !u!114 &2417536914360261273
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7059514996416789454}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkTransform
ShowTopMostFoldoutHeaderGroup: 1
NetworkTransformExpanded: 0
AutoOwnerAuthorityTickOffset: 1
PositionInterpolationType: 0
RotationInterpolationType: 0
ScaleInterpolationType: 0
PositionLerpSmoothing: 1
PositionMaxInterpolationTime: 0.1
RotationLerpSmoothing: 1
RotationMaxInterpolationTime: 0.1
ScaleLerpSmoothing: 1
ScaleMaxInterpolationTime: 0.1
AuthorityMode: 1
TickSyncChildren: 0
UseUnreliableDeltas: 0
SyncPositionX: 1
SyncPositionY: 1
SyncPositionZ: 1
SyncRotAngleX: 1
SyncRotAngleY: 1
SyncRotAngleZ: 1
SyncScaleX: 1
SyncScaleY: 1
SyncScaleZ: 1
PositionThreshold: 0.001
RotAngleThreshold: 0.01
ScaleThreshold: 0.01
UseQuaternionSynchronization: 0
UseQuaternionCompression: 0
UseHalfFloatPrecision: 0
InLocalSpace: 0
SwitchTransformSpaceWhenParented: 0
Interpolate: 1
SlerpPosition: 0
--- !u!1 &7094911519708027617
GameObject:
m_ObjectHideFlags: 0

View File

@@ -17,6 +17,8 @@ namespace MegaKoop.Game.Networking
[DefaultExecutionOrder(-500)]
public class LobbyGameSceneCoordinator : MonoBehaviour
{
private static LobbyGameSceneCoordinator Instance;
[SerializeField] private string characterSceneName = "CharacterScene";
[SerializeField] private float spawnRadius = 3f;
[SerializeField] private float minimumSpawnSpacing = 2.5f;
@@ -28,6 +30,14 @@ namespace MegaKoop.Game.Networking
private void Awake()
{
// Singleton to avoid double spawners (e.g., one from DontDestroyOnLoad and one from scene contents)
if (Instance != null && Instance != this)
{
// Another coordinator already exists and persists; remove this duplicate.
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
SceneManager.sceneLoaded += HandleSceneLoaded;
}
@@ -58,7 +68,12 @@ namespace MegaKoop.Game.Networking
}
else
{
// Already in the target scene (e.g., during hot reload).
// Already in the target scene (e.g., during hot reload). Avoid double-spawn.
if (hasSpawned)
{
Debug.Log("[LobbyGameSceneCoordinator] BeginGame called but players already spawned; ignoring.");
return;
}
loadPending = false;
hasSpawned = false;
SpawnPlayersInScene(SceneManager.GetActiveScene());
@@ -131,11 +146,13 @@ namespace MegaKoop.Game.Networking
hasSpawned = true;
// Proactively remove any previously spawned character clones (e.g., from a duplicate coordinator)
DespawnExistingClones(scene, template);
Vector3 basePosition = template.transform.position;
Quaternion baseRotation = template.transform.rotation;
Transform parent = template.transform.parent;
// Hide template so only spawned copies are visible.
template.SetActive(false);
int total = Mathf.Max(1, pendingPlayers.Count);
@@ -155,6 +172,28 @@ namespace MegaKoop.Game.Networking
}
}
private static void DespawnExistingClones(Scene scene, GameObject template)
{
// Destroy any GameObjects in the scene that look like spawned player avatars, excluding the template hierarchy.
foreach (var root in scene.GetRootGameObjects())
{
// Skip the template root itself
if (root == template) continue;
// Heuristic: if it has a SteamCharacterNetworkBridge or ThirdPersonCharacterController, treat it as a character clone
var bridge = root.GetComponentInChildren<SteamCharacterNetworkBridge>(true);
var tpc = root.GetComponentInChildren<ThirdPersonCharacterController>(true);
if (bridge != null || tpc != null)
{
// Avoid deleting the template if nested under a different root (shouldn't happen)
if (!template.transform.IsChildOf(root.transform) && !root.transform.IsChildOf(template.transform))
{
UnityEngine.Object.Destroy(root);
}
}
}
}
private static GameObject FindWizardTemplate(Scene scene)
{
foreach (var root in scene.GetRootGameObjects())

View File

@@ -19,7 +19,11 @@ namespace MegaKoop.Game.Networking
private void Update()
{
#if STEAMWORKSNET
if (!MegaKoop.Steam.SteamManager.Initialized)
#else
if (!SteamBootstrap.IsInitialized)
#endif
{
return;
}
@@ -34,7 +38,11 @@ namespace MegaKoop.Game.Networking
public void Send(CSteamID recipient, NetworkMessageType type, byte[] payload, EP2PSend sendType = EP2PSend.k_EP2PSendReliable)
{
#if STEAMWORKSNET
if (!MegaKoop.Steam.SteamManager.Initialized)
#else
if (!SteamBootstrap.IsInitialized)
#endif
{
return;
}

View File

@@ -499,63 +499,109 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: b5051c49d05768c73a8c42e1967fe4b2, type: 3}
--- !u!1001 &1563379673
PrefabInstance:
--- !u!1 &1706180857
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1706180863}
- component: {fileID: 1706180862}
- component: {fileID: 1706180861}
- component: {fileID: 1706180860}
- component: {fileID: 1706180859}
- component: {fileID: 1706180858}
m_Layer: 0
m_Name: SteamServices
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1706180858
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1706180857}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 46f2c531c179d29e39aa831ff5290c20, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.Networking.LobbyGameSceneCoordinator
characterSceneName: CharacterScene
spawnRadius: 3
minimumSpawnSpacing: 2.5
--- !u!114 &1706180859
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1706180857}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c3923950963f6f6a98a81fda48267e6e, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.Networking.SteamP2PTransport
defaultSendType: 2
listenChannel: 0
--- !u!114 &1706180860
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1706180857}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 83320aed3c99a87b692932447a34631e, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.Networking.SteamCoopNetworkManager
lobbyManager: {fileID: 0}
p2pTransport: {fileID: 0}
--- !u!114 &1706180861
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1706180857}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4845f8cb316c7f740b1c39a4a21e4174, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Steam.SteamLobbyService
--- !u!114 &1706180862
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1706180857}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c571869ecd8ac364d8c6fc0c27a36a4b, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Steam.SteamManager
--- !u!4 &1706180863
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1706180857}
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 1117541129888199087, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_LocalPosition.x
value: 6.9005165
objectReference: {fileID: 0}
- target: {fileID: 1117541129888199087, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_LocalPosition.y
value: 0.00000023841858
objectReference: {fileID: 0}
- target: {fileID: 1117541129888199087, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_LocalPosition.z
value: -2.1558924
objectReference: {fileID: 0}
- target: {fileID: 1117541129888199087, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1117541129888199087, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1117541129888199087, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1117541129888199087, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1117541129888199087, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1117541129888199087, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1117541129888199087, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7059514996416789454, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
propertyPath: m_Name
value: Wizard
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: fe75fe22781f92b369675fdfc9657f7d, type: 3}
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!1001 &1770640151
PrefabInstance:
m_ObjectHideFlags: 0
@@ -855,6 +901,75 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &8888013435869854006
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 2809934685114486836, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_Name
value: Wizard
objectReference: {fileID: 0}
- target: {fileID: 2809934685114486836, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3969508485497161681, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: GlobalObjectIdHash
value: 3747971393
objectReference: {fileID: 0}
- target: {fileID: 3969508485497161681, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: InScenePlacedSourceGlobalObjectIdHash
value: 614518350
objectReference: {fileID: 0}
- target: {fileID: 7143292874099811358, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_LocalPosition.x
value: 6.9005165
objectReference: {fileID: 0}
- target: {fileID: 7143292874099811358, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_LocalPosition.y
value: 0.00000023841858
objectReference: {fileID: 0}
- target: {fileID: 7143292874099811358, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_LocalPosition.z
value: -2.1558924
objectReference: {fileID: 0}
- target: {fileID: 7143292874099811358, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7143292874099811358, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7143292874099811358, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7143292874099811358, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7143292874099811358, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7143292874099811358, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7143292874099811358, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: ae082cf2d3a36684fb23d8ec0e643150, type: 3}
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
@@ -867,4 +982,5 @@ SceneRoots:
- {fileID: 1857588276}
- {fileID: 196170898}
- {fileID: 1770640151}
- {fileID: 1563379673}
- {fileID: 8888013435869854006}
- {fileID: 1706180863}

View File

@@ -45,6 +45,8 @@ namespace MegaKoop.UI
private Button applyButton;
private Button backButton;
private bool _initialized;
private void OnEnable()
{
// Získání UI Document
@@ -57,11 +59,11 @@ namespace MegaKoop.UI
enabled = false;
return;
}
// Získání MultiplayerLobbyController
if (multiplayerLobbyController == null)
multiplayerLobbyController = GetComponent<MultiplayerLobbyController>();
root = uiDocument.rootVisualElement;
if (root == null)
{
@@ -69,20 +71,34 @@ namespace MegaKoop.UI
enabled = false;
return;
}
// Initialize only after attached to a panel to avoid DPI/pixelsPerPoint issues
root.RegisterCallback<AttachToPanelEvent>(OnAttachedToPanel);
if (root.panel != null)
{
// Already attached (domain reload case)
OnAttachedToPanel(default);
}
}
private void OnAttachedToPanel(AttachToPanelEvent evt)
{
if (_initialized) return;
_initialized = true;
// Přidání USS stylů (pokud nejsou už v UXML)
if (mainMenuStyles != null && !root.styleSheets.Contains(mainMenuStyles))
{
root.styleSheets.Add(mainMenuStyles);
}
// Inicializace UI elementů
InitializeMenuButtons();
InitializeSettingsPanel();
// Registrace event handlerů
RegisterButtonEvents();
// Načtení nastavení
LoadSettings();
}

View File

@@ -80,24 +80,45 @@ namespace MegaKoop.UI
// Steam Integration
private SteamLobbyService steam;
private bool _initialized;
private void Start()
{
if (uiDocument == null)
uiDocument = GetComponent<UIDocument>();
if (uiDocument != null)
{
root = uiDocument.rootVisualElement;
InitializeElements();
RegisterEvents();
EnsureSteamServices();
RegisterSteamEvents();
SetupInitialState();
}
else
if (uiDocument == null)
{
Debug.LogError("UIDocument not found on MultiplayerLobbyController!");
return;
}
root = uiDocument.rootVisualElement;
if (root == null)
{
Debug.LogError("rootVisualElement is null on MultiplayerLobbyController!");
return;
}
// Initialize only after attached to a panel to avoid DPI/pixelsPerPoint issues
root.RegisterCallback<AttachToPanelEvent>(OnAttachedToPanel);
if (root.panel != null)
{
// Already attached (domain reload case)
OnAttachedToPanel(default);
}
}
private void OnAttachedToPanel(AttachToPanelEvent evt)
{
if (_initialized) return;
_initialized = true;
InitializeElements();
RegisterEvents();
EnsureSteamServices();
RegisterSteamEvents();
SetupInitialState();
}
private void OnDisable()