延續上次建立的 OldMan
// OldMan.cs
using UnityEngine;
public class OldMan
{
int health = 20;
int attack = 1;
float moveSpeed;
bool isDead = false;
string name;
int level = 1;
public OldMan()
{
Debug.Log("Good Morning~");
}
}
在 C# 中, public
是一個 access modifier,不同的 access modifier擁有不同的訪問權限,以下是 C# 中的所有access modifier
Modifier | 描述 |
---|---|
public |
對所有人公開,任何的 class 或 data members 都可以存取 |
private |
該 data member 僅能在自身的類別裡面被存取 |
protected |
該 data member 僅能在自身 class 和被繼承的子類別內進行存取 |
internal |
只有同一命名空間的類別可以進行存取 |
C# 中如果沒有給一個 class 中的 data member 一個 access modifier ,那麼 C# 預設會是 private
,也就是說,在 OldMan
這個 class 裡面的血量、攻擊、移動速度等全部的資料都屬於 private
,無法從外部訪問,那麼這樣我們就無法從第三者的角度知道這個 OldMan
的所有資訊了。因此,我們需要公開一些資訊,但又不要被從外部修改。我們修改一下 Level 變數的程式碼
// OldMan.cs
using UnityEngine;
public class OldMan
{
int health = 20;
int attack = 1;
float moveSpeed;
bool isDead = false;
string name;
public int Level { get; } = 1;
public OldMan()
{
Debug.Log("Good Morning~");
}
}
這裡的 get;
表示只能被讀取,因此我們能在另一個生成 OldMan
的 Script 中存取這個 Level 了!
// OldManManager.cs
using UnityEngine;
public class OldManManager : MonoBehaviour
{
OldMan oldman = new OldMan();
void Start() {
Debug.Log("my level is " + oldman.Level);
}
}
執行遊戲後:
我們成功從外部存取 OldMan
的資料了!
如果我們想要從外部程式修改 OldMan
裡面的數值,那就需要用到 set
,例如
// OldMan.cs
using UnityEngine;
public class OldMan
{
int health = 20;
int attack = 1;
float moveSpeed;
bool isDead = false;
string name;
public int Level { get; set;} = 1;
public string Name {
get {
return name;
}
set {
name = value;
}
}
public OldMan()
{
Debug.Log("Good Morning~");
}
}
這裡的 public int Level { get; set;} = 1;
代表外部程式可以透過 set
來更改 Level 的值,而再下面的 Name function,則是在 class 中常見的 get function,可以提供更好的安全性
// OldManManager.cs
using UnityEngine;
public class OldManManager : MonoBehaviour
{
OldMan oldman;
void Start() {
oldman = new OldMan();
oldman.Name = "John"
oldman.Level = 2;
}
}
透過剛剛的程式碼我們就能從外部程式複寫 Level
變數,並且利用 setter 方法指定了 name
的值