1
This repository has been archived on 2025-03-15. You can view files and clone it, but cannot push or open issues or pull requests.
unity-vr-portoflio/Assets/04 - Scripts/ApplicationManager.cs
2025-03-15 20:02:21 +01:00

280 lines
7.7 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ApplicationManager : MonoBehaviour {
// create a state enum
public enum ApplicationState
{
initApplication,
checkForContentUpdate,
waitForServerResonse,
downloadContentUpdate,
installContentUpdate,
running,
changeScene,
initScene,
exitScene,
savingConfigurations,
loadingConfigurations,
enterPauseApplication,
pauseApplication,
resumeApplication,
exitApplication
}
#region Public Attributes
// global instance of the application manager
public static ApplicationManager instance = null;
// debug
public ApplicationState CurrentState { get { return _currentState; } }
#endregion
#region Private Attributes
// private attribute for the update check URL
private string updateURL = "http://www.evolut.studio/vrapp/index.php";
private string updateUsername = "tester@vrapp";
private string updatePassword = "EvolutStudioVR";
// private attribute for tracking the current application state
private ApplicationState _currentState = ApplicationState.initApplication;
// private attribute for the current SceneManager
private SceneManager currentSceneManager;
// private attribute for the current SceneController
private SceneController currentSceneController;
// private attribute for new scene name to load next
private string requestedSceneNameToLoad;
// private attribute for the update notification
GameObject updateNotification = null;
#endregion
#region Public Functions
// set the given scene manager as the current instance of SceneManager
public void registerSceneManagerAndController(SceneManager cSceneManager, SceneController cSceneController)
{
currentSceneManager = cSceneManager;
currentSceneController = cSceneController;
}
// global function for changing scene
public void registerSceneChange(string requestedSceneName)
{
// register new scene name to load next
requestedSceneNameToLoad = requestedSceneName;
// change current state to exitScene
_currentState = ApplicationState.exitScene;
}
#endregion
#region Private Functions
// init application
void InitApplication()
{
//TODO: other things for init
// check if the application runs for the first time
if(!PlayerPrefs.HasKey("Settings"))
{
//TODO: load default_settings.json into the new created key "Settings"
}
//TODO: check for firsttime running and load default configuration
// change the current state to running
_currentState = ApplicationState.checkForContentUpdate;
}
void CheckForContentUpdate()
{
// start coroutine until response
StartCoroutine(startServerRequest());
// instantiate the update notification prefab
//updateNotification = Instantiate(Resources.Load("UpdateNotification", typeof(GameObject))) as GameObject;
// change the current state to wait for server response
_currentState = ApplicationState.waitForServerResonse;
}
IEnumerator startServerRequest()
{
// Create a Web Form
WWWForm form = new WWWForm();
form.AddField("username", updateUsername);
form.AddField("password", updatePassword);
// start a request to update server
WWW w = new WWW(updateURL, form);
// wait for request
yield return w;
// check response from server
if (!string.IsNullOrEmpty(w.error))
{
Debug.Log(w.error);
}
else
{
// create a new update model from server response
UpdateModel update = UpdateModel.CreateModelFromJSON(w.text);
// TODO: Antwort auswerten
//zwei fälle entweder update=true --> downloadContentUpdate
// oder update=false --> running
//currentState = ApplicationState.running;
Debug.Log(w.text);
Debug.Log(update.description);
Debug.Log(update.version);
}
}
void InitScene()
{
// Call initScene from current SceneManager
currentSceneManager.initScene();
// change current State to running
_currentState = ApplicationState.running;
}
void ExitScene()
{
// save scene data
//TODO
// change current state to changeScene
_currentState = ApplicationState.changeScene;
}
void ChangeScene()
{
// load scene from given name
UnityEngine.SceneManagement.SceneManager.LoadScene(requestedSceneNameToLoad);
// change current state to initScene
_currentState = ApplicationState.initScene;
}
void PauseApplication()
{
}
void ResumeApplication()
{
}
// set the current state depending on the given status value
private void CheckForApplicationPause(bool statusValue)
{
if (statusValue)
{
_currentState = ApplicationState.pauseApplication;
}
else
{
_currentState = ApplicationState.resumeApplication;
}
}
#endregion
#region Unity Events
void Awake()
{
//Check if instance already exists
if (instance == null)
{
//if not, set instance to this
instance = this;
}
else if (instance != this)
{
//Then destroy this. This enforces our singleton pattern, meaning there can only ever be one instance of a GameManager.
Destroy(gameObject);
}
//Sets this to not be destroyed when reloading scene
DontDestroyOnLoad(gameObject);
// change current state to init application
_currentState = ApplicationState.initApplication;
}
/*void OnApplicationFocus(bool hasFocus)
{
CheckForApplicationPause(!hasFocus);
}
void OnApplicationPause(bool pauseStatus)
{
CheckForApplicationPause(pauseStatus);
}*/
void Update () {
// Logic depenging on current state
switch (_currentState)
{
case ApplicationState.initApplication:
Debug.Log("STATE: INIT APPLICATION");
// call private init application function
InitApplication();
break;
case ApplicationState.checkForContentUpdate:
Debug.Log("STATE: CHECK FOR CONTENT UPDATE");
// call private check for content updates function
CheckForContentUpdate();
break;
case ApplicationState.running:
//Debug.Log("STATE: RUNNING");
//TODO
break;
case ApplicationState.pauseApplication:
Debug.Log("STATE: PAUSE APPLICATION");
//TODO
break;
case ApplicationState.resumeApplication:
Debug.Log("STATE: RESUME APPLICATION");
//TODO
break;
case ApplicationState.initScene:
Debug.Log("STATE: INIT SCENE");
// call private init scene function
InitScene();
break;
case ApplicationState.changeScene:
Debug.Log("STATE: CHANGE SCENE");
// call private change scene function
ChangeScene();
break;
case ApplicationState.exitScene:
Debug.Log("STATE: EXIT SCENE");
// call privat exit scene function
ExitScene();
break;
}
}
#endregion
}