改进飞碟游戏
任務要求
實現過程
由于這次是在之前一次作業的基礎上完成的,所以首先將之前的代碼copy一份,然后對其進行修改。由于之前做的飛碟游戲并沒有采用老師提供的動作分離的結構,所以這次的更改也沒有采用老師提供的架構,就導致代碼的結構非常的混亂,由此可見一個好的代碼結構是多么的重要。
這次的實驗主要目的是添加一個物理運動,然后還可以在物理運動與運動學運動之間轉換。為了盡可能少的更改之前的代碼,所以只在局部采用了adapter的模式,主要就是對于物理運動的實現。首先定義一個物理運動的接口,然后使用一個類來繼承這個接口,并把它實現,然后再在控制類里面調用,從而實現物理學運動。
設置物理學運動的接口:
然后使用一個類來繼承并實現這個接口:
public class adapter : MonoBehaviour, grativity {/*void setGrativity(GameObject obj){obj.gameObject.GetComponent<Rigidbody>().AddForce(Vector3.down * 9.8f);}*/public void setGrativity(GameObject obj, Vector3 dir){//obj.gameObject.AddComponent<Rigidbody>();//obj.gameObject.GetComponent<Rigidbody>().AddForce(dir * 9.8f);obj.gameObject.AddComponent<Rigidbody>();obj.gameObject.GetComponent<Rigidbody>().AddForce(dir);obj.gameObject.GetComponent<Rigidbody>().useGravity = false;//throw new System.NotImplementedException();}public void removeGrativity(GameObject obj){obj.AddComponent<Rigidbody>();//u.GetComponent<Rigidbody>().AddForce(-dir[num]);Destroy(obj.GetComponent<Rigidbody>());}public void setmoveable(GameObject obj){if (obj.gameObject.GetComponent<Rigidbody>() != null){Destroy(obj.gameObject.GetComponent<Rigidbody>());}}// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {} }在控制類中就可以直接調用這個類來使用這些方法
控制其移動中:
移除時:
其他的一些改進
在之前版本的打飛碟游戲中由于飛碟是沒有添加剛體屬性的,所以在生成物體的時候都是將他們在同一個地方生成的,然后每個trial同時發射。這點在物理學運動時添加剛體后是有問題的,如果剛體生成時出現了重合,那么在讓其運動的時候就會出現劇烈的彈飛,導致飛碟飛行的路徑不好設置,所以為了改進這一點對于飛碟的生成發射方式進行了一個改進。
在每個trial,飛碟是一個一個生成并發射出去的,這樣就避免了兩個飛碟重合的情況,具體實現如下:
每當到達一個trial的時候控制變量create設置為1表示可以生成飛碟了,然后每隔0.2f的時間從工廠中拿出一個飛碟發射,達到依次發射飛碟的目的。
對于兩種模式的切換問題
題目中有說到同時實現兩個運動,所以就需要一個變量來控制現在到底使用的是哪種運動方式,而這個變量是可以在運行時被更改的。為了更加的簡單,所以我沒有設計一個專門的按鈕來實現切換,而是直接使用一個public的變量來進行控制,這樣就算在游戲運動場景中也可以進行變換。
然后在控制飛碟運動的時候就進行判斷,并調用不同的函數來實現
運行截圖
在空對象中就可以看到一個mod的選項,這里就可以對模式進行切換。
項目地址
總結
- 上一篇: vue cli4接入环信webIM
- 下一篇: 图像放大算法