3.按下 Add Uduino library to Arduino 將會跳出 Move library folder 並按下 Move

 

4. "2.Change project settings" 下點選 Fix Now

 

選擇開發板

1. "3.(Optional) Select dafault Arduino board" 下將 Default Board 下拉選單展開選擇對應的開發板。

 

2.此教學使用 Mega 開發板,因此在這裡我們選擇 Arduino Mega 並按下 I'm ready !

完成設置後將可以進行開發板的設定,如下圖。

 

Mega 開發板需要注意:

請將 Advanced 展開並看到 Discover delay,將數值改為 1.5 即可完成。(數值未修改可能會導致功能沒有反應或其他狀況發生)

 

3.開啟 Arduino IDE 應用程式,並打開範例 [ 檔案 > 範例 > Uduino > Uduino ]

 

4.選擇使用的開發板,此教學使用 Mega 2560 示範。

接著將開發板接上電腦並選擇序列埠

接著按下上傳,完成傳輸即可成功。

 

 

建立閃電觸發LED的控制腳本元件

LED_Lightning (Script)

 

1.建立一個 Script 並命名為 LED_Lightning,接著撰寫以下程式碼:

 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using Uduino; // adding Uduino NameSpace

 

 

public class LED_Lightning : MonoBehaviour

{

    public int pin = 2; //腳位

 

    void Start()

    {

        UduinoManager.Instance.pinMode(pin, PinMode.Output); //開始遊戲時新增LED類型

    }

 

    private void OnTriggerEnter(Collider other)//雷電觸發區控制

    {

        if (other.gameObject.tag == "Lightning")//碰到有Lightning標籤的物件

        {

            UduinoManager.Instance.digitalWrite(pin, State.HIGH);//打開LED

            Invoke("CloseLight",0.3f);//延遲觸發時間

        }

    }

 

    public void CloseLight()//延遲關閉LED

    {

        UduinoManager.Instance.digitalWrite(pin, State.LOW);//關閉LED

    }

}

 

 

2. LED_Lightning (Script) 套用到 Lightning_Tri 物件 (先前步驟建立的觸發區) 上並將 LED_Lightning (Script) 下的 Pin 調整為 3 (開發板上的第 3 腳位),調整觸發區到適當的大小。例如:X60 , Y60 , Z60

 

3.點選 THOR_Thunderstorm 物件並看到 Inspector 屬性編輯器下的 THOR_Thunderstorm (Script),需調整以下數值:

-------------------------------

Spawn Height30

Scale Multi1

-------------------------------

 

 

4.接著將 Show Advanced Settings 勾選開啟並展開 Distance & Duration Settings 調整以下數值:

-------------------------------

Minimum Distance3

Maximum Distance30

Minimum Duration0.3
Maximum Duration
0.3

-------------------------------

 

5.新增一個 Cube 當作雷電的基準中心點(預設為Main Camera) Cube 套用 Camera 並將 Cube 物件關閉,接著將 Cube 拖曳到 THOR_Thunderstorm (Script) 底下的 Camera 欄位中。

 

6. Arduino 開發板連結電腦並按下 Play 測試。

 

 

-----------------------------------------------------

 

Enviro - Sky and Weather

 

建立四季環境變化

匯入 Enviro - Sky and Weather 資源包

 

1.開啟新場景,點選功能表 [ Assets > Create > Enviro > Enviro Sky Manager ] 新增一個天空管理器並看到 Inspector 屬性編輯器下的 Enviro Sky Mgr (Script),展開 Setup 找到 Standard Version 下的 Create Standard Instance 並點擊建立場景中天空需要的環境物件。

場景中將會建立兩個必要物件,如下圖:

 

2.建立物件後 Instances 下將會出現 EnviroSky Standard,按下 Activate,如下圖:

後再按下 Auto Assign,如下圖:

出現綠色即可完成,如下圖:

 

3. Hierarchy 視窗中將 Enviro Sky Manager 展開並點選 EnviroSky Standard 子物件,接著看到 Inspector 屬性編輯器下 Weather Zone 腳本元件的 Weather Configs,底下有11個預置的設定組。

 

讀取順序由 0 開始,稍後將使用對應的設定組。

使用季節:

(3) Cloudy 3

(4) Cloudy 4

(2) Cloudy 2

(8) Light Snow

使用天氣:

小雨(6) Light Rain

雷雨(7) Heavy Rain

大雪(9) Heavy Snow

 

 

建立控制天氣的腳本元件

1.建立一個 Script 並重新命名為 ChangeWeather,接著撰寫以下程式碼:

 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class ChangeWeather : MonoBehaviour

