About 1005

顯示具有 實用技巧 標籤的文章。 顯示所有文章

在遊戲設計時,常會有需要等待X秒過後,執行某個功能(例如跳關/載入下個畫面等等)。這時候就會需要用到 StartCoroutine 與 IEnumerator 這兩個函數,範例如下:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class IEnumeratorTest : MonoBehaviour {

private Text mytext;

void Start () {
mytext = GetComponent<Text>();
StartCoroutine(waittime(2f)); //執行 IEnumerator
}

IEnumerator waittime(float mytime){ //宣告 IEnumerator
yield return new WaitForSeconds(mytime); // 等待x秒
mytext.text = "已經過了兩秒鐘";
}
}


執行結果
當按下PLAY鍵後,畫面上的文字兩秒後會變成「已經過了兩秒鐘」。

範例檔案下載:IEnumerator(Unity 5.6.0f3)

相信大家有時會想要執行附加在某個物件上的某個腳本裡的某個功能。例如,場景裡面有兩個腳本(TestScript與DoScript),分別附加在A與B兩個物件上;當執行TestScript的某個功能時,希望它能呼叫/執行DoScript的某個功能。那這樣該怎麼做呢?有兩個方法可以做的到,範例如下:


■ 方法一:使用「FindObjectOfType」

TestScript
說明:當按下空白鍵時,執行DoScript腳本裡的DoSomeThing

public class TestScript : MonoBehaviour {

void Update () {
if (Input.GetKeyDown(KeyCode.Space)) {
FindObjectOfType<doscript>().DoSomeThing();
}
}
}


DoScript

public class DoScript : MonoBehaviour {

private bool gameover = false;
private int Coins = 1;
private float Num = 0.2f;

public void DoSomeThing(){//注意,要宣告成Public
gameover = true;
Coins += 1;
Num += 0.1f;
//偵測是否有存回
Debug.Log (gameover);
Debug.Log (Coins);
Debug.Log (Num);
}
}


■ 方法二:直接宣告該腳本

TestScript
說明:當按下空白鍵時,執行DoScript腳本裡的DoSomeThing

public class TestScript : MonoBehaviour {

//宣告跟外部腳本相同名稱
//並且在Unity介面指定該物件
//外部腳本需依附在其他物件上
public DoScript script;

void Update () {
if (Input.GetKeyDown(KeyCode.Space)) {
//直接執行外部腳本的Function
script.DoSomeThing ();
}
}
}


DoScript

public class DoScript : MonoBehaviour {

private bool gameover = false;
private int Coins = 1;
private float Num = 0.2f;

public void DoSomeThing(){//注意,要宣告成Public
gameover = true;
Coins += 1;
Num += 0.1f;
//偵測是否有存回
Debug.Log (gameover);
Debug.Log (Coins);
Debug.Log (Num);
}
}


因此,當按下空白鍵時,會執行DoScript腳本裡的DoSomeThing。

範例檔案下載:DoOtherScriptFunction(Unity 5.6.0f3)
範例檔案下載:DoOtherScriptFunction2(Unity 5.6.0f3)

剛接觸Unity設計遊戲的人,一定會有個問題,那就是「我怎麼讓第一關的分數/生命值等等的遊戲參數,在第二關時能夠繼承/延續/存取?」。其實很簡單,那就是需要把這些參數設定為全域變數(static)。另外,由於這些參數每一關都用的到,或許可以直接使用一個腳本來控制所有的全域變數。例如:

管理這些參數的腳本命名為:GameDataManager,腳本內容如下:


static class GameData{

public static bool gameover = false;
public static int Coins = 1;
public static float Num = 0.2f;

}


另外一支用來存取的腳本命名為:TestManager,腳本內容如下:


public class TestManager : MonoBehaviour {

private bool gameover;
private int Coins;
private float Num;

void Start () {
//載入外部全域參數
gameover = GameData.gameover;
Coins = GameData.Coins;
Num = GameData.Num;
}

void Update () {
if (Input.GetKeyDown(KeyCode.Space)) {
gameover = true;
Coins += 1;
Num += 0.1f;
//將運算好的參數存回全域參數
GameData.gameover = gameover;
GameData.Coins = Coins;
GameData.Num = Num;
//偵測是否有存回
Debug.Log ("GameManager.gameover="+GameData.gameover);
Debug.Log ("GameManager.Coins="+GameData.Coins);
Debug.Log ("GameManager.Num="+GameData.Num);
}
}
}


執行結果:
當按下空白鍵時,TestManager會把載入的全域參數計算好後,存回GameDataManager。

範例檔下載:StaticVarTest(Unity 5.6.0f3)

1.格式-->設定格式化條件。
2.把介於改為小於,後面輸入60。
3.然後底下格式按鈕 把色彩改成紅色,這樣就可以囉。

以上感謝Renee提供。