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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity3D-打飞碟小游戏

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

打飛碟(Hit UFO)游戲

    • 要求
    • 游戲規(guī)則
    • 游戲?qū)崿F(xiàn)
      • 代碼結(jié)構(gòu)
        • 導(dǎo)演類
        • 飛碟工廠
        • 場景控制類
        • 動作管理類
        • UI實現(xiàn)
        • 積分規(guī)則
    • 游戲運行截圖
    • 參考資料

要求

  • 游戲有 n 個 round,每個 round 都包括10 次 trial;
  • 每個 trial 的飛碟的色彩、大小、發(fā)射位置、速度、角度、同時出現(xiàn)的個數(shù)都可能不同。它們由該 round 的 ruler 控制;
  • 每個 trial 的飛碟有隨機性,總體難度隨 round 上升;
  • 鼠標(biāo)點中得分,得分規(guī)則按色彩、大小、速度不同計算,規(guī)則可自由設(shè)定
  • 使用帶緩存的工廠模式管理不同飛碟的生產(chǎn)與回收,該工廠必須是場景單實例的
  • 近可能使用前面 MVC 結(jié)構(gòu)實現(xiàn)人機交互與游戲模型分離
    工廠模式:

工廠模式:飛碟工廠的設(shè)計模式是單實例的工廠,分?jǐn)?shù)和場景控制及各種預(yù)制的分離和使用

游戲規(guī)則

  • 每個回合60s,玩過3關(guān)之后勝利
  • 飛碟不同的顏色,大小對應(yīng)不同的分?jǐn)?shù)
  • 回合60s內(nèi)達到500分進入下一關(guān),不能達到500分則失敗

游戲?qū)崿F(xiàn)

代碼結(jié)構(gòu)

導(dǎo)演類

public class SSDirector : System.Object {public static SSDirector _instance;public ISceneController currentScenceController { get; set; }public bool running { get; set; }public static SSDirector getInstance(){if (_instance == null){_instance = new SSDirector();}return _instance;}public int getFPS(){return Application.targetFrameRate;}public void setFPS(int fps){Application.targetFrameRate = fps;}public void NextScene(){Debug.Log("no next scene");} }

飛碟工廠

工廠里面實現(xiàn)功能:GetDisk()和FreeDisk()

飛碟工廠類,在場景控制器需要某種飛碟的時候,飛碟工廠從倉庫(List free)中獲取這種飛碟,如果倉庫中沒有,則實例化一個新飛碟,然后添加used list 中
當(dāng)場景控制器發(fā)現(xiàn)飛碟被打中或者飛碟掉出攝像機視野外,將執(zhí)行回收飛碟,在used list 刪除飛碟,然后將該飛碟的數(shù)據(jù)添加到free_list中循環(huán)利用

  • 偽代碼設(shè)計
GetDisk() IF (free list has disk) THEN a_disk = remove one from list ELSE a_disk = clone from Prefabs ENDIF Set Disk_Data of a_disk with the ruler Add a_disk to used list Return a_disk FreeDisk() Find disk in used list IF (not found) THEN Remove exception Move disk from used to free list
  • 代碼實現(xiàn)
public class DiskFactory : MonoBehaviour {private List<GameObject> used = new List<GameObject>();private List<GameObject> free = new List<GameObject>();private Color[] color = { Color.red, Color.green, Color.blue, Color.yellow };public GameObject GetDisk(int ruler){GameObject a_disk;if (free.Count > 0){a_disk = free[0];free.Remove(free[0]);}else{a_disk = GameObject.Instantiate(Resources.Load("prefabs/Disk")) as GameObject;Debug.Log(a_disk);}a_disk.GetComponent<DiskData>().size = UnityEngine.Random.Range(0, 7-ruler);a_disk.GetComponent<DiskData>().color = color[UnityEngine.Random.Range(0, 4)];a_disk.GetComponent<DiskData>().speed = UnityEngine.Random.Range(5+ruler, 8+ruler);a_disk.transform.localScale = new Vector3(a_disk.GetComponent<DiskData>().size * 2, a_disk.GetComponent<DiskData>().size * 0.1f, a_disk.GetComponent<DiskData>().size * 2);a_disk.GetComponent<Renderer>().material.color = a_disk.GetComponent<DiskData>().color;a_disk.SetActive(true);used.Add(a_disk);return a_disk;}public void FreeDisk(GameObject disk){for(int i = 0; i < used.Count; i++){if(used[i] == disk){disk.SetActive(false);used.Remove(used[i]);free.Add(disk);}}} }
  • 飛碟數(shù)據(jù)由round的ruler控制