{

    public bool TimeActive;//時間狀態

    float noonTime = 12f, dynamicTime;

    public int SkyStandard;//目前天氣

 

    void Start()

    {

        EnviroSkyMgr.instance.SetTimeOfDay(noonTime);

    }

 

    void Update()

    {

        if (Input.GetKey(KeyCode.T))//"T"開啟/關閉時間變化

        {

            TimeActive = true;

        }

        else TimeActive = false;

 

        if(TimeActive)

        {

            dynamicTime += Time.deltaTime*0.005f;

            noonTime += dynamicTime;

            EnviroSkyMgr.instance.SetTimeOfDay(noonTime);

        }

        else

        {

            dynamicTime = 0;

        }

 

        if (noonTime > 24f)

        {

            noonTime = 0;

        }

 

        //季節切換

        if (Input.GetKeyDown(KeyCode.Keypad1))//

        {

            EnviroSkyMgr.instance.ChangeWeather(3);//切換天空

            SkyStandard = 3;//紀錄目前天空

        }

        if (Input.GetKeyDown(KeyCode.Keypad2))//

        {

            EnviroSkyMgr.instance.ChangeWeather(4);//切換天空

            SkyStandard = 4;//紀錄目前天空

        }

        if (Input.GetKeyDown(KeyCode.Keypad3))//

        {

            EnviroSkyMgr.instance.ChangeWeather(2);//切換天空

            SkyStandard = 2;//紀錄目前天空

        }

        if (Input.GetKeyDown(KeyCode.Keypad4))//

        {

            EnviroSkyMgr.instance.ChangeWeather(8);//切換天空

            SkyStandard = 8;//紀錄目前天空

        }

 

        //天氣效果切換

        if (Input.GetKeyDown(KeyCode.Keypad0))//按右側鍵盤0關閉下雨打雷下雪

        {

            EnviroSkyMgr.instance.ChangeWeather(SkyStandard);

        }

 

        if (Input.GetKeyDown(KeyCode.Keypad7))//按右側鍵盤7下雨

        {

            EnviroSkyMgr.instance.ChangeWeather(6);

        }

 

        if (Input.GetKeyDown(KeyCode.Keypad8))//按右側鍵盤8打雷

        {

            EnviroSkyMgr.instance.ChangeWeather(7);

        }

 

        if (Input.GetKeyDown(KeyCode.Keypad9))//按右側鍵盤9下雪

        {

            EnviroSkyMgr.instance.ChangeWeather(9);

        }

    }

 

    public void SelectWeather(int id)

    {

        EnviroSkyMgr.instance.ChangeWeather(id);

    }

 

}

 

 

2. Hierarchy 中新增一個空物件並命名為 Change Weather Control 並套用建立好的 ChangeWeather (Script),按下 Play 測試鍵盤切換成功即可完成。

 

 

請將以上製作步驟設置的進度儲存起來。

 

 

場景放置
可自行製作場景或尋找場景資源,此教學使用 Autumn 資源示範。

 

1.開啟資料夾 [ Assets > Autumn > Demo2 ] 並開啟 Park 場景,接著將場景中的 StaticTerrainWindZonefountain1 物件複製搬移到自己儲存的場景中。

 

2.點選 Terrain 物件並看到 Inspector 屬性編輯器下 Terrain 元件中 Basic Terrain 項目的 Material 欄位,接下來將利用腳本元件來控制切換材質來增加季節變化的效果。

 

3.自行建立或尋找資源準備 4 個對應季節要使用的材質球(地面草皮),例如下圖:

 

4.打開 ChangeWeather 腳本元件並新增控制項目,如以下藍字部分:

 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class ChangeWeather : MonoBehaviour

{

    public bool TimeActive;//時間狀態

    float noonTime = 12f, dynamicTime;

    public int SkyStandard;//目前天氣

    public Material[] referencedMaterial;//地形材質

    public Terrain referencedTerrain;//地形物件

 

    void Start()

    {

        EnviroSkyMgr.instance.SetTimeOfDay(noonTime);

    }

 

    void Update()

    {

        if (Input.GetKey(KeyCode.T))//"T"開啟/關閉時間變化

        {

            TimeActive = true;

        }

        else TimeActive = false;

 

        if(TimeActive)

        {

            dynamicTime += Time.deltaTime*0.005f;

            noonTime += dynamicTime;

            EnviroSkyMgr.instance.SetTimeOfDay(noonTime);

        }

        else

        {

            dynamicTime = 0;

        }

 

        if (noonTime > 24f)

        {

            noonTime = 0;

        }

 

        //季節切換

        if (Input.GetKeyDown(KeyCode.Keypad1))//

        {

            EnviroSkyMgr.instance.ChangeWeather(3);//切換天空

            SkyStandard = 3;//紀錄目前天空

            ChangeTerrain(0);

        }

        if (Input.GetKeyDown(KeyCode.Keypad2))//

        {

            EnviroSkyMgr.instance.ChangeWeather(4);//切換天空

            SkyStandard = 4;//紀錄目前天空

            ChangeTerrain(1);

        }

        if (Input.GetKeyDown(KeyCode.Keypad3))//

        {

            EnviroSkyMgr.instance.ChangeWeather(2);//切換天空

            SkyStandard = 2;//紀錄目前天空

            ChangeTerrain(2);

        }

        if (Input.GetKeyDown(KeyCode.Keypad4))//

        {

            EnviroSkyMgr.instance.ChangeWeather(8);//切換天空

            SkyStandard = 8;//紀錄目前天空

            ChangeTerrain(3);

        }

 

        //天氣效果切換

        if (Input.GetKeyDown(KeyCode.Keypad0))//按右側鍵盤0關閉下雨打雷下雪

        {

            EnviroSkyMgr.instance.ChangeWeather(SkyStandard);

        }

 

        if (Input.GetKeyDown(KeyCode.Keypad7))//按右側鍵盤7下雨

        {

            EnviroSkyMgr.instance.ChangeWeather(6);

        }

 

        if (Input.GetKeyDown(KeyCode.Keypad8))//按右側鍵盤8打雷

        {

            EnviroSkyMgr.instance.ChangeWeather(7);

        }

 

        if (Input.GetKeyDown(KeyCode.Keypad9))//按右側鍵盤9下雪

        {

            EnviroSkyMgr.instance.ChangeWeather(9);

        }

    }

 

    public void SelectWeather(int id)

    {

        EnviroSkyMgr.instance.ChangeWeather(id);

    }

 

    public void ChangeTerrain(int index)

    {

        referencedTerrain.materialTemplate = referencedMaterial[index];

    }

 

}

 

