Major Softwares

  INDEX PAGE

  1. 簡介
  2. Java, Android和LibGDX好書推介
  3. Java, Android和LibGDX要學的知識
  4. 用Windows寫Java程式
  5. 用Eclipse寫Java程式
  6. 用Eclipse寫Android程式
  7. 用Eclipse寫LibGDX程式
  8. Standard Java Naming Conventions
  9. System.out.println()的用法和意思
  10. Where is main() method in Android?

LibGDX - Splash & Menu Screen

  1. LibGDX: World, Texture, Background, Camera, Viewport, Screen & OpenGL
  2. LibGDX: Texture, TextureRegion, SpriteBatch & Sprite
  3. UML(Unified Modeling Language): Class Diagram
  4. Type Casting, Upcasting & Downcasting
  5. @Override的用法和意思
  6. LibGDX: Scene2d & Graphical User Interface(GUI)
  7. LibGDX: Splash Screen
  8. LibGDX: Texture Packer
  9. LibGDX: BitmapFonts, JSON & Skin
  10. Android: R.java File
  11. Android: onClick事件的5種實現方式
  12. LibGDX: Game Menu Screen
  13. LibGDX: Advanced Game Menu Screen (using Abstract Screen)
  14. LibGDX: Disposable Interface
  15. Java & LibGDX: super keyword
  16. LibGDX: Advanced Game Menu Screen (using AssetManager)
  17. Java: Array, Arrays, List, ArrayList & LibGDX: Array
  18. LibGDX: File I/O (Preferences)
  19. LibGDX: Game Level Selection Screen
  20. LibGDX: Advanced Game Level Selection Screen (using AssetManager)

LibGDX - Tiled 2D Platform Game

  1. LibGDX: Lifecylce (Render() Method)
  2. LibGDX: Delta Time
  3. LibGDX: Animation & Spritesheet
  4. LibGDX: Keyboard, Mouse & Touch Screen Control
  5. Input Control (Polling VS Event Driven Input)
  6. LibGDX: Tiled (Background and Foreground)
  7. LibGDX: Jumping Action
  8. LibGDX: Tiled (Collision Detection)
  9. LibGDX: Tiled (Bullet Class)
  10. LibGDX: Audio (Sound & Music)
  11. LibGDX: Tiled (Scrollable Background with Camera & HUD)
  12. LibGDX: WorldController & WorldRenderer Class

LibGDX/Java - Card Game No.1 - Blackjack

  1. LibGDX: Install & Setup Android Studio IDE
  2. LibGDX: Use Android Studio to Run Java Hello World
  3. LibGDX: Use Android Studio to Run LibGDX Hello World
  4. Adobe Illustrator: Basic Components Part 1
  5. Adobe Illustrator: Basic Components Part 2
  6. Adobe Illustrator: BlackJack Table & Cards
  7. LibGDX: Blackjack Animation
  8. LibGDX: Interpolation
  9. Java: toString() Method
  10. Java: Blackjack Shuffle Methods
  11. LibGDX: Blackjack Shuffle Method
  12. Java: Blackjack Card Game

LibGDX - Others

  1. Making and Displaying App Icon
  2. LibGDX: Displaying Traditional and Simplified Chinese Characters
  3. LibGDX: Handling Different Screen Resolutions

Unity Game Engine & C#

  1. Visual Studio: C# Hello World
  2. Unity: C# Hello World
  3. Unity: Handling Different Screen Resolutions
  4. Unity: Life Cycle
  5. Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  6. Unity: Splash Screen
  7. Unity: Fonts, Traditional and Simplified Chinese Characters
  8. Unity: GameObject, Class Object, new & Instantiate
  9. Unity: Start Screen with Glowing Animated Button
  10. Unity: C# Get & Set Modifier
  11. Unity: Delegates & Events
  12. Unity: File I/O, Read & Write Text File & PlayerPrefs
  13. Unity: Game Level Selection Screen
  14. Unity: Game Menu Screen & ScreenManager
  15. Unity: Encrypt and Decrypt Text File
  16. Unity: Options Menu Screen
  17. Unity: Convert Numbers Image to Custom Font

Unity - Card Game No.1 - Blackjack

  1. Unity: Blackjack Card Game - Part 1 (Full Game)
  2. Unity: Blackjack Card Game - Part 2
  3. Unity: Blackjack Card Game - Part 3
  4. Unity: Blackjack Card Game - Part 4
  5. Unity: Blackjack Card Game - Part 5
  6. Unity: Blackjack Card Game - Part 6
  7. Unity: Blackjack Card Game - Part 7

以下是預告-Coming soon!


Secret Weapon No.1

  1. Unity: Card Game No.2

Advanced Programming

  1. Unity: GPS Programming
  2. Unity: User Login System
  3. Unity: Augmented Reality (AR)

Secret Weapon No.2

  1. Unity: GPS & AR Application

第62節 - Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield

這一節我會介紹Unity的以下方法:

1: StartCoroutine(), IEnumerator & Yield

2: Yield WaitforSecond()

3: StopCoroutine()

1.0 甚麼是Unity的StartCoroutine(), IEnumerator & Yield?

正常如果一個方法包含了一個For-Loop Statement,For-Loop Statement會完成所有a=1至 a=5才繼續其他部分,如下圖:

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 調用(Call) methodA()方法。

  2. For-Loop Statement會完成所有a=1至 a=5才繼續其他部分。

  3. 執行結果。

