這篇,不過在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函數已經停止工作了!

arrow
arrow
    全站熱搜

    Yang 發表在 痞客邦 留言(0) 人氣()