天天看點

改進飛碟遊戲

任務要求

  1. 按adapter模式設計修改飛碟遊戲
  2. 同時支援實體運動和運動學運動

實作過程

由于這次是在之前一次作業的基礎上完成的,是以首先将之前的代碼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的選項,這裡就可以對模式進行切換。

項目位址

繼續閱讀