任務要求
- 按adapter模式設計修改飛碟遊戲
- 同時支援實體運動和運動學運動
實作過程
由于這次是在之前一次作業的基礎上完成的,是以首先将之前的代碼copy一份,然後對其進行修改。由于之前做的飛碟遊戲并沒有采用老師提供的動作分離的結構,是以這次的更改也沒有采用老師提供的架構,就導緻代碼的結構非常的混亂,由此可見一個好的代碼結構是多麼的重要。
這次的實驗主要目的是添加一個實體運動,然後還可以在實體運動與運動學運動之間轉換。為了盡可能少的更改之前的代碼,是以隻在局部采用了adapter的模式,主要就是對于實體運動的實作。首先定義一個實體運動的接口,然後使用一個類來繼承這個接口,并把它實作,然後再在控制類裡面調用,進而實作實體學運動。
設定實體學運動的接口:
public interface grativity
{
void setGrativity(GameObject obj, Vector3 dir);
void removeGrativity(GameObject obj);
}
然後使用一個類來繼承并實作這個接口:
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 initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
在控制類中就可以直接調用這個類來使用這些方法
控制其移動中:
移除時:
其他的一些改進
在之前版本的打飛碟遊戲中由于飛碟是沒有添加剛體屬性的,是以在生成物體的時候都是将他們在同一個地方生成的,然後每個trial同時發射。這點在實體學運動時添加剛體後是有問題的,如果剛體生成時出現了重合,那麼在讓其運動的時候就會出現劇烈的彈飛,導緻飛碟飛行的路徑不好設定,是以為了改進這一點對于飛碟的生成發射方式進行了一個改進。
在每個trial,飛碟是一個一個生成并發射出去的,這樣就避免了兩個飛碟重合的情況,具體實作如下:
每當到達一個trial的時候控制變量create設定為1表示可以生成飛碟了,然後每隔0.2f的時間從工廠中拿出一個飛碟發射,達到依次發射飛碟的目的。
對于兩種模式的切換問題
題目中有說到同時實作兩個運動,是以就需要一個變量來控制現在到底使用的是哪種運動方式,而這個變量是可以在運作時被更改的。為了更加的簡單,是以我沒有設計一個專門的按鈕來實作切換,而是直接使用一個public的變量來進行控制,這樣就算在遊戲運動場景中也可以進行變換。
然後在控制飛碟運動的時候就進行判斷,并調用不同的函數來實作
運作截圖
在空對象中就可以看到一個mod的選項,這裡就可以對模式進行切換。
項目位址