Question by
Bloke28 · Oct 17, 2017 at 08:19 PM ·
networkingmultiplayertimer
How do I make the timer run from the server and sync to clients?
Using the following code I have a working countdown timer, but I want it to load only on the server and sync to clients.. any easy way to do this? At the moment it load separately on each users screen, with the server/host starting their timer first also means it ends first but I want it to end all at once, so a sync'd timer across the network?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class OnScreenTimer : NetworkBehaviour {
private bool showMessage = false;
private GUIStyle guiStyle = new GUIStyle();
public Font myFont;
private string guiMessageEndGame = "GAME OVER ";
public int Minutes = 0;
public int Seconds = 0;
private int score;
public Text m_text;
private float m_leftTime;
public GameObject[] Players;
private int lastScore = -1000;
private void Awake()
{
// m_text = GetComponent<Text>();
m_leftTime = GetInitialTime();
}
private void Update()
{
if (m_leftTime > 0f)
{
// Update countdown clock
m_leftTime -= Time.deltaTime;
Minutes = GetLeftMinutes();
Seconds = GetLeftSeconds();
// Show current clock
if (m_leftTime > 0f)
{
m_text.text = "Time : " + Minutes + ":" + Seconds.ToString("00");
}
else
{
// The countdown clock has finished
m_text.text = "Time : 0:00";
Debug.Log("SHOULD END GAME");
// GetComponent<HighScores>().Score = score;
score = gameObject.GetComponent<PlayerShoot>().score;
Debug.Log("Score is " + score);
checkForHighestScore();
GetComponent<HighScores>().GameOver(score);
showMessage = true;
}
}
}
private void checkForHighestScore()
{
// if (Players == null)
Players = GameObject.FindGameObjectsWithTag("Player");
foreach (GameObject Player in Players)
{
if (Player.GetComponent<PlayerShoot>().score > lastScore)
lastScore = score;
Debug.Log("Last Score is " + lastScore);
Debug.Log("Score is " + score);
}
if (gameObject.GetComponent<PlayerShoot>().score == lastScore)
{
guiMessageEndGame = "YOU WON! ";
}
// Instantiate(respawnPrefab, respawn.transform.position, respawn.transform.rotation);
}
private float GetInitialTime()
{
return Minutes * 60f + Seconds;
}
private int GetLeftMinutes()
{
return Mathf.FloorToInt(m_leftTime / 60f);
}
private int GetLeftSeconds()
{
return Mathf.FloorToInt(m_leftTime % 60f);
}
void OnGUI()
{
if (!showMessage)
return;
if (showMessage)
{
GUI.contentColor = Color.white;
guiStyle.fontSize = 50;
guiStyle.normal.textColor = Color.white;
GUI.skin.font = myFont;
GUI.Label(new Rect(Screen.width / 2 - 350, Screen.height / 2 - 125, 250, 50), "" + guiMessageEndGame + " " + score, guiStyle); // Message to show giant, Tiny or Normal Tank Mode
//GUI.Label(new Rect(100, 0, 300, 20), "Reloading!!"); // reloading message to screen for now.
}
}
}
Comment