Unity C# | virtual & override

閱讀時間約 4 分鐘

一、前言

  這篇文章將會講述虛擬(virtual)與覆蓋(override)的簡易使用方式。


二、虛擬(virtual)

  虛擬具有多態性(Polymorphism)與擴展性(Extensibility),能讓程式根據實際運用產生不同效果,並方便程式員擴展程式碼而不用訪問基類。


1. 多態性(Polymorphism)

  當基類中的方法被標記為 virtual 時,它可以在派生類別中被覆寫(override)。當A腳本繼承B的內容時,稱B為基類、A為派生類別。這使得相同的函式,根據實際對象的類型而執行不同的實現,這稱之為多態性。


2. 擴展性(Extensibility)

  因為覆寫的存在,可以在不觸碰基類的情況下,擴增或修改基類的函式與變數,這種在不修改現有程式碼的情況下增加功能,稱為擴展性。


3. 存取修飾詞

  談到繼承與覆寫,就可以了解一個新的存取修飾詞"protected"了,該存取修飾詞所修飾的欄位,只有在派生類別才能存取。


三、覆蓋(override)

  基本上覆蓋(override)跟虛擬(virtual)是一起使用的,用於派生類別中覆蓋基類的函式或變數。


1. 用法

  在派生類別中,創建一個與基類一模一樣的函式,在其存取修飾詞後面添加"Override"修飾詞即可。使用 override 以後,就可改寫該函式或變數,可以結合基類的程式,或是完全重寫。


2. 基類

  在派生類別中,如果想執行基類的程式,則可以在覆蓋的函式中打上"Base.Function();"來執行基類的函式,該處的 Function(); 則是這個函式的名稱。


四、使用流程

  在 Unity 中,有一個很常用的繼承,那就是 MonoBehaviour,任何腳本只能繼承一個類別,因此可能會被 Monobehaviour 給困住,只要把含 MonoBehaviour 的腳本當作基類即可。


1. 在 Unity 中創建空腳本

  在 Unity 中創建一個空的腳本,命名為"VirtualTest"並刪除不必要的 Start 與 Update 函式。


using UnityEngine;


public class VirtualTest : MonoBehaviour

{

}


2. 宣告虛擬類型

  隨後,宣告虛擬類型。


using UnityEngine;


public class VirtualTest : MonoBehaviour

{

protected virtual void virtualMethod() { }

}


3. 創建新的腳本並繼承腳本

  創建一個新的腳本"VirtualTest_Child",同樣刪除不必要的函式,這次把 Monobehaviour 換成"VirtualTest"。


using UnityEngine;


public class VirtualTest_Child : VirtualTest

{

}


4. 覆蓋虛擬類型

  創建同樣命名的函式,連同存取關鍵字一起照抄,原本 virtual 的位置改為 override ,這樣就成功了。


using UnityEngine;


public class VirtualTest_Child : VirtualTest

{

protected override void virtualMethod()

{

//Do something

}

}


5. 執行基類程式

  如果希望執行基類程式,則添加"base.virtualMethod();"即可,該行程式碼會執行基類的程式內容。


using UnityEngine;


public class VirtualTest_Child : VirtualTest

{

protected override void virtualMethod()

{

base.virtualMethod();

}

}


五、後記

  最近天氣真的很冷,還要趕專題的進度,總覺得寫文章的時間越來越少了阿。

avatar-img
106會員
247內容數
對設計師如何成長為設計師好奇嗎? 2020年九月,我進入大學學習當一位設計師,從開始到沉寂,再到重燃熱忱,我將在方格子紀錄我的成長歷程、理念、心情,分享我在這段旅程中所經歷的故事。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
瓶裝雪的沙龍 的其他內容
期末結束了,我將分享我的作品、開發狀況、開發方向。
這篇文章將會介紹第三人稱遊戲設計中,關於角色的建模與動畫的設計與製作。
這篇文章將會講述設計與製作一款第三人稱控制器所需要的工具、要素之概述。
這篇文章將會分享我用 Time line 製作的 Unity 部份概念動畫,並講述其中要呈現的特點與打擊感的分析。
這篇文章將會講述 Time line 的基礎軌道,並分享官方製作的 Time line 素材包。
期末結束了,我將分享我的作品、開發狀況、開發方向。
這篇文章將會介紹第三人稱遊戲設計中,關於角色的建模與動畫的設計與製作。
這篇文章將會講述設計與製作一款第三人稱控制器所需要的工具、要素之概述。
這篇文章將會分享我用 Time line 製作的 Unity 部份概念動畫,並講述其中要呈現的特點與打擊感的分析。
這篇文章將會講述 Time line 的基礎軌道,並分享官方製作的 Time line 素材包。
你可能也想看
Google News 追蹤
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
前篇測試如何把提示詞生成的圖像細節提高,這篇要測試的工作流是把任意圖像載入後經由放大模型放大,同時測試放大後重繪看看效果如何。
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
前篇測試如何把提示詞生成的圖像細節提高,這篇要測試的工作流是把任意圖像載入後經由放大模型放大,同時測試放大後重繪看看效果如何。