我目前在Unity中設置了兩個腳本來處理某些UI音頻。一個是經理,另一個是爲特定的用戶界面元素播放聲音。什麼,我有一個簡化的版本是這樣的:null合併操作員分配給自己
public class AudioUIManager : MonoBehaviour //Only one of these in the scene
{
public AudioClip genericUISound; //This is set in the inspector.
}
public class AudioUITextAnimation : MonoBehaviour
{
[SerializeField]
private AudioClip specifiedUISound; //This is not set in the inspector
[SerializeField]
private AudioUIManager audioUIManager; // I get a reference to this elsewhere
void Start()
{
//Use generic sounds from audio manager if nothing is specified.
specifiedUISound = specifiedUISound ?? audioUIManager.genericUISound;
print(specifiedUISound);
}
}
我試圖在這裏實現是有specifiedUISound
領域使用它被分配給它的檢查員的聲音。如果未分配聲音,則使用UI管理器中的通用聲音。這節省了我爲數百萬個需要相同聲音的按鈕分配相同的聲音,但是如果我願意的話,可以給我一個按鈕的特定聲音。
然而,包括空coalessing算asigning null
到specifiedUISound
即使爲null和audioUIManager
的聲音不。另外,我能得到這個工作,如果我使用三元運算檢查null像這樣:
specifiedUISound = specifiedUIsound == null ? audioUIManager.genericUISound : specifiedUISound;
我誤解了空合併運算符?爲什麼會發生?
編輯: Jerry Switalski指出,這隻發生在specifiedUISound
序列化時。 (如果它是public
或者它具有[SerializeField]
屬性)。任何人都可以點亮這裏發生的事情嗎?
s = s ?? 「測試」;在這裏工作正常 – Laurijssen
所以你說'foo = foo? bar'不起作用,但是'foo = foo == null? bar:foo'呢? Unity沒有改變C#規則,所以它一定是你的代碼。你是否可能在創建[mcve]方面做得太過分,以至於你刪除了太多相關的代碼? AudioClip是什麼類型的,它是一個結構體還是一個類? – CodeCaster
是的,我測試了這個例子,它重新創建了這個問題。如果你製作這兩個類並將它們添加到兩個不同的遊戲對象中,那麼它會重新創建它!如果我明顯不以這種方式使用它,它正常工作。 –