假設我將以下類附加到游戲物件:
public class SomeClass : MonoBehaviour
{
[SerializeField]
private bool aBool;
public bool ABool
{
get
{
return aBool;
}
set
{
Debug.Log("we are setting the bool!");
// triggered when changing from false to true
if (aBool == false && value == true)
{
// do stuff
}
// triggered when changing from true to false
if (aBool == true && value == false)
{
// do stuff
}
aBool = value;
}
}
// Other fantastic methods and etc here.
}
當我玩游戲并在檢查器中選中游戲物件上的 aBool 復選框時,未觸發 set 方法。我的除錯日志陳述句沒有觸發,所以看起來沒有進入set方法。
玩游戲時,如何在檢查器視窗中設定布林值時觸發 set 方法?我在創建屬性時做錯了什么嗎?
uj5u.com熱心網友回復:
Inspector 本身不知道您的類中的任何屬性。它總是只公開序列化的欄位。另請參閱Unity 腳本序列化。
一個欄位和屬性是非常不同的事情。您不是簡單地將 setter 和 getter 添加到Field,而是將您的Field轉換為Property。
你所看到的和編輯在檢查是不是該物業 ABool而是場 aBool本身絕不知道的某個屬性ABool與setter和getter存在于所有。
混淆可能是由于 Inspector 自動格式化所有公開欄位的名稱以供“人類可讀”顯示
- 總是以大寫字母開頭
- 從小寫字母切換到大寫字母時插入空格
(基本上將每個大寫字母或數字及其后面的所有小寫字母都視為一個單詞) - 無視領導
_ - 一些特殊情況,例如忽略領先
m_
所以基本上無論你是否將一個領域稱為
public bool aBool;
public bool ABool;
public bool _aBool;
public bool _ABool;
public bool m_aBool;
public bool m_ABool;
檢查員將為所有這些顯示A Bool。
提到的一種方法是使用OnValidatewhich s 在通過檢查器更改此組件的值時自動呼叫,并執行例如
private void OnValidate()
{
// Only call properties during PlayMode since they might depend on runtime stuff
if(!Application.isPlaying) return;
ABool = aBool;
}
在您的情況下,問題當然是value != aBool永遠不會true因為aBool已經設定為該值。
為了避免這種情況,您需要引入另一個控制標志
[SerializeField] bool aBool;
private bool _oldABool;
public bool ABool
{
get => aBool;
set
{
aBool = value;
if(aBool != _oldABool)
{
if(aBool)
{
// do stuff
}
else
{
// do stuff
}
}
_oldABool = aBool;
}
}
private void OnValidate()
{
// Only call properties during PlayMode since they might depend on runtime stuff
if(!Application.isPlaying) return;
ABool = aBool;
}
另一種方法是實作您自己的欄位屬性,例如在OnValueChanged 中提到的用于腳本物件中的欄位
uj5u.com熱心網友回復:
為處于相同情況的其他人發帖。
在 unity 中,當您在檢查器中暴露了一個 bool,它也有一個覆寫 set 方法的屬性,當在檢查器中設定 bool 時,它不會呼叫 set 方法。相反,它直接修改 bool。
如果您希望能夠在檢查器中更改 bool 并檢測它何時在腳本中更改,則需要輪詢更新函式中的更改。
這使我的特定用例更加冗長,但哦,好吧。
uj5u.com熱心網友回復:
我想任何人都沒有注意到 OP 正在設定 abool 變數,并且在 Abool 變數上有 getter 和 setter。顯然,當讀寫發生在 Abool 而不是 abool 時,setter 和 getter 將被觸發。但是 OP 正在設定 abool 而不是 Abool。此外,屬性(具有 get/set 方法的變數)不能在檢查員中公開以由檢查員自己設定。它們只能通過代碼進行更改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/359540.html
