- Home /
Threads? Or just Coroutines?
HI. I'm having a bit of a problem with a code that takes half a second to process. Unity tries to complete the process in 1 frame before continuing, causing a small lag spike that players shouldn't need to see, so I found that I could use Coroutines or Threads to fix that.
What I need is to save stats and inventory (I'm using Easy Save and Inventory Pro), I tried using coroutines but I would have to split the code that saves inventories in between "yield return new WaitForSeconds();" and I can't do that, so I chose to use Threads.
This is what I have:
// OUTSIDE METHODS, AT START OF CLASS
Thread oThread = new Thread(RestAtWell.savingGame);
// THIS GETS DATA TO SAVE, BECAUSE THREADS CAN'T REFERENCE FROM MAIN THREAD
public void GetSaveData()
{
playerStats = GetComponent<ES2_SaveStats>();
var serializers = FindObjectsOfType<EasySave2CollectionSaverLoader>();
foreach (var s in serializers)
{
collections.Add(s);
}
}
// WHEN THE OBJECT IS USED, START SAVE
bool ITriggerCallbacks.OnTriggerUsed(Player player)
{
GetSaveData();
oThread.Start();
return false;
}
// THIS IS THE THREAD
static void savingGame()
{
// save Stats
playerStats.SaveStats();
// save collections
foreach (EasySave2CollectionSaverLoader s in collections)
{
Debug.Log("Saving Collection");
s.Save();
}
}
So basically, when I trigger this, there's no Debug showing, there are no saving but the threads seems to be started, because if I trigger again, I get an error saying the thread has already started. This is a problem because I want this code to save the game every time the player interacts with the checkpoint.
I know I can make this work because placing the: "Thread oThread = new Thread(RestAtWell.savingGame);" right before "oThread.Start();" makes it work, it saves the data without lagging, but the next time I trigger it, the data is saved twice, then thrice. I think that the code starts duplicates of the thread multiple times or something like that.
So how could I make this thread do its thing, stop, and then be able to start again when needed? I haven't found much info about threading, I know unity doesn't like this. If you know a better way for me to implement this, I'm all ears.
Your answer
Follow this Question
Related Questions
Does UnityEngine.CustomeYieldInstruction works in a seperate thread? 2 Answers
Threading in Unity 6 Answers
Return value from coroutine to non monobehaviour 1 Answer
Saving data question 1 Answer
How to save color 3 Answers