Pun-01/Assets/Photon/PhotonUnityNetworking/Demos/PunBasics-Tutorial/Scripts/GameManager.cs

174 lines
4.7 KiB
C#
Raw Permalink Normal View History

2022-07-08 09:14:55 +08:00
// --------------------------------------------------------------------------------------------------------------------
// <copyright file="Launcher.cs" company="Exit Games GmbH">
// Part of: Photon Unity Networking Demos
// </copyright>
// <summary>
// Used in "PUN Basic tutorial" to handle typical game management requirements
// </summary>
// <author>developer@exitgames.com</author>
// --------------------------------------------------------------------------------------------------------------------
using UnityEngine;
using UnityEngine.SceneManagement;
using Photon.Realtime;
namespace Photon.Pun.Demo.PunBasics
{
#pragma warning disable 649
/// <summary>
/// Game manager.
/// Connects and watch Photon Status, Instantiate Player
/// Deals with quiting the room and the game
/// Deals with level loading (outside the in room synchronization)
/// </summary>
public class GameManager : MonoBehaviourPunCallbacks
{
#region Public Fields
static public GameManager Instance;
#endregion
#region Private Fields
private GameObject instance;
[Tooltip("The prefab to use for representing the player")]
[SerializeField]
private GameObject playerPrefab;
#endregion
#region MonoBehaviour CallBacks
/// <summary>
/// MonoBehaviour method called on GameObject by Unity during initialization phase.
/// </summary>
void Start()
{
Instance = this;
// in case we started this demo with the wrong scene being active, simply load the menu scene
if (!PhotonNetwork.IsConnected)
{
SceneManager.LoadScene("PunBasics-Launcher");
return;
}
if (playerPrefab == null) { // #Tip Never assume public properties of Components are filled up properly, always check and inform the developer of it.
Debug.LogError("<Color=Red><b>Missing</b></Color> playerPrefab Reference. Please set it up in GameObject 'Game Manager'", this);
} else {
if (PlayerManager.LocalPlayerInstance==null)
{
Debug.LogFormat("We are Instantiating LocalPlayer from {0}", SceneManagerHelper.ActiveSceneName);
// we're in a room. spawn a character for the local player. it gets synced by using PhotonNetwork.Instantiate
PhotonNetwork.Instantiate(this.playerPrefab.name, new Vector3(0f,5f,0f), Quaternion.identity, 0);
}else{
Debug.LogFormat("Ignoring scene load for {0}", SceneManagerHelper.ActiveSceneName);
}
}
}
/// <summary>
/// MonoBehaviour method called on GameObject by Unity on every frame.
/// </summary>
void Update()
{
// "back" button of phone equals "Escape". quit app if that's pressed
if (Input.GetKeyDown(KeyCode.Escape))
{
QuitApplication();
}
}
#endregion
#region Photon Callbacks
/// <summary>
/// Called when a Photon Player got connected. We need to then load a bigger scene.
/// </summary>
/// <param name="other">Other.</param>
public override void OnPlayerEnteredRoom( Player other )
{
Debug.Log( "OnPlayerEnteredRoom() " + other.NickName); // not seen if you're the player connecting
if ( PhotonNetwork.IsMasterClient )
{
Debug.LogFormat( "OnPlayerEnteredRoom IsMasterClient {0}", PhotonNetwork.IsMasterClient ); // called before OnPlayerLeftRoom
LoadArena();
}
}
/// <summary>
/// Called when a Photon Player got disconnected. We need to load a smaller scene.
/// </summary>
/// <param name="other">Other.</param>
public override void OnPlayerLeftRoom( Player other )
{
Debug.Log( "OnPlayerLeftRoom() " + other.NickName ); // seen when other disconnects
if ( PhotonNetwork.IsMasterClient )
{
Debug.LogFormat( "OnPlayerEnteredRoom IsMasterClient {0}", PhotonNetwork.IsMasterClient ); // called before OnPlayerLeftRoom
LoadArena();
}
}
/// <summary>
/// Called when the local player left the room. We need to load the launcher scene.
/// </summary>
public override void OnLeftRoom()
{
SceneManager.LoadScene("PunBasics-Launcher");
}
#endregion
#region Public Methods
public void LeaveRoom()
{
PhotonNetwork.LeaveRoom();
}
public void QuitApplication()
{
Application.Quit();
}
#endregion
#region Private Methods
void LoadArena()
{
if ( ! PhotonNetwork.IsMasterClient )
{
Debug.LogError( "PhotonNetwork : Trying to Load a level but we are not the master Client" );
}
Debug.LogFormat( "PhotonNetwork : Loading Level : {0}", PhotonNetwork.CurrentRoom.PlayerCount );
PhotonNetwork.LoadLevel("PunBasics-Room for "+PhotonNetwork.CurrentRoom.PlayerCount);
}
#endregion
}
}