From e0053d0e97070b95d3e43a567471548863740285 Mon Sep 17 00:00:00 2001 From: Jiwoo Jang Date: Thu, 17 Jan 2019 10:48:26 -0500 Subject: [PATCH] Got scene transitioning working while preserving network manager --- .../Scenes/{SandboxScene.unity => Game.unity} | 161 ++++++++++-------- ...andboxScene.unity.meta => Game.unity.meta} | 0 Assets/Scripts/Debug/DebugGameManager.cs | 112 ++++++------ Assets/Scripts/Match/MatchManager.cs | 20 ++- Assets/Scripts/Networking/NetworkManager.cs | 51 +++++- Assets/Scripts/UI/TransitionScreenUI.cs | 24 +-- Assets/Scripts/Utility/GameManager.cs | 19 +++ Assets/Scripts/Utility/GameManager.cs.meta | 11 ++ 8 files changed, 250 insertions(+), 148 deletions(-) rename Assets/Scenes/{SandboxScene.unity => Game.unity} (98%) rename Assets/Scenes/{SandboxScene.unity.meta => Game.unity.meta} (100%) mode change 100755 => 100644 create mode 100644 Assets/Scripts/Utility/GameManager.cs create mode 100644 Assets/Scripts/Utility/GameManager.cs.meta diff --git a/Assets/Scenes/SandboxScene.unity b/Assets/Scenes/Game.unity similarity index 98% rename from Assets/Scenes/SandboxScene.unity rename to Assets/Scenes/Game.unity index 5f4aa53..1844f22 100644 --- a/Assets/Scenes/SandboxScene.unity +++ b/Assets/Scenes/Game.unity @@ -168,12 +168,101 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1940540819} - - {fileID: 872393075} - {fileID: 135821057} - {fileID: 476014995} m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &122555015 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 122555016} + - component: {fileID: 122555019} + - component: {fileID: 122555018} + - component: {fileID: 122555017} + m_Layer: 5 + m_Name: BlackScreen + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &122555016 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 122555015} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1681634729} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!223 &122555017 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 122555015} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 1 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 100 + m_TargetDisplay: 0 +--- !u!114 &122555018 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 122555015} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &122555019 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 122555015} + m_CullTransparentMesh: 0 --- !u!1 &133828358 GameObject: m_ObjectHideFlags: 0 @@ -364,7 +453,7 @@ Transform: - {fileID: 1351792068} - {fileID: 1891517229} m_Father: {fileID: 38731889} - m_RootOrder: 2 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &135821058 MonoBehaviour: @@ -1035,7 +1124,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 38731889} - m_RootOrder: 3 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &476014996 MonoBehaviour: @@ -1776,71 +1865,6 @@ Transform: m_Father: {fileID: 918509547} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &872393074 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 872393075} - - component: {fileID: 872393077} - - component: {fileID: 872393076} - m_Layer: 0 - m_Name: Network Manager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &872393075 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 872393074} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 38731889} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &872393076 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 872393074} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b64137f77cc41d94fa6b1387327f6690, type: 3} - m_Name: - m_EditorClassIdentifier: - player1RoomPropertyKey: Player1 - player2RoomPropertyKey: Player2 - _playerPrefabName: DebugPlayer ---- !u!114 &872393077 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 872393074} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: aa584fbee541324448dd18d8409c7a41, type: 3} - m_Name: - m_EditorClassIdentifier: - ObservedComponentsFoldoutOpen: 1 - Group: 0 - prefixField: -1 - Synchronization: 0 - OwnershipTransfer: 0 - ObservedComponents: - - {fileID: 0} - viewIdField: 1 - InstantiationId: 1 - isRuntimeInstantiated: 0 --- !u!1 &918509546 GameObject: m_ObjectHideFlags: 0 @@ -2674,6 +2698,7 @@ RectTransform: - {fileID: 918509547} - {fileID: 1999053671} - {fileID: 1761507095} + - {fileID: 122555016} m_Father: {fileID: 210174635} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Scenes/SandboxScene.unity.meta b/Assets/Scenes/Game.unity.meta old mode 100755 new mode 100644 similarity index 100% rename from Assets/Scenes/SandboxScene.unity.meta rename to Assets/Scenes/Game.unity.meta diff --git a/Assets/Scripts/Debug/DebugGameManager.cs b/Assets/Scripts/Debug/DebugGameManager.cs index 5a5e7a2..4e6bead 100755 --- a/Assets/Scripts/Debug/DebugGameManager.cs +++ b/Assets/Scripts/Debug/DebugGameManager.cs @@ -24,62 +24,62 @@ public void Start() { _networkManager = NetworkManager.instance; } - if (_inputManager != null) { - // Subscribe to input events - _inputManager.gameInput.OnPrimaryButtonStarted += PrimaryButtonStartedHandler; - _inputManager.gameInput.OnPrimaryButtonEnded += PrimaryButtonEndedHandler; - _inputManager.gameInput.OnSecondaryButtonStarted += SecondaryButtonStartedHandler; - _inputManager.gameInput.OnSecondaryButtonEnded += SecondaryButtonEndedHandler; - } else { - Debug.LogError("Attempting to subscribe to input manager when it does not exist"); - } - - if (_networkManager != null) { - _networkManager.OnConnectedToPhotonMaster += OnConnectedToMaster; - _networkManager.OnConnectedToRoom += OnConnectedToRoom; - } + //if (_inputManager != null) { + // // Subscribe to input events + // _inputManager.gameInput.OnPrimaryButtonStarted += PrimaryButtonStartedHandler; + // _inputManager.gameInput.OnPrimaryButtonEnded += PrimaryButtonEndedHandler; + // _inputManager.gameInput.OnSecondaryButtonStarted += SecondaryButtonStartedHandler; + // _inputManager.gameInput.OnSecondaryButtonEnded += SecondaryButtonEndedHandler; + //} else { + // Debug.LogError("Attempting to subscribe to input manager when it does not exist"); + //} + + //if (_networkManager != null) { + // _networkManager.OnConnectedToPhotonMaster += OnConnectedToMaster; + // _networkManager.OnConnectedToRoom += OnConnectedToRoom; + //} } - public void OnDisable() { - if (_inputManager != null) { - // Unsubscribe from input events - _inputManager.gameInput.OnPrimaryButtonStarted -= PrimaryButtonStartedHandler; - _inputManager.gameInput.OnPrimaryButtonEnded -= PrimaryButtonEndedHandler; - _inputManager.gameInput.OnSecondaryButtonStarted -= SecondaryButtonStartedHandler; - _inputManager.gameInput.OnSecondaryButtonEnded -= SecondaryButtonEndedHandler; - } - - if (_networkManager != null) { - _networkManager.OnConnectedToPhotonMaster -= OnConnectedToMaster; - _networkManager.OnConnectedToRoom -= OnConnectedToRoom; - } - } - - public override void OnConnectedToMaster() { - _networkManager.JoinOrCreateRoom("DebugRoom"); - } - - private void OnConnectedToRoom(string roomName) { - //_networkManager.InstantiatePlayerPrefab(); - } - - private void PrimaryButtonStartedHandler(HardwareInput sender) { - //Debug.Log("Primary Button Started"); - } - - private void PrimaryButtonEndedHandler(HardwareInput sender) { - //Debug.Log("Primary Button Ended"); - } - - private void SecondaryButtonStartedHandler(HardwareInput sender) { - //Debug.Log("Secondary Button Started"); - } - - private void SecondaryButtonEndedHandler(HardwareInput sender) { - //Debug.Log("Secondary Button Ended"); - } - - public override void OnPlayerEnteredRoom(Player newPlayer) { - MatchManager.instance.RemoteInitializeRound(); - } + //public void OnDisable() { + // if (_inputManager != null) { + // // Unsubscribe from input events + // _inputManager.gameInput.OnPrimaryButtonStarted -= PrimaryButtonStartedHandler; + // _inputManager.gameInput.OnPrimaryButtonEnded -= PrimaryButtonEndedHandler; + // _inputManager.gameInput.OnSecondaryButtonStarted -= SecondaryButtonStartedHandler; + // _inputManager.gameInput.OnSecondaryButtonEnded -= SecondaryButtonEndedHandler; + // } + + // if (_networkManager != null) { + // _networkManager.OnConnectedToPhotonMaster -= OnConnectedToMaster; + // _networkManager.OnConnectedToRoom -= OnConnectedToRoom; + // } + //} + + //public override void OnConnectedToMaster() { + // _networkManager.JoinOrCreateRoom("DebugRoom"); + //} + + //private void OnConnectedToRoom(string roomName) { + // //_networkManager.InstantiatePlayerPrefab(); + //} + + //private void PrimaryButtonStartedHandler(HardwareInput sender) { + // //Debug.Log("Primary Button Started"); + //} + + //private void PrimaryButtonEndedHandler(HardwareInput sender) { + // //Debug.Log("Primary Button Ended"); + //} + + //private void SecondaryButtonStartedHandler(HardwareInput sender) { + // //Debug.Log("Secondary Button Started"); + //} + + //private void SecondaryButtonEndedHandler(HardwareInput sender) { + // //Debug.Log("Secondary Button Ended"); + //} + + //public override void OnPlayerEnteredRoom(Player newPlayer) { + // MatchManager.instance.RemoteInitializeRound(); + //} } diff --git a/Assets/Scripts/Match/MatchManager.cs b/Assets/Scripts/Match/MatchManager.cs index 07b118b..ba5b949 100644 --- a/Assets/Scripts/Match/MatchManager.cs +++ b/Assets/Scripts/Match/MatchManager.cs @@ -242,15 +242,21 @@ public void StartRoundTimerSynchronization() { // There should only be one other player in this list // Ping in this situation is RTT // Note this value could overflow to negative - int otherPlayerPing = (int)PhotonNetwork.PlayerListOthers[0].CustomProperties["Ping"]; - int thisPlayerPing = PhotonNetwork.GetPing(); - // Whichever player has the higher ping, use their ping as the delay to start the timer - int delayPing = (otherPlayerPing > thisPlayerPing) ? otherPlayerPing : thisPlayerPing; + // Cache value for validation + Photon.Realtime.Player[] otherPlayerList = PhotonNetwork.PlayerListOthers; - // Note there may be discrepancy if the ping of the other client changes significantly within the time to recieve this RPC - // Buffer this by double so that the client with the highest ping will not have to start the timer right away - photonView.RPC("HandleRoundTimerStartSynchronization", RpcTarget.AllViaServer, PhotonNetwork.ServerTimestamp, 2 * delayPing); + if (otherPlayerList.Length > 0) { + int otherPlayerPing = (int)otherPlayerList[0].CustomProperties["Ping"]; + int thisPlayerPing = PhotonNetwork.GetPing(); + + // Whichever player has the higher ping, use their ping as the delay to start the timer + int delayPing = (otherPlayerPing > thisPlayerPing) ? otherPlayerPing : thisPlayerPing; + + // Note there may be discrepancy if the ping of the other client changes significantly within the time to recieve this RPC + // Buffer this by double so that the client with the highest ping will not have to start the timer right away + photonView.RPC("HandleRoundTimerStartSynchronization", RpcTarget.AllViaServer, PhotonNetwork.ServerTimestamp, 2 * delayPing); + } } } diff --git a/Assets/Scripts/Networking/NetworkManager.cs b/Assets/Scripts/Networking/NetworkManager.cs index e3eb3e0..ee2bf02 100644 --- a/Assets/Scripts/Networking/NetworkManager.cs +++ b/Assets/Scripts/Networking/NetworkManager.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.SceneManagement; using KickDive.Match; using Photon.Realtime; using ExitGames.Client.Photon; @@ -11,6 +12,12 @@ namespace Photon.Pun { public class NetworkManager : MonoBehaviourPunCallbacks, IOnEventCallback { + private enum NetworkManagerState { + None, + InMenu, + InGame + } + public static NetworkManager instance; public static PlayerNumber playerNumber = PlayerNumber.None; @@ -35,18 +42,25 @@ public class NetworkManager : MonoBehaviourPunCallbacks, IOnEventCallback { private string _playerPrefabName; private string _gameVersion = "1.0"; private readonly byte startGameEventCode = 0; + private NetworkManagerState _lifeCycleState; - private PhotonView _playerPrefabPhotonView; - private MatchManager _matchManagerInstace; + private PhotonView _playerPrefabPhotonView; + private MatchManager _matchManagerInstace; public override void OnEnable() { // Register the manager as a callback reciever PhotonNetwork.AddCallbackTarget(this); + + // For intialization when we load the game scene + SceneManager.sceneLoaded += OnSceneLoaded; } public override void OnDisable() { // Unregister manager on disable PhotonNetwork.RemoveCallbackTarget(this); + + // Unregister scene initialization + SceneManager.sceneLoaded -= OnSceneLoaded; } private void Awake() { @@ -59,6 +73,32 @@ private void Awake() { Debug.Log("Found an existing instance of the NetworkManager, destroying this one"); DestroyImmediate(this); } + + _lifeCycleState = NetworkManagerState.InMenu; + } + + private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { + // Only for when we are loading into the game + if (_lifeCycleState == NetworkManagerState.InGame) { + InitializeGameNetworkManager(); + } + } + + private void InitializeGameNetworkManager() { + if (MatchManager.instance != null) { + _matchManagerInstace = MatchManager.instance; + + // Do this BEFORE player prefab instantiation + _matchManagerInstace.SetPlayerSpawn(playerNumber); + } else { + Debug.LogError("NetworkManager cannot find MatchManager"); + } + + // Start the player! + if (isConnectedToMaster && isConnectedToRoom) { + InstantiatePlayerPrefab(); + _matchManagerInstace.RemoteInitializeRound(); + } } public void ConnectToMaster() { @@ -136,11 +176,6 @@ public override void OnJoinedRoom() { Debug.Log("Joined as Player Number: " + playerNumber); - // TODO: Move these to a new initialization method once network connection between scenes is working - //_matchManagerInstace.SetPlayerSpawn(playerNumber); - - //InstantiatePlayerPrefab(); - // Fire Event if (OnConnectedToRoom != null) OnConnectedToRoom(PhotonNetwork.CurrentRoom.Name); @@ -169,6 +204,8 @@ public void OnEvent(EventData photonEvent) { // Load the game scene if (photonEvent.Code == 0) { Debug.Log("Photon start game event recieved!"); + _lifeCycleState = NetworkManagerState.InGame; + SceneManager.LoadScene(1, LoadSceneMode.Single); } } diff --git a/Assets/Scripts/UI/TransitionScreenUI.cs b/Assets/Scripts/UI/TransitionScreenUI.cs index b783de7..88a440b 100644 --- a/Assets/Scripts/UI/TransitionScreenUI.cs +++ b/Assets/Scripts/UI/TransitionScreenUI.cs @@ -18,7 +18,7 @@ private enum TransitionState { FadeOut, FadeIn } - + [SerializeField] private Image _image; @@ -62,11 +62,9 @@ private GameObject GetStageGameObject(MenuStages stage) { case MenuStages.RoomName: { return _roomName; } + default: + return null; } - - // Return some empty value - Debug.LogError("Could not return a GameObject for provided MenuStage"); - return null; } // Transition FROM black @@ -76,12 +74,18 @@ private void FadeOutComplete() { // Transition TO Black private void FadeInComplete() { - GetStageGameObject(_currentStage).SetActive(false); - GetStageGameObject(_nextStage).SetActive(true); - // Update stage states - _currentStage = _nextStage; - _nextStage = MenuStages.None; + GameObject currentStageGameObject = GetStageGameObject(_currentStage); + GameObject nextStageGameObject = GetStageGameObject(_nextStage); + + if (currentStageGameObject != null && nextStageGameObject != null) { + currentStageGameObject.SetActive(false); + nextStageGameObject.SetActive(true); + + // Update stage states + _currentStage = _nextStage; + _nextStage = MenuStages.None; + } _state = TransitionState.FadeOut; } diff --git a/Assets/Scripts/Utility/GameManager.cs b/Assets/Scripts/Utility/GameManager.cs new file mode 100644 index 0000000..7eac699 --- /dev/null +++ b/Assets/Scripts/Utility/GameManager.cs @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +public class GameManager : MonoBehaviour { + + Image _blackScreenImage; + + // Use this for initialization + void Start () { + + } + + // Update is called once per frame + void Update () { + + } +} diff --git a/Assets/Scripts/Utility/GameManager.cs.meta b/Assets/Scripts/Utility/GameManager.cs.meta new file mode 100644 index 0000000..aa16983 --- /dev/null +++ b/Assets/Scripts/Utility/GameManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 78ac134e7e88daf4c9f76e4ba71bea52 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: