About 1005

顯示具有 Unity 標籤的文章。 顯示所有文章


最近製作第一版VR遊戲教學教材時發現一個問題,在Unity Edit Mode與Play Mode裡,Image的消失與顯示(setactive)功能都沒問題,但輸出至手機時卻無法正常顯示。查了半天與Try Error後才知道,如果在Google Cardboard需要互動時(setactive),Canvas的設定只能是world space,其他模式皆無法顯示。

使用版本:Unity 2017.3.1f1 (64-bit)
Google Cardboard版本:GoogleVRForUnity_1.120.0

01_Scene & Shooting Settings 環境設定與開槍特效

02_Monster Animation Setup 怪物動作設定

03_navigation Settings 循跡設定

04_Attack & Damage Settings 攻擊與受傷設定

05_HP & Start Menu 血條與遊戲起使介面設定

06_Monster Count & NextLevel Menu 怪物計算與過關畫面

07_Debug 問題修正

08_APK Export




Unity版本:Unity 2017.3.1f1 (64-bit)
Android Studio下載
Java SE Development Kit 8 下載
Google Cardboard Sdk 下載

以上教學內容屬本人所有,轉載請「務必」事先告知並註明出處。

課程素材下載

01_Google Cardboard 環境設定

02_Create VR360 Scenes

03_Button Function

04_Change UI Image Color

05_Fade In & Fade Out




Unity版本:Unity 2017.3.1f1 (64-bit)
Android Studio下載
Java SE Development Kit 8 下載
Google Cardboard Sdk 下載

以上教學內容屬本人所有,轉載請「務必」事先告知並註明出處。

課程素材下載

在遊戲設計時,常會有需要等待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)