遊戲開發前學習筆記|Unity C#| day 2 學習基礎[2]

更新於 發佈於 閱讀時間約 10 分鐘

前言

這是紀錄本人學習Unity C#時的筆記,希望讓自己能夠整理思緒,方便記憶。 因為是新手自學的關係,也很有可能有誤解或錯誤的地方,請見諒…

類別Class

創造類別之後就可以持續使用創建的類別來創建物件,以武器為例,在遊戲裡有不同的武器,但是他們的屬性是一樣的,我們就可以在一個類別裡面設定不同的屬性來給不同的武器(物件)使用。
public class Weapon  //創建一個名為Weapon的類別
{
	private float _attack;
	private float _attackSpeed;
	private int _levelLimit;
    //給予Weapon的類別裡三種屬性
}
↑為甚麼屬性要使用private而不是public,因為public不能夠給予限制,所以不夠安全(目前學到的,不知道有沒有例外),比如有可能出現負數的攻擊力或是負數的等級。
	public float getAttack()
	{
		return _attack;
	}
	public void setAttack(float attack)
	{
		if (attack < 0)
		{
			attack = 0; //讓攻擊力不會為負數
		}
		_attack = attack;
	}
↑利用上一篇使用到的method,再加上一些限制,就可以在調整屬性的時候不會出現設計者不想出現的數值(在這裡是不想出現負數的攻擊力)

另一種的封裝get與set的方式

這一種方法的好處是可以直接在inspector設置一些變數的設定欄位,方便在設定屬性時直接在Unity裡面操作。
	public int levelLimit
	{
		get
		{
			return _levelLimit;
		}
		set
		{
			if (value < 0)
			{
				value = 0;
			}
			_levelLimit = value;
		}
	}
然後使用
NoviceSword.levelLimit = 50;
//set值,如果照之前的方式就是等於NoviceSword.setLevelLimit();
NoviceSword.levelLimit;
//get值,如果照之前的方式就是等於NoviceSword.getLevelLimit();
※備註1
雖然說按照上方的方式好處是可以直接在inspector設置一些變數的設定欄位,但是原本的setAttack()的方法我用以下方法↓一樣可以在inspector裡面直接調整NoviceSword的攻擊力…
[SerializeField] private int 調整攻擊力;
void Start()
{
    Weapon NoviceSword = new Weapon();
    NoviceSword.setAttack(調整攻擊力);
    Debug.Log("攻擊力:" + NoviceSword.getAttack());
}
先記錄一下,應該有甚麼地方我誤會了。

物件

利用已封裝屬性的class創建物件,(這裡的封裝是指將屬性設為private,並且給予條件限制,請看上方攻擊力相關的程式碼。)
承接之前的程式碼,利用上方創建的Weapon類別,來創建名為NoviceSword的Weapon,以下以設定攻擊力屬性為例:
void Start()
	{
		Weapon NoviceSword = new Weapon();
		NoviceSword.setAttack(100);
		Debug.Log("攻擊力:" + NoviceSword.getAttack());
	}
這樣就可以在屬性為private的情況下,修改屬性了,當然也可以使用前面的另一種方式來設定Weapon的屬性與修改。
有幾種屬性要設定就照著設定幾次。

建構子Constructor(有時簡稱ctor)別稱:構造方法、建構式)

如果不想要每一個屬性要設定的時候都要打一行程式碼來給予值的話,可以使用建構子,一次設定完屬性。
public class Weapon
{
	private float _attack;
	private float _attackSpeed;
	private int _levelLimit;
	public Weapon()
	{
	}
	/*加上上方這一段是讓Weapon()小括號裡的值給予預設為0的參數,
不然只打下方的程式碼的話,
          使用Weapon NoviceSword = new Weapon();會報錯沒有給予值。
          必須使用Weapon NoviceSword = new Weapon(10,10,10);
          像這樣有給予初始值的話才可以不打這一小段程式碼*/
	
	public Weapon(float attack, float attackSpeed, int levelLimit)
	{
		_attack = attack;
		_attackSpeed = attackSpeed;
		_levelLimit = levelLimit;
	}
}
↑建構子的格式:
  • 名稱必須和類別一樣(在這個例子裡面都叫做Weapon)。
  • 沒有回傳值(可以看到Weapon()前面直接是接public,沒有void也沒有int或是float)。
