Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Unity帶來的新型遊戲開發方式

15 754 vues

Publié le

Publié dans : Spirituel, Technologie
  • Login to see the comments

Unity帶來的新型遊戲開發方式

  1. 1. Unity帶來的 新型遊戲開發方式如何用Component導向設計進行 Rapid Prototyping 講師 : 石川 將光 @lucifuges aka Unity仙人
  2. 2. 以往的遊戲程式設計法
  3. 3. 以往的遊戲程式設計法■物件導向的繼承結構只要功能有點不同,就會出現很多類似的ClassGameActor GameActor Enemy Enemy FlyingEnemy FlyingEnemy SwimingEnemy SwimingEnemyEnemyBase EnemyBase Boss Boss JeffsEnemy JeffsEnemy FlyingBoss FlyingBoss JeffsBoss JeffsBoss 3/49
  4. 4. 以往的遊戲程式設計法■物件導向的繼承結構只要功能有點不同,就會出現很多類似的Class Whats different?GameActor GameActor Enemy Enemy FlyingEnemy FlyingEnemy SwimingEnemy SwimingEnemyEnemyBase EnemyBase Boss Boss JeffsEnemy JeffsEnemy WHO? FlyingBoss FlyingBoss JeffsBoss JeffsBoss 4/49
  5. 5. 以往的遊戲程式設計法■物件導向的繼承結構想在部份Class追加功能的時候,不知道該加在哪裡 GameActor GameActor Enemy Enemy FlyingEnemy FlyingEnemy SwimingEnemy SwimingEnemy EnemyBase EnemyBase Boss Boss JeffsEnemy JeffsEnemy加在EnemyBase裡然後沒用到的Class不呼叫就好? FlyingBoss JeffsBoss FlyingBoss JeffsBoss還是乾脆個別貼上? 5/49
  6. 6. 以往的遊戲程式設計法■物件導向的繼承結構例如下面的例子,想要作一隻會飛又會游泳的敵人該怎麼辦?重新設計繼承結構嗎?GameActor GameActor Enemy Enemy FlyingEnemy FlyingEnemy SwimingEnemy SwimingEnemyEnemyBase EnemyBase Boss Boss JeffsEnemy JeffsEnemy FlyingBoss FlyingBoss JeffsBoss JeffsBoss 6/49
  7. 7. 以往的遊戲程式設計法 物件導向擴張性很高? 7/49
  8. 8. 以往的遊戲程式設計法 物件導向擴張性很高? 有設計過的 物件導向 擴張性才高 8/49
  9. 9. 以往的遊戲程式設計法■遊戲開發的變化性很高・常常會更改規格 →難道要每次都改繼承結構? →不仔細分析繼承關係的話很難分辨什麼  能作什麼不能作 9/49
  10. 10. Unity的遊戲程式設計法 10/49
  11. 11. Unity的遊戲程式設計法■Component導向把每個功能用Class化的Component組合起來,定義整體的Behaviour EnemyObject EnemyObject PlayerObject PlayerObject Transform Transform MeshRenderer MeshRenderer CapsuleCollider CapsuleCollider DamageAcceptor DamageAcceptor AIControl PlayerControl 11/49
  12. 12. Unity的遊戲程式設計法■Component=有實作的Interface用SendMessage丟出訊息,只要有同名的Method就會執行 PlayerObject PlayerObjectBulletObject BulletObject Transform DamageProvider MeshRenderer CapsuleCollider 有! 有TakeDamage DamageAcceptor 這個Method的話 就執行 PlayerControl 12/49
  13. 13. Unity的遊戲程式設計法■Component=有實作的Interface用GetComponent確認是否有Component,然後再呼叫Method PlayerObject PlayerObjectBulletObject BulletObject Transform DamageProvider MeshRenderer CapsuleCollider DamageAcceptor DamageAcceptor 存在的話就呼叫 TakeDamage PlayerControl 這個Method 13/49
  14. 14. Unity的遊戲程式設計法■Component=有實作的Interface沒有Component的話什麼也不做BulletObject BulletObject BackgroundObject BackgroundObject DamageProvider Transform MeshRenderer CubeCollider 因為沒有 DamageAcceptor 直接消失不見 14/49
  15. 15. Unity的遊戲程式設計法■容易增減功能只要追加Component就可以增加功能BulletObject BulletObject BackgroundObject BackgroundObject DamageProvider Transform MeshRenderer CubeCollider 背景物件 追加! 也可以破壞比較好 DamageAcceptor 15/49
  16. 16. Unity的遊戲程式設計法■暫時改變行為也很簡單只要以Component為單位開關功能就好 PlayerObject PlayerObjectEventObject EventObject Transform EventTrigger MeshRenderer CapsuleCollider 事件進行中 DamageAcceptor 停止控制輸入和 傷害計算 PlayerControl 16/49
  17. 17. Unity的遊戲程式設計法Component導向 擴張性很高? 17/49
  18. 18. Unity的遊戲程式設計法Component導向 擴張性很高? 有設計過的Component導向 擴張性才高 18/49
  19. 19. Unity的遊戲程式設計法■功能拆解失敗的話就會出錯・The All-in-one Component →想在一個Component裡解決所有事情 PlayerObject PlayerObjectObjectBehaviour IControllable+ModelData +Controller PlayerBehaviour+Collider +ModelData +Collider +CharStatusCharBehaviour +Controller+CharStatus 結果跟物件導向 一模一樣… 19/49
  20. 20. Unity的遊戲程式設計法■功能拆解失敗的話就會出錯・Spaghetti Components →Component之間的相依關係過於複雜 PlayerObject PlayerObject BulletObject BulletObject Transform Transform MeshRenderer ParticleSystem CapsuleCollider CapsuleCollider DamageAcceptor DamageProvider PlayerControl 20/49
  21. 21. Unity的遊戲程式設計法■功能拆解失敗的話就會出錯・Tons of Components →定義一個Behaviour要用到大量的  ComponentPlayerObject PlayerObject Transform MeshFilter HP MeshRenderer AudioSource MP CapsuleCollider ParticleSystem Strength DamageAcceptor TrailRenderer Intellect PlayerControl Animation Dexterity 21/49
  22. 22. Component導向的範例 22/49
  23. 23. Component導向的範例EZ GUI vs NGUI 23/49
  24. 24. Component導向的範例■EZ GUI物件導向的Library。Asset Store上最早出現的GUI Library,也有很多人用… 24/49
  25. 25. Component導向的範例■EZ GUI按鈕Component的Inspector畫面 25/49
  26. 26. Component導向的範例■EZ GUI 指定位置及大小 顏色調整 Render相關設定 Label相關設定 Drag&Drop相關設定 事件相關設定 音效相關設定 Sprite相關設定 Animation相關設定 Material相關設定 26/49
  27. 27. Component導向的範例■EZ GUI典型的All-in-one Component。很難理解每個功能被放在哪裡。而且也很難開關個別功能。利用擴充編輯器和Foldout的話倒是可以讓他變好看一點。Its NOT easy! 27/49
  28. 28. Component導向的範例 NGUI 28/49
  29. 29. Component導向的範例■NGUIComponent導向的Library。佔有晚出的優勢,設計上非常適合Unity使用。 29/49
  30. 30. Component導向的範例■NGUI按鈕Component的Inspector畫面 30/49
  31. 31. Component導向的範例■NGUI 按鈕圖示 Mouseover及 Mouseclick時的 顏色變化及管理 按鈕文字 縮放Animation 座標Animation Sound Effect 31/49
  32. 32. Component導向的範例■NGUISprite物件的話只會Attach跟Sprite相關的Component 32/49
  33. 33. Component導向的範例■NGUI如果要停止按鈕的縮放動畫,只要刪除或是Disable UIButtonScale Component就好。而且每個功能被Component化之後很容易理解。不過控制Render順序之類的部份還是不太容易理解。 33/49
  34. 34. Component導向的範例Component化的指標 34/49
  35. 35. Component導向的範例■Component化的指標・把物件的特性Component化 Sword Sword 可以裝備 Equipment 可以造成傷害 DamageProvider Shield Shield 可以裝備 Equipment 可以吸收傷害 DamageAbsorber 35/49
  36. 36. Component導向的範例■Component化的指標・把暫時的狀態Component化 因為無敵Component, 暫時失效 PlayerObject PlayerObject DamageAcceptor 玩家無敵期間會Attach上去 Invulnerable (一段時間後消失) BlinkModel 因為無敵Component追加 的模型閃爍Component (一段時間後消失) 36/49
  37. 37. Component導向的範例■Component化的指標・把可更換的功能Component化 朝指定的方向移動,控制相關 PlayerObject PlayerObject Animation的Component Character ControllerInput 從控制器輸入指令, 移動角色 EnemyObject EnemyObject Character 從AI輸入指令, AIInput 移動角色 37/49
  38. 38. Component導向的範例■Component化的指標・把可更換的功能Component化 PlayerObject PlayerObject Character AIInput 在Enemy身上加上 EnemyObject EnemyObject ControllerInput Character 就可以控制敵人 ControllerInput 38/49
  39. 39. Component導向的範例■Component化的指標・把可更換的功能Component化 PlayerObject PlayerObject Character EventActor EnemyObject 事件中就根據 EnemyObject Character 事件的指令移動 EventActor 39/49
  40. 40. Component導向的範例Component化的注意事項 40/49
  41. 41. Component導向的範例■Component化的注意事項・不要集中在1個Component上GameManager GameManager TransLevel(next) 一邊降低BGM音量 { while (e < t) 一邊把畫面變暗, { 結束之後再切換場景。 bgm.volume = 1 - e; fade.alpha = e; yield return; } LoadLevel(next); } 41/49
  42. 42. Component導向的範例■Component化的注意事項・不要集中在1個Component上GameManager GameManager TransLevel(next) 不要在1個Component { while (e < t) 上存取大量的其他 { Component bgm.volume = 1 - e; fade.alpha = e; 不要用1個Component yield return; 做完所有事情 } LoadLevel(next); } 42/49
  43. 43. Component導向的範例■Component化的注意事項・不要集中在1個Component上GameManager GameManager 製作必要的 TransLevel(next) Component, { 一段時間後切換場景 AddComponent<BGMFade>( ); AddComponent<ScreenFade>( ); WaitForSeconds(1); LoadLevel(next); 逐漸降低BGM音量的 } Component BGMFade 把畫面逐漸變暗的 ScreenFade Component 43/49
  44. 44. Component導向的範例■Component化的注意事項・避免Component間的相互參照BulletObject BulletObject PlayerObject PlayerObject DamageProvider Character ControllerInput DamageAcceptor 彼此相依的 Component 是個惡夢盡量避免相互監視的Component 44/49
  45. 45. Component導向的範例■Component化的注意事項・適度的將物件階層化PlayerObject PlayerObject 負責輸入和碰撞判定的物件 Character ControllerInput PlayerModel PlayerModel 負責Render模型的 MeshFilter 物件 MeshRenderer Animation HitEffect HitEffect ParticleSystem 負責Effect的物件 45/49
  46. 46. Component導向的範例■Component化的注意事項・活用Prefab以及編輯器擴充功能 →每次都要設定一堆Component很累人,  盡可能把常用的組合Prefab化,然後透  過編輯器擴充功能從選單直接產生。 46/49
  47. 47. 如何以Unity快速製作Prototype 47/49
  48. 48. 如何以Unity快速製作Prototype 實際Demo 48/49
  49. 49. 謝謝!我愛台灣! 49/49

×