日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity3D 飞碟游戏改进版

發(fā)布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3D 飞碟游戏改进版 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

飛碟游戲改進

這次作業(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。