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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

unity3d开发鼠标打飞碟游戏(Hit UFO)

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity3d开发鼠标打飞碟游戏(Hit UFO) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這次我們用Unity3d開發一個簡單的打飛碟游戲

游戲簡介

游戲有3個回合,每個回合會發射n中顏色的飛碟,擊中飛碟會得到相應的分數,其中,擊中黃色飛碟得1分,擊中藍色飛碟得2分,紅色飛碟4分,擊不中不扣分

游戲思想

為了減少開銷,提升游戲的運行速度,采用工廠模式對飛碟進行管理,飛碟的生產與回收由工廠來執行,剩下的場景管理,動作管理和上次牧師與魔鬼相同:牧師與魔鬼

代碼實現

飛碟的工廠類

using System.Collections; using System.Collections.Generic; using UnityEngine;public class DiskFactory : MonoBehaviour {//存放飛碟的隊列,獲取飛碟出隊,回收飛碟入隊private Queue<GameObject> diskFactory = new Queue<GameObject>();//飛碟生產方法public GameObject GetDisk(int round){GameObject newDisk = null;if (diskFactory.Count > 0){newDisk = diskFactory.Dequeue();}else{newDisk = GameObject.Instantiate<GameObject>(Resources.Load<GameObject>("prefab/disk"), Vector3.zero, Quaternion.identity);newDisk.AddComponent<DiskData>();newDisk.SetActive(false);}/*通過回合生產不同顏色的飛碟,第一回合黃色,第二回合黃色和藍色,第三回合黃色、藍色和紅色,不同顏色的飛行速度不一樣*/round = Random.Range(0, round + 1);switch (round){case 0:newDisk.GetComponent<Renderer>().material.color = Color.yellow;newDisk.GetComponent<DiskData>().speed = 4.0f;int diraction = UnityEngine.Random.Range(-1f, 1f) > 0 ? -1 : 1;newDisk.GetComponent<DiskData>().flyDiraction = diraction;break;case 1:newDisk.GetComponent<Renderer>().material.color = Color.blue;newDisk.GetComponent<DiskData>().speed = 8.0f;int diraction1 = UnityEngine.Random.Range(-1f, 1f) > 0 ? -1 : 1;newDisk.GetComponent<DiskData>().flyDiraction = diraction1;break;case 2:newDisk.GetComponent<Renderer>().material.color = Color.red;newDisk.GetComponent<DiskData>().speed = 10.0f;int diraction2 = UnityEngine.Random.Range(-1f, 1f) > 0 ? -1 : 1;newDisk.GetComponent<DiskData>().flyDiraction = diraction2;break;}return newDisk;}//回收飛碟,入隊public void FreeDisk(GameObject disk){disk.SetActive(false);diskFactory.Enqueue(disk);}// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {} }

場景控制之baseCode.cs

using System.Collections; using System.Collections.Generic; using UnityEngine; using Com.MyGame; namespace Com.MyGame {public enum GameState { ROUND_START,ROUND_FINISH, RUNNING, PAUSE,START}//游戲導演public class Director : System.Object{private static Director _instance;public SceneController currentSceneController { get; set; }public static Director getInstance(){if (_instance == null){_instance = new Director();}return _instance;}}public interface SceneController{void loadResources();}public interface UserAction{GameState GetGameState();void SetGameState(GameState state);void GameOver();int getScore();void restart();void hit();int GetRound();}/*感覺積分器放在這里不是很好,不過管它呢*/public class ScoreRecorder : MonoBehaviour{/** * score是玩家得到的總分 */public int score;/** * scoreTable是一個得分的規則表,每種飛碟的顏色對應著一個分數 */private Dictionary<Color, int> scoreTable = new Dictionary<Color, int>();// Use this for initialization void Start(){score = 0;scoreTable.Add(Color.yellow, 1);scoreTable.Add(Color.blue, 2);scoreTable.Add(Color.red, 4);}public void Record(GameObject disk){score += scoreTable[disk.GetComponent<Renderer>().material.color];}public void Reset(){score = 0;}}}

場景控制之firstController:負責加載資源

using System.Collections; using System.Collections.Generic; using UnityEngine; using Com.MyGame;public class FirstController : MonoBehaviour, SceneController, UserAction {//動作管理器public CCActionManager actionManger { get; set; }//飛碟public Queue<GameObject> disks = new Queue<GameObject>();//分數public ScoreRecorder scoreRecorder { get; set; }//飛碟數量public int diskNum;//當前回合private int currentRound = -1;//回合數private int round = 3;//發射飛碟得時間間隔private float time;//游戲狀態private GameState state = GameState.START;UserGUI userGUI;void Awake(){Director dir = Director.getInstance();dir.currentSceneController = this;this.gameObject.AddComponent<ScoreRecorder>();this.gameObject.AddComponent<DiskFactory>();scoreRecorder = Singleton<ScoreRecorder>.Instance;diskNum = 10;userGUI = this.gameObject.AddComponent<UserGUI>() as UserGUI;}private void Update(){if (currentRound == 3){return;}if (actionManger.diskNum == 0 && state == GameState.RUNNING){state = GameState.ROUND_FINISH;}if (actionManger.diskNum ==0 && state == GameState.ROUND_START){currentRound = currentRound + 1;NextRound();actionManger.diskNum = 10;state = GameState.RUNNING;}if (time > 1){if (state == GameState.RUNNING){ThrowDisk();}time = 0;}else{time += Time.deltaTime;}}//加載飛碟,每個回合獲取10飛碟public void NextRound(){DiskFactory df = Singleton<DiskFactory>.Instance;for (int i = 0; i < diskNum; ++i){disks.Enqueue(df.GetDisk(currentRound));}actionManger.StartThrow(disks);}//發射飛碟public void ThrowDisk(){if (disks.Count != 0){GameObject disk = disks.Dequeue();float y = Random.Range(0, 7);float x = Random.Range(-8, 8);disk.transform.position = new Vector3(x, y, 0);disk.SetActive(true);}}/*因為頁面比較單一,所以這個方法沒有實現,如果想讓場景多彩一點,可以試著實現該方法*/public void loadResources(){}public void restart(){currentRound = -1;//state = GameState.ROUND_START;state = GameState.START;}public GameState GetGameState(){return state;}public void SetGameState(GameState state){this.state = state;}/*因為游戲沒有設置Gameover這個功能,所以就沒有實現該功能*/public void GameOver(){//throw new System.NotImplementedException();}public int getScore(){//throw new System.NotImplementedException();return scoreRecorder.score;}//監視鼠標點擊的方法public void hit(){GameObject gameObject = null;if (Input.GetMouseButton(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)) gameObject = hit.collider.gameObject;}if (gameObject != null && gameObject.GetComponent<DiskData>()!=null){scoreRecorder.Record(gameObject);gameObject.transform.position = new Vector3(0, -5, 0);}}public int GetRound(){return currentRound;//throw new System.NotImplementedException();} }

場景控制之UserGUI:用來顯示按鈕,分數等

using System.Collections; using System.Collections.Generic; using UnityEngine; using Com.MyGame;public class UserGUI : MonoBehaviour {public FirstController scene;public int status = 0;public bool isFirst = true;GUIStyle style;GUIStyle buttonStyle;float time = 60;float second = 0;void Start(){//scene = Director.getInstance().currentSceneController as FirstController;scene = Director.getInstance().currentSceneController as FirstController;style = new GUIStyle();style.fontSize = 40;style.normal.textColor = Color.red;style.alignment = TextAnchor.MiddleCenter;buttonStyle = new GUIStyle("button");buttonStyle.fontSize = 25;}private void Update(){//scene.click();}void OnGUI() {scene.hit();GUI.Label(new Rect(1000, 0, 400, 400), scene.getScore().ToString(),style);int buttonX = Screen.width / 2 - 45;int buttonY = Screen.height / 2 - 45;int labelX = Screen.width / 2 - 45;int labelY = Screen.height;游戲的暫停與繼續if (scene.GetGameState() == GameState.RUNNING && GUI.Button(new Rect(10, 10,90,90 ), "Pause",buttonStyle) ){scene.SetGameState(GameState.PAUSE);}if (scene.GetGameState() == GameState.PAUSE && GUI.Button(new Rect(10, 10, 90,90), "Run", buttonStyle)){scene.SetGameState(GameState.RUNNING);}//其實后面這幾個用來控制游戲開始和進入下一輪的的按鈕的出現邏輯我總覺得怪怪的if (scene.GetRound() == 2 && scene.GetGameState() == GameState.ROUND_FINISH){GUI.Label(new Rect(labelX, labelY, 90, 90), "You Have Finish All The Round");if (GUI.Button(new Rect(buttonX, buttonY, 90, 90), "Restart", buttonStyle)){scene.restart();}return;}if (scene.GetRound() == -1 && GUI.Button(new Rect(buttonX, buttonY, 90, 90), "Start",buttonStyle)) {scene.SetGameState(GameState.ROUND_START);}if (scene.GetGameState() == GameState.ROUND_FINISH && scene.GetRound() < 2 && GUI.Button(new Rect(buttonX, buttonY, 90, 90), "Next Round", buttonStyle)){scene.SetGameState(GameState.ROUND_START);}} }

動作管理之SSAction: SSAction是所有動作的基類,通過實現SSAciton來指定不同的動作

public class SSAction : ScriptableObject{public bool enable = false;public bool distroy = true;// Use this for initializationpublic GameObject gameObject { get; set; }public Transform transform { get; set; }public ISSActionCallback callback { get; set; }public virtual void Start(){throw new System.NotImplementedException();}// Update is called once per framepublic virtual void Update(){throw new System.NotImplementedException();}public void reset(){enable = false;distroy = true;gameObject = null;transform = null;callback = null;}}

動作管理之CCFlyAction: 飛碟的飛行動作

public class CCFlyAction: SSAction{private float gravityAcceleration = 9.8f;private int diraction;private float speed;private float flyTime;public override void Start(){diraction = gameObject.GetComponent<DiskData>().flyDiraction;speed = gameObject.GetComponent<DiskData>().speed;enable = true;distroy = false;flyTime = 0;}public override void Update(){if (gameObject.activeSelf){flyTime += Time.deltaTime;this.transform.Translate(new Vector3(diraction * Time.deltaTime * speed, -1 * flyTime * Time.deltaTime * gravityAcceleration, 0));if (this.transform.position.y < -4){this.enable = false;this.distroy = true;this.callback.SSActionEvent(this);}}}public static CCFlyAction GetAction(){CCFlyAction action = ScriptableObject.CreateInstance<CCFlyAction>();return action;}}

動作管理之動作管理器SSActionManager:這是所有動作管理器的基類

using System.Collections; using System.Collections.Generic; using UnityEngine; using Com.Action; public class SSActionManager : MonoBehaviour {private Dictionary<int, SSAction> actions = new Dictionary<int, SSAction>();private List<SSAction> waitingAdd = new List<SSAction>();private List<int> waitingDelete = new List<int>();protected void Update(){foreach (SSAction ac in waitingAdd){actions[ac.GetInstanceID()] = ac;}waitingAdd.Clear();foreach (KeyValuePair<int, SSAction> kv in actions){SSAction ac = kv.Value;if (ac.distroy){waitingDelete.Add(ac.GetInstanceID());}else if (ac.enable){ac.Update();}}foreach (int key in waitingDelete){SSAction ac = actions[key];actions.Remove(key);DestroyObject(ac);}waitingDelete.Clear();}public void RunAction(GameObject gameobject, SSAction action, ISSActionCallback manager){action.gameObject = gameobject;action.transform = gameobject.transform;action.callback = manager;waitingAdd.Add(action);action.Start();}protected void Start() {} }

動作管理之動作管理器CCActionManager:對SSManager進行了加強,用于管理某個對象的具體動作,為了減少開銷,CCActionManager也作為了一個工廠,用來管理CCFlyAction

using System.Collections; using System.Collections.Generic; using UnityEngine; using Com.Action; using Com.MyGame;public class CCActionManager :SSActionManager, ISSActionCallback {public int diskNum;public FirstController scene;float speed = 20f;Queue<SSAction> actions = new Queue<SSAction>();void ISSActionCallback.SSActionEvent(SSAction source, SSActionEventType events, int intParam, string strParam, Object objectParam){if (source is CCFlyAction) {diskNum --;DiskFactory df = Singleton<DiskFactory>.Instance;df.FreeDisk(source.gameObject);FreeAction(source);}}public void FreeAction(SSAction action){action.reset();actions.Enqueue(action);}void Start(){scene = Director.getInstance().currentSceneController as FirstController;scene.actionManger = this;}void Update(){//游戲處于運行狀態時飛碟才會飛if (scene.GetGameState() == GameState.RUNNING)base.Update();}SSAction GetAction(){SSAction action = null;if (actions.Count > 0){action = actions.Dequeue();}else{action = CCFlyAction.GetAction();}return action;}public void StartThrow(Queue<GameObject> disks){foreach(GameObject disk in disks) {RunAction(disk, GetAction(),(ISSActionCallback)this);}}}

動作管理之ISSActionCallback:這個我也不知道怎么描述他的功能,說是用來作為ActionManager和Action之間的通信,但我感覺也能用來規定動作執行完之后需要執行的行為

public enum SSActionEventType : int { Started, Competeted }public interface ISSActionCallback{void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Competeted,int intParam = 0, string strParam = null, Object objectParam = null);}

用來實現單例模式的模板

using System.Collections; using System.Collections.Generic; using UnityEngine;public class Singleton<T> : MonoBehaviour where T: MonoBehaviour {protected static T instance;public static T Instance{get{if (instance == null){instance = (T)FindObjectOfType(typeof(T));if (instance == null){}}return instance;}} }

總結

以上是生活随笔為你收集整理的unity3d开发鼠标打飞碟游戏(Hit UFO)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91九色成人 | 色哟哟在线视频 | 美日韩在线观看 | 精品国产99久久久久久 | 麻豆porn| 亚洲色网址 | 国产 日韩 一区 | 一级绝黄| 国产无遮挡又黄又爽在线观看 | 国产精品久久久久久亚洲伦 | 黄色大片在线看 | 体感预报日剧 | 永久免费看mv网站入口亚洲 | 老熟女毛茸茸浓毛 | 西欧free性满足hd老熟妇 | 亚洲天堂网站 | 国产在线一二三区 | 毛片国产精品 | 久久成人网18网站 | 久久精品国产77777蜜臀 | 一区二区三区久久久久 | 成人a v视频 | 韩国三级在线视频 | 欧美一区二区三区精品 | 国产视频观看 | 久久人人超碰 | 精品成人国产 | av老司机福利 | 性淫影院| 欧美日韩黄色网 | 91国偷自产中文字幕久久 | 国产美女又黄又爽又色视频免费 | 午夜天堂精品 | 国产一区二区三区免费视频 | 97射射 | 软萌小仙自慰喷白浆 | 日本美女毛茸茸 | 免费视频www在线观看网站 | 亚洲手机av| 国产欧美一区二区精品性色超碰 | 人人干人人艹 | 亚洲国产一级 | 日韩不卡一二三区 | 亚洲高清成人 | www.国产在线 | 偷拍久久久 | 亚洲一区www | 青青草在线视频免费观看 | 欧美午夜精品久久久久久蜜 | 久久免费手机视频 | 亚洲一区二区伦理 | 壮汉被书生c到合不拢腿 | 午夜精品久久久久久久久久蜜桃 | 热99视频| 久久成人18免费观看 | 黄色三级网站在线观看 | 99成人精品视频 | 精品国产一区二区三区四区 | 午夜精品99 | 日日操夜夜操狠狠操 | www.日韩.com| 亚洲无人区码一码二码三码的含义 | 一区二区三区在线 | 亚洲激情视频在线播放 | av黄在线| 欧美激情电影一区二区 | 国产成人在线视频免费观看 | 日本性视频网站 | 久久99精品久久久水蜜桃 | 日韩一区二区三区不卡视频 | 丁香婷婷激情五月 | 亚洲精品久久久久久久久久 | 国产人成在线观看 | 欧美日韩精品电影 | 男人的天堂在线观看av | 国产精品入口麻豆 | 在线视频久久 | 香蕉免费在线视频 | 人成在线免费视频 | 成人免费看高清电影在线观看 | 一区二区三区视频免费在线观看 | 特大黑人巨交吊性xxxx视频 | 日韩午夜一区 | 翔田千里一区二区 | 久久九九色 | 欧美老熟妇一区二区 | 99re这里只有精品66 | 国精品无码人妻一区二区三区 | jizz一区| 大乳丰满人妻中文字幕日本 | 国产妇女乱一性一交 | 最近中文字幕免费视频 | av在线免费观看一区 | 激情小说av | 国产xxxxxxxxx | 大尺度做爰呻吟62集 | 狠狠狠狠狠狠狠干 | 国产精品久久久久久久久久免费 | 色七七视频|