我有一個值字典Dictionary<string, ScreenState> _states
和一個string
持有當前的ScreenState
:
struct ScreenState
{
public string name;
public GameObject state;
private Dictionary<string, ScreenState> _childStates;
private string _currentChild;
public ScreenState ( GameObject fab )
{
name = fab.name;
state = Instantiate ( fab ) as GameObject;
state.transform.position = new Vector3 ( 100, 100, 100 );
_childStates = new Dictionary<string, ScreenState> ( );
GameObject[] children = fab.GetComponent<ChildStates>().childFABs;
for ( int ch = 0; ch < children.Length; ch )
_childStates.Add ( children [ ch ].name, new ScreenState ( children [ ch ] ) );
if ( _childStates.Count > 0 )
_currentChild = _childStates.ElementAt ( 0 ).Key;
else
_currentChild = null;
}
public void EnableState ( )
{
state.transform.position = new Vector3 ( -5, 2, -20 );
if ( _currentChild != null )
_childStates [ _currentChild ].EnableState ( );
}
public void DisableState ( )
{
state.transform.position = new Vector3 ( 100, 100, 100 );
if ( _currentChild != null )
_childStates [ _currentChild ].DisableState ( );
}
public void ChangeChildState ( string stt )
{
_childStates [ _currentChild ].DisableState ( );
_childStates [ stt ].EnableState ( );
_currentChild = stt;
}
}
ScreenStates 也有存盤在 中的子 ScreenStates,Dictionary<string, ScreenState> _childStates
它們用ChangeChildState
, 到改變_states[_currentState].ChangeChildState("foo");
。它幾乎完全按照我的意愿作業。玩家可以進入“Bazar”狀態,其中包含“BazarBuyBug”和“BazarBuyFurniture”。當 Bazar 狀態啟動時,它默認為 BazarBuyBug 狀態。當玩家改變子狀態時,當前啟用的子狀態被禁用,新的子狀態被啟用,新的當前子狀態存盤在_currentChild
.
它在它們之間正確切換,但是在設定了一堆 Debug 檢查以跟蹤整個代碼中 _currentChild 的值之后,看起來就像ChangeChildState
是在呼叫時,值_currentChild
僅針對函式范圍進行更改,并保持為“BazarBuyBug”永遠。因此,當狀態應該從 BazarBuyFurniture 更改時,子狀態永遠不會被禁用......這讓我陷入困境。
uj5u.com熱心網友回復:
您看到的問題是因為您使用struct
的是 ScreenState,它是一種“值型別”。
_states[_currentState].ChangeChildState("foo");
分解時,您的行首先獲取_states[_currentState]
結構,這是一個值型別,而不是字典中結構的參考物件。換句話說,它是一個新結構。因此,當您呼叫 時ChangeChildState("foo")
,您正在處理新物件,而不是存盤在字典中的物件。
最簡單的解決方案是將 ScreenState 更改為class
. 有些人會爭辯說,因為您在 ScreenState 中有“參考型別”,所以class
無論如何您都應該將其設為 a。
如果您希望或需要將 ScreenState 保留為struct
,您可以將代碼修改為:
var ss = _states[_currentState];
ss.ChangeChildState("foo");
_states[_currentState] = ss;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/511525.html
標籤:C#unity3d范围