但是如果我們改用Unity的StartCoroutine()方法來調用IEumerator Type的methodA()方法,當For-Loop Statement執行到yield return statement時,For-Loop就會被暫停和先跳離methodA()方法去同步執行StartCoroutine()方法之後的程式,再繼續For-Loop部分去完成所有a=1至 a=5,如下圖:

注意1: 有一個很重要的概念關於IEnumerator & Yield的,就是當執行到yield return時,如果此時a=1,For-Loop會被暫停和先跳離methodA()方法去同步執行StartCoroutine()之後的程式,再繼續For-Loop部分去完成所有a=2至 a=5。 則電腦會記錄上次已經執行的數值, 繼續 下一個數值

注意2: StartCoroutine()方法就是Unity用來調用IEumerator Type的方法。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. Call methodA()方法。

  2. 當For-Loop Statement執行到yield return statement時,For-Loop就會被暫停和先跳離methodA()方法去同步執行StartCoroutine()方法之後的程式。

  3. 再繼續For-Loop部分去完成所有a=2至 a=5

2.0 甚麼要學Unity: StartCoroutine(), StopCoroutine(), IEnumerator & Yield?

最主要原因是我們會在下一節第62節 - Unity: Splash Screen用到StartCoroutine()方法和IEumerator & Yield的特性去做出過場(Splash Screen)效果。

3.0 Case 1: For-Loop Statement

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 建立一個新Project。

  2. 在Hierarchy區域內建立一個GameObject GameObject1。

  3. 在Assets區域內建立一個C# Script MyScript1。

  4. 把C# Script拖放到GameObject1內。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 用Debug.Log()方法顯示"Start1"。

  2. 執行methodA()方法內的For-Loop Statement(a=1至a=5)。

  3. 用Debug.Log()方法顯示"Start2"。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 顯示"Start1"。

  2. 顯示For-Loop Statement(a=1至a=5)。

  3. 顯示"Start2"。

3.0 Case Study

3.1 Case1: StartCoroutine(), IEnumerator & Yield

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 在Hierarchy區域內建立一個GameObject GameObject2。

  2. 在Assets區域內建立一個C# Script MyScript2。

  3. 把C# Script拖放到GameObject2內。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 用Debug.Log()方法顯示"Start1"。

  2. 執行methodA()方法內的For-Loop Statement(a=1)和yield return。

  3. 用Debug.Log()方法顯示"Start2"。

  4. 繼續執行methodA()方法內的For-Loop Statement(a=2至a=5)和yield return。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 顯示"Start1"。

  2. 顯示For-Loop Statement(a=1)。

  3. 顯示"Start2"。

  4. 繼續顯示For-Loop Statement(a=2至a=5)和yield return。

3.2 Case 2: Yield WaitForSecond()

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 在Hierarchy區域內建立一個GameObject GameObject3。

  2. 在Assets區域內建立一個C# Script MyScript3。

  3. 把C# Script拖放到GameObject3內。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 在yield return加入new WaitForSecond(5),則等待5秒。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 顯示For-Loop Statementa=1後,等待5秒,再每5秒顯示a=2至a=5。

3.3 Case 3: StopCoroutine()

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 在Hierarchy區域內建立一個GameObject GameObject4。

  2. 在Assets區域內建立一個C# Script MyScript4。

  3. 把C# Script拖放到GameObject4內。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 在update()方法內加入Input.GetKeyDown()方法,當按"Space"鍵,StopCoroutine()方法就會被執行,停止執行StartCoroutine()方法。

  2. 我們設定a=1至a=59作示範,等大家有足夠時間按"Space"鍵。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 當按"Space"鍵,StopCoroutine()方法就會被執行,停止執行StartCoroutine()方法。

3.4 Case 4: FadeIn Effect

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 在Hierarchy區域內建立一個GameObject GameObject5。

  2. 再在Hierarchy區域內建立一個Canvas Image Element。

  3. 在Assets區域內建立一個C# Script MyScript5。

  4. 把C# Script拖放到GameObject5內。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 選擇Canvas。

  2. 設定Render Mode = Screen Space - Camera。

  3. 把Main Camera拖放到Render Camera內 。

  4. 設定UI Scale Mode = Scale With Screen Size。

  5. 設定Reference Resolution = 2048 x 1536,Screen Match Mode = Expand。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 選擇Image。

  2. 設定Rect Transform = 1024 x 768。

  3. 把圖片拖放到Source Image內 。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 再選擇Color 。

  2. 設定A = Alpha = 0 = Transparerent。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 建立Image物件img,在Inspector區域內就可以把你喜歡的圖片拖放到Image物件img內 。

  2. 在Start()方法內執行StartCoroutine("FadeIn")。

  3. 當For-Loop Statement執行到yield return時,i的值會被儲存,For-Loop就會被暫停和先跳離FadeIn()方法去同步執行StartCoroutine()方法之後的程式,再繼續For-Loop部分去完成所有i的值

3.5 Result (執行結果)

Fade In Effect成功被執行。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield


3.6 For-Loop without Yield Return

我們試試如果把StartCoroutine("FadeIn")方法改為普通FadeIn()方法,再把yield return null去除,看看執行結果有甚麼分別。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 在Start()方法內執行FadeIn()方法。

  2. 加入一個OnRenderObject()方法,它用來顯示圖片在屏幕上之前的i值 。

  3. FadeIn()方法,把yield return null去除。

Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  1. 執行結果。大家可以發現,普通FadeIn()方法只會完成所有For-Loop Statement,才會執行OnRenderObject()方法,則i=0.995999,所以沒有Fade In效果出現。