前往
大廳
主題

Unity C# | OnCollisionEnter 的封裝

瓶裝雪 | 2023-07-21 19:00:09 | 巴幣 102 | 人氣 140

一、前言
  這篇文章將會講述 Unity 自帶參數的功能,在撰寫時要怎麼進行封裝。

二、問題闡述
  在碰撞器與觸發器共六種 Unity 內建的官方函式中,因為要直接使用攜帶的參數,所以很多人會習慣性的把程式碼添加在內,要封裝時容易因為剛學習封裝的概念,導致出現錯誤。

三、解決方式
  要解決這個問題,有兩種方式可以辦到:第一種是用帶參數的函式封裝;第二種是用斜線註解的方式封裝,本次封裝示範的程式碼將用以下內容為示範:

public class OnCollisionEnterTest : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.CompareTag("Cube"))
        {
            //Do something.
        }
    }
}

1. 用帶參數的函式封裝
  我們很常在 OnCollisionEnter 及其他五種函式中看到類似的寫法,也因為沒有 Collision 導致無法直接換成函式,只需要多一個步驟,就是把 Collision也添加到函式就可以了。

private void OnCollisionEnter(Collision collision)
    {
        CatchCube(collision);
    }
    private void CatchCube(Collision collision)
    {
        if (collision.gameObject.CompareTag("Cube"))
        {
            //Do something.
        }
    }
}

  如果有其他在運作的程式碼,也可以用相同的方式進行封裝,這樣一來在官方函式的下面會有很漂亮的不同功能,而不是雜亂的一堆程式碼。

2. 用斜線註解
  運用斜線進行註解也是可行的做法,如果不想要把程式碼切割分的太細,則可以考慮用斜線註解的方式,避免下一次編輯程式的時候還需要閱讀程式碼,可以直接開始撰寫新的內容。

private void OnCollisionEnter(Collision collision)
    {
        //Catch Cube To Do Something.
        if(collision.gameObject.CompareTag("Cube"))
        {
            //Do something.
        }
    }

  這就是一個很好的例子,我們把抓取 Cube 的程式碼前面說明公用,未來就可以略過這個程式碼去理解其他部分,或是針對這個部分去進行維護,優點在於可以提供更多資訊,缺點在於程式碼變長了。

四、其他應用
  在使用其他人撰寫的插件包時,我們也會遇到這樣的情況,他們大多數人在撰寫的時候都沒有經過妥當的封裝,而是在 Update 就寫完了所有的功能,並且在Update 裡面撰寫暫時變數。

  在之前我只能逐字去閱讀,非常沒有效率,也容易失去焦點,現在我們可以用帶參數的函式去封裝程式碼,把功能逐步拆分開來,整理完程式碼的同時,對於這個插件包的功用也就理解了。

五、後記
  這篇文章講的東西其實不是那麼的特別,甚至我認為可能不用寫成文章,因為有人會跟我說:「不是本來就這樣做嗎?」,但我又想到我之前的確是不知道這件事情,想了想就寫一篇文章講述這件事情了。

送禮物贊助創作者 !
0
留言

創作回應

⊰⊱求出處學術用⊰⊱
謝謝分享
2023-07-21 19:19:49

更多創作