目前我正在使用 Toggles 來選擇影像串列,但遇到了一個有趣的問題。
我正在使用一個名為 Radio Group 的 Toggle Group,它下面有 3 個開關。每次選擇切換時,命令
PlayerPrefs.SetInt("SaveToggleId", id);
正在運行。在此,切換 1 的 id 編號為 0,切換 2 為 1,依此類推。
因此,當我下次嘗試讀取此資料時,以下代碼集在 Start 中使用時始終讀取為 0,而在 Awake 中使用時始終讀取正確值
toggleGroupId = PlayerPrefs.GetInt("SaveToggleId");
toggleGroupObject = GetComponent<ToggleGroup>();
SelectStartingToggle(toggleGroupId);
當我在各個地方將此代碼與 Debug.log() 陳述句結合使用時,我發現在 Start 中使用時,它首先從選擇第一個切換時關聯的函式中讀取,然后存盤 0 。但是當我在 Awake 中使用它時,它會讀取存盤在 PlayerPrefs 中的正確值并選擇正確的初始值
我的解釋是,因為 Awake 在 Start 之前執行,所以它有足夠的時間從 PlayerPrefs 讀取給出正確的值。此外,當我僅使用 Start() 中的數字時,如下所示
SelectStartingToggle(3);
它正確選擇了正確的切換,而當我使用 PlayerPref 而不是 number 時,它選擇了錯誤的值。
我的解釋正確還是我遺漏了什么?還有如何確保代碼執行停止,直到讀取來自 PlayerPref 的資料。這是完整的代碼:
public class RadioButtonSystem : MonoBehaviour
{
ToggleGroup toggleGroupObject;
private int toggleGroupId;
// Start is called before the first frame update
private void Awake()
{
toggleGroupId = PlayerPrefs.GetInt("SaveToggleId");
toggleGroupObject = GetComponent<ToggleGroup>();
Debug.Log("SaveToggleId........" toggleGroupId);
SelectStartingToggle(toggleGroupId);
}
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void onSelectedToggle1()
{
SaveToggleId(0);
}
public void onSelectedToggle2()
{
SaveToggleId(1);
}
public void onSelectedToggle3()
{
SaveToggleId(2);
}
public void SelectStartingToggle(int id)
{
Toggle[] toggles = GetComponentsInChildren<Toggle>();
toggles[id].isOn = true;
}
public void SaveToggleId(int id)
{
PlayerPrefs.SetInt("SaveToggleId", id);
Debug.Log("SaveToggleId........saving..........." PlayerPrefs.GetInt("SaveToggleId"));
}
/* Toggle GetSelectedToggle()
{
Toggle[] toggles = GetComponentsInChildren<Toggle>();
foreach (var t in toggles)
if (t.isOn) return t; //returns selected toggle
return null; // if nothing is selected return null
}*/
}
uj5u.com熱心網友回復:
Playerprefs 保存在OnApplicationQuit(). 如果您想立即保存它,請呼叫PlayerPrefs.Save()。之后PlayerPrefs.SetInt()。
順便說一句,來自統一腳本api:
此函式會寫入磁盤,可能會導致小問題,因此不建議在實際游戲程序中呼叫。
uj5u.com熱心網友回復:
在編輯/專案設定中有一個名為腳本執行順序的選項卡,您可以在其中設定腳本的執行順序。例如,您有一個“LoadManager”腳本,您將其優先級設定為 1,并將依賴它的所有內容設定為更大的數字,例如 10。
如果您這樣做,則在您的管理器腳本完成之前不會開始執行任何操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/347454.html
下一篇:DatabaseException:無法獲取FirebaseDatabase實體:在FirebaseApp內或從您的GetInstance()呼叫中指定DatabaseURL
