同這篇,不過在Unity上有些地方不太一樣...
1.新的執行緒(也就是非主執行緒),不可使用Unity的Object
2.就算新的執行緒設為背景執行緒,但是當程式結束後還是會繼續執行
先隨意開個專案,新建一個C# Script,命名為Test,然後我選擇將其掛在Camera上
1.新的執行緒(也就是非主執行緒),不可使用Unity的Object
在場景隨意放置一個物件做為測試,然後開始撰寫程式碼
using UnityEngine;
using System.Threading;
public class Test : MonoBehaviour
{
private Thread thread;
public GameObject cube;
private void Start()
{
thread = new Thread(Call);
thread.Start();
}
private void Call()
{
cube.transform.position = new Vector3(2f, 0, 0);//移動到新的位置
}
}
將Cube拖到Test上
執行後會發現報錯了!
2.就算新的執行緒設為背景執行緒,但是當程式結束後還是會繼續執行
使用剛剛的Test來修改,只是這次不會使用到Cube,所以可以將Hierarchy的Cube拿掉
using UnityEngine;
using System.Threading;
public class Test : MonoBehaviour
{
private Thread thread;
private void Start()
{
thread = new Thread(Call);
thread.IsBackground = true;
thread.Start();
}
private void Update()
{
Debug.Log("Update");
}
private void Call()
{
int count = 0;
while(count <= 5)
{
count++;
Debug.Log(count);
Thread.Sleep(1000);
}
}
}
執行瞬間立刻取消,可以發現Call內的工作竟然還在執行!
若要預防這種狀況,最簡單的方式是在程式關閉後或離開場景後手動將執行緒關閉,此時就會使用到OnDisable()或OnApplicationQuit()
using UnityEngine;
using System.Threading;
public class Test : MonoBehaviour
{
private Thread thread;
private void Start()
{
thread = new Thread(Call);
thread.IsBackground = true;
thread.Start();
}
private void Update()
{
Debug.Log("Update");
}
private void Call()
{
int count = 0;
while(count <= 5)
{
count++;
Debug.Log(count);
Thread.Sleep(1000);
}
}
//OnDisable()和OnApplicationQuit()看狀況自行選擇一個使用即可
//由於這是示範,所以讓兩個函數都做同樣的事情
private void OnDisable()
{
//Unity在離開當前場景後會自動呼叫這個函數
thread.Abort();//強制中斷當前執行緒
}
private void OnApplicationQuit()
{
//當應用程式結束時會自動呼叫這個函數
thread.Abort();//強制中斷當前執行緒
}
}
執行後在立即中斷,可以發現Call函數已經停止工作了!
留言列表