Unity3D 飞碟游戏改进版
飛碟游戲改進
這次作業(yè)在上一次打飛碟游戲的基礎(chǔ)上增加了adapter設(shè)計模式,用來統(tǒng)一物理運動和運動學動作管理器的接口,使得游戲可以動態(tài)改變飛碟的行為,同時支持物理運動和運動學變換,具有更高的可擴展性。
適配器模式
在設(shè)計模式中,適配器模式(英語:adapter pattern)有時候也稱包裝樣式或者包裝(wrapper)。將一個類的接口轉(zhuǎn)接成用戶所期待的。一個適配使得因接口不兼容而不能在一起工作的類能在一起工作,做法是將類自己的接口包裹在一個已存在的類中。
在這個游戲中我采用對象適配器模式,adapter類持有不同的動作管理器對象,并實現(xiàn)想暴露的接口,這樣做使用成本更低且更加靈活。具體結(jié)構(gòu)可看UML圖。
UML圖
關(guān)鍵代碼解釋
動作管理器統(tǒng)一接口
首先定義我希望得到的動作接口
public interface IActionManager{void addForceOnUFO(GameObject UFO);}適配器類
UFOActionAdapter 類實現(xiàn)了上面定義的接口并且分別持有PhysisActionManager 和CCActionManager 的單例對象。whichActionManager 用來表示當前使用的動作管理器是哪一個。
public class UFOActionAdapter : IActionManager{private PhysisActionManager physisActionManager;private CCActionManager ccActionManager;int whichActionManager = 0; // 0 -> CCActionManager, 1 -> PhysisActionManagerpublic UFOActionAdapter(){physisActionManager = PhysisActionManager.getInstance();ccActionManager = CCActionManager.getInstance();}public void switchActionMode(){whichActionManager = 1 - whichActionManager;}public void addForceOnUFO(GameObject UFO){if(whichActionManager == 1){physisActionManager.addForce(UFO);}else{ccActionManager.addForce(UFO);}}}物理運動管理器
PhysisActionManager主要給游戲?qū)ο髣傮w添加一個一定范圍內(nèi)隨機生成的力,并且模式為Impulse模式,表示一個瞬時的力。
public class PhysisActionManager{private SceneController scene;private static PhysisActionManager instance;private PhysisActionManager(){scene = SceneController.getInstance();}public static PhysisActionManager getInstance(){if (instance == null) instance = new PhysisActionManager();return instance;}public void addForce(GameObject UFO){Vector3 force = getRandomForce();UFO.GetComponent<Rigidbody>().useGravity = true;UFO.GetComponent<Rigidbody>().AddForce(force, ForceMode.Impulse);}private Vector3 getRandomForce(){int x = UnityEngine.Random.Range(-30, 31);int y = UnityEngine.Random.Range(30, 41);int z = UnityEngine.Random.Range(20, 31);float t = 0.7f + scene.getTrailNum() / 20;return new Vector3(x, y, z) * t;}}運動學運動管理器
CCActionManager把游戲?qū)ο髣傮w屬性useGravity設(shè)置為false,然后給予剛體一個速度使其朝著一個方向運動。
public class CCActionManager{private SceneController scene;private static CCActionManager instance;private CCActionManager(){scene = SceneController.getInstance();}public static CCActionManager getInstance(){if (instance == null) instance = new CCActionManager();return instance;}public void addForce(GameObject UFO){// 控制飛碟向某個隨機方向持續(xù)移動UFO.GetComponent<Rigidbody>().useGravity = false;UFO.GetComponent<Rigidbody>().velocity = new Vector3(5, 15, 5);}}用戶接口
UserInterface類的Update方法中檢測鼠標右鍵,當被按下的時候切換動作管理器。
if (Input.GetButtonDown("Fire2")){action.switchActionInNextRound();}我們應(yīng)該是等到下一個trial開始的時候才執(zhí)行動作管理器的更改(如果需要更改的話),這里我在場記中用一個成員變量來標記是否需要更改,在控制發(fā)射飛碟之前再根據(jù)這個值來執(zhí)行修改。代碼如下:
public void switchActionInNextRound(){myStatusCtrl.showSwitchText();switchActionManager = true;} public void launchUFO(){if (switchActionManager){switchActionManager = false;myUFOCtrl.switchActionManager();}//每次發(fā)射之前清0分數(shù)myStatusCtrl.resetScore();myUFOCtrl.launchUFO();}最終效果
視頻演示地址如下:https://www.bilibili.com/video/av22511301/
所有代碼見github:https://github.com/CarolSum/Unity3d-Learning/tree/master/hw5
總結(jié)
以上是生活随笔為你收集整理的Unity3D 飞碟游戏改进版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AHU算法课-DP动态规划
- 下一篇: STM32的Flash