为了账号安全,请及时绑定邮箱和手机立即绑定

场景变化时如何运行一些代码?

场景变化时如何运行一些代码?

C#
青春有我 2022-07-10 10:43:00
不知道我能解释多少。我有一个不破坏加载脚本,所以它可以在两个场景之间移动。然而,在一个场景(它最初创建的那个)中,我需要它在每次重新进入这个场景时运行 start 函数,因为它会绘制出我的一些 UI。这是供参考的代码:我可以尝试将它放入一个新脚本中,但我担心由于我每周只在这个项目上工作几个小时,所以会有一些我忘记适应这种变化的代码,它将不再工作。我怎样才能重新调用 start 函数,或者做类似的事情?int spriteIndex = 0;    foreach (Sprite texture in spriteImages) {        GameObject button = Instantiate (shopButtonPrefab) as GameObject;        Image buttonImage = button.GetComponent<Image> ();        Image[] images = button.GetComponentsInChildren<Image>();        int newIndex = spriteIndex;        button.GetComponent<Button> ().onClick.AddListener (() => ChangePlayerSkin (newIndex));        spriteIndex++;        foreach (Image image in images) {            if (image != buttonImage) {                //button.GetComponentInChildren<Image>().sprite = texture;                //button.transform.SetParent (shopButtonContrainer.transform, false);                image.sprite = texture;                break;            }            button.transform.SetParent (shopButtonContrainer.transform, false);        }    }
查看完整描述

1 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

Start您可以为SceneManager.sceneLoaded添加一个侦听器,而不是在其中执行此操作


仅在加载初始场景时才执行这些操作,您可以使用它SceneManager.GetActiveScene()来存储并稍后将初始场景与加载的场景进行比较。


// Store the scene that should trigger start

private Scene scene;


private void Awake()

{

    // It is save to remove listeners even if they

    // didn't exist so far.

    // This makes sure it is added only once

    SceneManager.sceneLoaded -= OnsceneLoaded;


    // Add the listener to be called when a scene is loaded

    SceneManager.sceneLoaded += OnSceneLoaded;


    DontDestroyOnLoad(gameObject);


    // Store the creating scene as the scene to trigger start

    scene = SceneManager.GetActiveScene();

}


private void OnDestroy()

{

    // Always clean up your listeners when not needed anymore

    SceneManager.sceneLoaded -= OnSceneLoaded;

}


// Listener for sceneLoaded

private void OnSceneLoaded(Scene scene, LoadSceneMode mode)

{

    // return if not the start calling scene

    if(!string.Equals(scene.path, this.scene.path) return;


    Debug.Log("Re-Initializing", this);

    // do your "Start" stuff here

}

Afaik /我如何理解链接中的示例OnSceneLoaded也将在第一个场景中调用,只要您在之前添加回调Start(所以在Awakeor中OnEnable)。


注意我使用Scene.path s 而不是scene.name因为path它总是唯一的(由于操作系统文件系统),而name可能不是。


查看完整回答
反对 回复 2022-07-10
  • 1 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号