如何使用:
	Weapon NoviceSword = new Weapon(100, 280, 50);
        /*創建了一個名為NoviceSword的Weapon,屬性為…
       float attack = 100,
       float attackSpeed = 280,
       int levelLimit = 50。

結構Struct

Struct與Class的使用格式基本上是一樣的,但是兩者在數值的類型上有差別。
按照我自己的理解Class有點像是上一篇裡面的Call By Reference,數值為參考類型(reference type),也就是對其中一個參數進行的變更可能會影響另一個參數所參考的物件,一種順著Class數值的地址順藤摸瓜找參數的感覺。
Struct則比較像是上一篇裡面的Call By Value,數值為實值型別(value type),也就是在傳遞參數時,是複製一份相同的資料結構後,再對資料進行處理。

命名空間namespace

Namespace它表示著一個識別碼(identifier)的可見範圍。一個識別碼可在多個命名空間中定義,它在不同命名空間中的含義是互不相干的。這樣,在一個新的命名空間中可定義任何識別碼,它們不會與任何已有的識別碼發生衝突。
命名空間- 維基百科
命名空間(namespace),在我的理解裡像是資料夾,比如我們想要創造兩個不同種族的同一個名稱的Class,一個方法就是類別的名稱都不重複,或者我們可以創造這兩個種族的namespace然後在裡面創造同個名字的Class而不產生衝突。比如
namespace 種族A
{
    public class Weapon
    {
    }
}
namespace 種族B
{
    public class Weapon
    {
    }
}
使用的方法,在類別最上方可以使用using來指定預設是使用哪個名稱空間,例如:
using UnityEngine;
using System.Collections;
using 種族A;
public class 測試命名空間 : MonoBehaviour
{
	void Start()
	{
		種族A.Weapon 武器1 = new 種族A.Weapon();
		種族B.Weapon 武器2 = new 種族B.Weapon();
		Weapon 武器3 = new Weapon();
	}
}
在這種狀況,武器1武器2因為有指名道姓的創建物件,
所以武器1是使用種族AWeapon類別
武器2
則是使用種族BWeapon類別
武器3因為沒有指名道姓,所以程式碼會往上找有使用using的名稱空間裡的類別來優先使用,所以武器3是使用種族AWeapon類別
※備註2
如果在這個例子裡面最上方同時使用using 種族A; 與 using 種族B; 則系統會無法判斷要使用哪一個名稱空間裡的Weapon類別。
會報錯'Weapon' is an ambiguous reference between '種族A.Weapon' and '種族B.Weapon'

靜態成員Static

紀錄一下…似懂非懂…目前粗淺的理解,加上 static 修飾詞來宣告為靜態後,就會被存入Global,大家一起共用,任何人都可以使用,沒有存活周期,所以會一直佔用記憶體,因為共用所以也很難控制存取權限。
所以也不能把static變數所在的類別new變成物件之後使用static變數,只能使用類別名稱去限定該static變數來使用。
public class TestStatic : MonoBehaviour
{
	public static int staticVariable = 0;
	public int variable = 0;
	void Start()
	{
		TestStatic.staticVariable = 2; 
只能使用類別名稱去限定該static變數來使用↑
如果int variable像上面static變數一樣使用類別名稱來限定的話則會出錯
ex : TestStatic.Variable = 2; (此為錯誤例子
		TestStatic test = new TestStatic();
		test.variable = 20;
new一個新物件之後才可以使用非靜態的變數static變數則是不可在此使用
ex : test.staticVariable = 20;(此為錯誤例子
	}
}
avatar-img
2會員
2內容數
想要有能力獨立開發遊戲,所以來寫個學習筆記,方便自己整理思緒。畢竟是Indie Game,所以程式、美術、企劃都要學習(抖。遊戲引擎選定Unity,C#也是從零開始學,任重道遠啊…
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
立言的沙龍 的其他內容
前言 這是紀錄本人學習Unity C#時的筆記,希望讓自己能夠整理思緒,方便記憶。 因為是新手自學的關係,也很有可能有誤解或錯誤的地方,請見諒… 變數 宣告變數不能使用數字開頭,或是除了_之外的符號。 ·整數 int ·浮點數 float、double float 精度低、佔的資源較少,double
前言 這是紀錄本人學習Unity C#時的筆記,希望讓自己能夠整理思緒,方便記憶。 因為是新手自學的關係,也很有可能有誤解或錯誤的地方,請見諒… 變數 宣告變數不能使用數字開頭,或是除了_之外的符號。 ·整數 int ·浮點數 float、double float 精度低、佔的資源較少,double
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
這篇內容,將會講解什麼是變數範圍,以及與變數範圍相關的知識。包括變數範圍的簡介、實體變數、全域變數、局部變數、常數。
Thumbnail
這篇內容,將會用一個簡單的範例,來解釋物件(Object)和實體(Instance)的差別。包括Instance的簡介、ID、物件改變會影響實體。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
內容涵蓋資料型別、型別轉換、自訂型別、元組型別、集合型別和字典型別等主題。文章首先詳述內建型別如bool、byte、char等的定義和使用,接著討論型別轉換,包括隱含轉換和明確轉換。之後文章介紹自訂型別的建立,以及元組、集合、陣列和字典型別的操作與例子。
Thumbnail
C#程式由一或多個檔案組成,包含命名空間、類別、結構、介面、列舉和委派等型別。Main方法是C#應用程式的進入點。在C#中,註解用於在程式碼中添加說明,有單行和多行兩種類型。變數的定義需要指定變數的類型和名稱,可以一次為多個變數賦值。
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
這篇內容,將會講解什麼是變數範圍,以及與變數範圍相關的知識。包括變數範圍的簡介、實體變數、全域變數、局部變數、常數。
Thumbnail
這篇內容,將會用一個簡單的範例,來解釋物件(Object)和實體(Instance)的差別。包括Instance的簡介、ID、物件改變會影響實體。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
內容涵蓋資料型別、型別轉換、自訂型別、元組型別、集合型別和字典型別等主題。文章首先詳述內建型別如bool、byte、char等的定義和使用,接著討論型別轉換,包括隱含轉換和明確轉換。之後文章介紹自訂型別的建立,以及元組、集合、陣列和字典型別的操作與例子。
Thumbnail
C#程式由一或多個檔案組成,包含命名空間、類別、結構、介面、列舉和委派等型別。Main方法是C#應用程式的進入點。在C#中,註解用於在程式碼中添加說明,有單行和多行兩種類型。變數的定義需要指定變數的類型和名稱,可以一次為多個變數賦值。
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。