【发布时间】:2019-12-04 07:21:15
【问题描述】:
我对找到参考 GameObject 但场景不同并在不同场景时设置 onclick 感到困惑,所以我有 GameManager 管理所有但仅在主菜单上可用。所以我决定制作Dontdestroyonload,问题从这里开始,所以当我玩到MainGame场景时,检查员的GameManager字段会找到,但我不能拖放不同的场景,对吧?这让我很困惑。
如果 GameManager 在 MainMenu 场景中,问题是如何在 onClick 事件中拖放,比如我希望暂停按钮处于活动状态或游戏中的其他内容。
]3
我尝试使用onLloadscene(scene s, Mode mode),但没有任何反应,这里是 GameManager 的脚本。 :
public static GameManager gameManager;
[Header("Main Menu panels")]
public GameObject startPanel;
public GameObject settingPanel;
public GameObject levelPanel;
[Header("InGame Panels")]
#region Panel
public GameObject pausePanel;
public GameObject ObjectivePanel;
public GameObject shopPanel;
private int click = 0;
[Header("Int Tweaks")]
public int indexLevel;
public int onlevel;
public bool isPaused;
_levelSelect LevelSelect;
public static GameManager Instance { set; get; }
public int levelindexPlayerPrefs;
private void Awake()
{
if (gameManager != null)
{
Instance = this;
Destroy(gameObject);
}
else
{
DontDestroyOnLoad(gameObject);
}
}
void Start()
{
LevelSelect = FindObjectOfType<_levelSelect>();
OnStart();
onlevel = int.Parse(LevelSelect.levelIndex) + 1;
indexLevel = int.Parse(LevelSelect.levelIndex);
getPlayerData();
}
// Update is called once per frame
void Update()
{
ExitApp();
}
public void OnStart()
{
startPanel.SetActive(true);
settingPanel.SetActive(false);
levelPanel.SetActive(false);
}
#region Buttons
public void startbutton()
{
levelPanel.SetActive(true);
startPanel.SetActive(false);
settingPanel.SetActive(false);
}
public void backButtonMainMenu()
{
levelPanel.SetActive(false);
startPanel.SetActive(true);
settingPanel.SetActive(false);
}
public void settingbutton()
{
levelPanel.SetActive(false);
startPanel.SetActive(false);
settingPanel.SetActive(true);
}
public void PauseButton()
{
Time.timeScale = 0f;
pausePanel.SetActive(true);
ObjectivePanel.SetActive(false);
}
public void Resume()
{
Time.timeScale = 1f;
}
#endregion
public void ExitApp()
{
if (Input.GetKey(KeyCode.Escape))
{
click++;
StartCoroutine(ClickTime());
if (click>1)
{
print("Exit Game");
Application.Quit();
}
}
}
IEnumerator ClickTime()
{
yield return new WaitForSeconds(0.5f);
click = 0;
}
public void getPlayerData()
{
levelindexPlayerPrefs = PlayerPrefs.GetInt("LevelIndex", 0);
}
public void updateLevel(int Index)
{
if (levelindexPlayerPrefs < Index)
{
PlayerPrefs.SetInt("LevelIndex", Index);
levelindexPlayerPrefs = PlayerPrefs.GetInt("LevelIndex");
}
}
#region onloadedScenePickRefferences
private void OnEnable()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
private void OnDisable()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
pausePanel = GameObject.FindGameObjectWithTag("PausePanel");
ObjectivePanel = GameObject.FindGameObjectWithTag("ObjectivePanel");
}
#endregion
//public IEnumerator EndChapter()
//{
// updateLevel(indexLevel + 1);
// getPlayerData();
//}
【问题讨论】:
-
Unity 不能保证同时加载两个场景,因此不允许保存跨场景引用(即在编辑器中拖放)。您将需要在运行时管理对象发现(
FindObjectOfType等),就像在OnSceneLoaded中所做的一样。 -
@Immersive 是的,但什么也没发生,
onclickthat can't be referenced -
@Syarifabdurrahman 您可以在运行时添加回调到
onClick以及通过AddListener例如像someButton.onClick.AddListener(()=>{ DoSomething(); });(尽管它们不会出现在检查器中!)。但是,这个脚本是在主场景中还是在稍后加载的场景中?问题可能是sceneLoaded在您添加回调之前被调用 -
@derHugo 首先在主菜单中,当然,当我进入 MainGame 场景时,这个脚本也在那个场景中,这就是我使用不要破坏 onload 的原因,因为我认为如果我这样做会很好仅使用 1 个
GameManager -
其实在
Awake你为什么要Instance = this; Destroy(gameObject);??这会立即破坏您刚刚分配的引用Instance,因此它将始终为null。这也会立即导致OnDisable被调用,所以OnSceneLoaded可能根本不会执行?或者好吧...实际上gameManager从来没有在我所见的范围内设置过.. 这里肯定有问题;)你应该得到这个类的多个实例,而最新加载场景中的那个可能总是保持未初始化如前所述,因为我猜OnEnable被称为 为时已晚 尝试Awake代替