Edit - The amazing people at SmartFoxServer let me try a pre-release of client version 1.6.2 which resolves
this hang. Keep reading if you want to get some info on how to have a splash screen when your
game is closing. You can read the full forum dialog here:
http://smartfoxserver.com/forums/viewtopic.php?f=20&t=18107
Dear Unity Developers,
I recently updated to Unity5.1.3 and noticed a bad hang on a Windows Standalone Player build when closing my game.
I think that the Disconnect event can no longer be processed in OnApplicationQuit. I have a small workaround. I've reworked my project to load a new scene when the app is closed. I noticed that when my game got disconnected in a normal way (not on quit), it did not hang when I closed it. I researched what could be done, and I found this example in the Unity documentation.
http://docs.unity3d.com/ScriptReference/Application.CancelQuit.html
I'm including my entire SmartFoxManager.cs class. Hopefully this helps people make better use of SmartFox with Unity.
Essentially, what I do now is call Disconnect and then load a closing splash screen that waits for the disconnection (or times out) and calls Application.Quit().
http://smartfoxserver.com/forums/viewtopic.php?f=20&t=18107
Dear Unity Developers,
I recently updated to Unity5.1.3 and noticed a bad hang on a Windows Standalone Player build when closing my game.
I think that the Disconnect event can no longer be processed in OnApplicationQuit. I have a small workaround. I've reworked my project to load a new scene when the app is closed. I noticed that when my game got disconnected in a normal way (not on quit), it did not hang when I closed it. I researched what could be done, and I found this example in the Unity documentation.
http://docs.unity3d.com/ScriptReference/Application.CancelQuit.html
I'm including my entire SmartFoxManager.cs class. Hopefully this helps people make better use of SmartFox with Unity.
Essentially, what I do now is call Disconnect and then load a closing splash screen that waits for the disconnection (or times out) and calls Application.Quit().
using UnityEngine;
using Sfs2X;
using Sfs2X.Requests;
using Sfs2X.Entities;
using System.Collections;
using Sfs2X.Core;
// Created by Andy Martin
// Statics for holding the connection to the SFS server end
// Can then be queried from the entire game to get the connection
public class SmartFoxManager : MonoBehaviour
{
public delegate void ConnectionLostDelegate(BaseEvent evt);
public ConnectionLostDelegate ConnectionLost;
private static SmartFox smartFox;
private static SmartFoxManager mInstance;
public static SmartFoxManager Instance
{
get
{
if(mInstance == null)
{
mInstance = new GameObject("SmartFoxManager").
AddComponent(typeof(SmartFoxManager)) as SmartFoxManager;
}
return mInstance;
}
}
//I have a different class set this connection
public SmartFox Connection
{
get { return smartFox; }
set
{
smartFox = value;
smartFox.AddEventListener(SFSEvent.CONNECTION_LOST, OnConnectionLost);
}
}
private void OnConnectionLost(BaseEvent evt)
{
Debug.Log("OnConnectionLost SFSManager");
if(disconnecting == true)
{
disconnecting = false;
return;
}
//Call the event listeners
if (ConnectionLost != null)
{
ConnectionLost(evt);
}
}
public static bool IsInitialized
{
get
{
return (smartFox != null);
}
}
void Awake()
{
DontDestroyOnLoad(this);
}
//FixedUpdate is called once per 20 ms
void Update()
{
if (smartFox != null)
{
smartFox.ProcessEvents();
}
}
public bool disconnecting = false;
private bool allowQuitting = false;
// Handle disconnection automagically
// ** Important for Windows users - can cause crashes otherwise
void OnApplicationQuit()
{
if (disconnecting == true)
{
return;
}
Debug.Log("SmartFoxManager OnApplicationQuit");
if (smartFox != null && smartFox.IsConnected)
{
disconnecting = true;
smartFox.Disconnect();
StartCoroutine("DelayedQuit");
if (allowQuitting == false)
{
Debug.Log("Cancelled Quit");
Application.CancelQuit();
}
}
else
{
//Quit, you are not connected
return;
}
Debug.Log("End of SmartFoxManager OnAppQuit");
}
//Shows an ending splash
IEnumerator DelayedQuit()
{
Debug.Log("Delayed Quit");
//Take the game out of full-screen mode
Screen.fullScreen = false;
Application.LoadLevel("EndSplash");
int maxTries = 3;
int tries = 0;
while (disconnecting == true && ++tries <= maxTries)
{
Debug.Log("Hanlding Disconnect");
yield return new WaitForSeconds(1.0f);
}
allowQuitting = true;
Debug.Log("Allowing Quitting");
Application.Quit();
}
}