a_disk.GetComponent<DiskData>().size = UnityEngine.Random.Range(0, 7-ruler); a_disk.GetComponent<DiskData>().color = color[UnityEngine.Random.Range(0, 4)]; a_disk.GetComponent<DiskData>().speed = UnityEngine.Random.Range(10+ruler, +ruler);

場景控制類

  • 場景單實例,運用模板,可以為每個 MonoBehaviour子類 創(chuàng)建一個對象的實例
public class Singleton<T> where T : MonoBehaviour {private static T instance;public static T Instance{get{if (instance == null){instance = (T)Object.FindObjectOfType(typeof(T));if (instance == null){Debug.LogError("Can't find instance of " + typeof(T));}}return instance;}} }
  • 射擊條件
public void shoot() {if (Input.GetMouseButtonDown(0) && (state == State.START || state ==State.CONTINUE)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)){if ((SSDirector.getInstance().currentScenceController.state ==State.START || SSDirector.getInstance().currentScenceController.state== State.CONTINUE)){shootAtSth = hit.transform.gameObject;explosion.transform.position =hit.collider.gameObject.transform.position;explosion.GetComponent<Renderer>().material =hit.collider.gameObject.GetComponent<Renderer>().material;explosion.GetComponent<ParticleSystem>().Play();}}} }
  • 加載飛碟,從飛碟工廠得到飛碟并將飛碟加入場景
  • 檢查飛碟是否需要回收
  • 判斷游戲狀態(tài)
public void Judge(){if(shootAtSth != null && shootAtSth.transform.tag == "Disk" && shootAtSth.activeInHierarchy){scoreRecorder.Record(shootAtSth);diskFactory.FreeDisk(shootAtSth);shootAtSth = null;}if(scoreRecorder.getScore() > 500 * round){round++;leaveSeconds = count = 60;}if (round == 4) {StopAllCoroutines();state = State.WIN;}else if (leaveSeconds == 0 && scoreRecorder.getScore() < 500 * round) {StopAllCoroutines();state = State.LOSE;} elsestate = State.CONTINUE;}

動作管理類

public class RoundActionManager : SSActionManager, ISSActionCallback {public RoundController scene;public MoveToAction action1, action2;public SequenceAction saction;float speed;public void addRandomAction(GameObject gameObj){int[] X = { -20, 20 };int[] Y = { -5, 5 };int[] Z = { -20, -20 };Vector3 starttPos = new Vector3(UnityEngine.Random.Range(-20, 20),UnityEngine.Random.Range(-5, 5),UnityEngine.Random.Range(50, 10));gameObj.transform.position = starttPos;Vector3 randomTarget = new Vector3(X[UnityEngine.Random.Range(0, 2)],Y[UnityEngine.Random.Range(0, 2)],Z[UnityEngine.Random.Range(0, 2)]);MoveToAction action = MoveToAction.getAction(randomTarget, gameObj.GetComponent<DiskData>().speed);RunAction(gameObj, action, this);}protected void Start(){scene = (RoundController)SSDirector.getInstance().currentScenceController;scene.actionManager = this;}protected new void Update(){base.Update();}public void actionDone(SSAction source){Debug.Log("Done");} }

UI實現(xiàn)

代碼詳見/asset/script/UserGUI.cs

積分規(guī)則

飛碟速度越快,體積越小,得到的分?jǐn)?shù)就越高,不同顏色的飛碟得分情況的也不同

public class ScoreRecorder : MonoBehaviour {private float score;public float getScore(){return score;}public void Record(GameObject disk){score += (100 - disk.GetComponent<DiskData>().size *(20 - disk.GetComponent<DiskData>().speed));Color c = disk.GetComponent<DiskData>().color;switch (c.ToString()){case "red":score += 250;break;case "green":score += 200;break;case "blue":score += 150;break;case "yellow":score += 100;break;}}

游戲運行截圖

項目鏈接
視頻演示鏈接

參考資料

感謝此篇參考博客
爆炸效果學(xué)習(xí)

總結(jié)

以上是生活随笔為你收集整理的Unity3D-打飞碟小游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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