5.對應春夏秋冬的順序將材質球放入欄位中,並將地形物件放入 Referenced Terrain 欄位中。

按下 Play 測試是否能夠切換材質,成功即可完成。

 

6.接下來再增加控制下雷雨時能夠打開 THOR_Thunderstorm 物件,需要新增控制的項目如以下藍字部分:

 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class ChangeWeather : MonoBehaviour

{

    public bool TimeActive;//時間狀態

    float noonTime = 12f, dynamicTime;

    public int SkyStandard;//目前天氣

    public Material[] referencedMaterial;//地形材質

    public Terrain referencedTerrain;//地形物件

  public GameObject Lightning;//雷電物件

 

    void Start()

    {

        EnviroSkyMgr.instance.SetTimeOfDay(noonTime);

    }

 

    void Update()

    {

        if (Input.GetKey(KeyCode.T))//"T"開啟/關閉時間變化

        {

            TimeActive = true;

        }

        else TimeActive = false;

 

        if(TimeActive)

        {

            dynamicTime += Time.deltaTime*0.005f;

            noonTime += dynamicTime;

            EnviroSkyMgr.instance.SetTimeOfDay(noonTime);

        }

        else

        {

            dynamicTime = 0;

        }

 

        if (noonTime > 24f)

        {

            noonTime = 0;

        }

 

        //季節切換

        if (Input.GetKeyDown(KeyCode.Keypad1))//

        {

            EnviroSkyMgr.instance.ChangeWeather(3);//切換天空

            SkyStandard = 3;//紀錄目前天空

            ChangeTerrain(0);

        }

        if (Input.GetKeyDown(KeyCode.Keypad2))//

        {

            EnviroSkyMgr.instance.ChangeWeather(4);//切換天空

            SkyStandard = 4;//紀錄目前天空

            ChangeTerrain(1);

        }

        if (Input.GetKeyDown(KeyCode.Keypad3))//

        {

            EnviroSkyMgr.instance.ChangeWeather(2);//切換天空

            SkyStandard = 2;//紀錄目前天空

            ChangeTerrain(2);

        }

        if (Input.GetKeyDown(KeyCode.Keypad4))//

        {

            EnviroSkyMgr.instance.ChangeWeather(8);//切換天空

            SkyStandard = 8;//紀錄目前天空

            ChangeTerrain(3);

        }

 

        //天氣效果切換

        if (Input.GetKeyDown(KeyCode.Keypad0))//按右側鍵盤0關閉下雨打雷下雪

        {

            EnviroSkyMgr.instance.ChangeWeather(SkyStandard);

      Lightning.SetActive(false);

        }

 

        if (Input.GetKeyDown(KeyCode.Keypad7))//按右側鍵盤7下雨

        {

            EnviroSkyMgr.instance.ChangeWeather(6);

      Lightning.SetActive(false);

        }

 

        if (Input.GetKeyDown(KeyCode.Keypad8))//按右側鍵盤8打雷

        {

            EnviroSkyMgr.instance.ChangeWeather(7);

      Invoke("LightningOpen", 5f); //延遲開啟雷電(為了讓雲有足夠時間出現)

        }

 

        if (Input.GetKeyDown(KeyCode.Keypad9))//按右側鍵盤9下雪

        {

            EnviroSkyMgr.instance.ChangeWeather(9);

      Lightning.SetActive(false);

        }

    }

 

    public void LightningOpen()//開啟雷電

    {

        Lightning.SetActive(true);

    }

 

    public void SelectWeather(int id)

    {

        EnviroSkyMgr.instance.ChangeWeather(id);

    }

 

    public void ChangeTerrain(int index)

    {

        referencedTerrain.materialTemplate = referencedMaterial[index];

    }

 

}

 

 

7. THOR_Thunderstorm 物件拖曳到 Lightning 欄位中

接著按下 Play 並按下 8 雷雨效果時是否能夠開啟雷電,測試成功即可完成。