c# - 调用其他场景上的对象 C#

标签 c# unity-game-engine game-development

我有一个问题,我想从第一个场景调用一个对象,然后在第二个场景中调用该对象。我尝试这样做

if (instance == null)
    instance = this;
else if (instance != this)
     Destroy(gameObject);

     DontDestroyOnLoad(gameObject);

并将其放在我不想破坏的对象上,然后更改了我的场景

void Start(){
   SceneManagement.LoadScene("Menu",LoadSceneMode.Single);
}

但它不在继承体系中

有人可以帮我吗

编辑:

enter image description here

现在加载下一个场景时

enter image description here

我想要的东西已经不存在了。正在被摧毁

最佳答案

创建持久对象

在此处创建一个预加载场景,您可以放置​​启动屏幕或任何您喜欢的内容,但重要的是加载应该持久的东西(可能例如网络或游戏管理器)

创建脚本PersistentObject.cs并将以下代码放入其中

private void Awake(){
  DontDestroyOnLoad(this.gameObject);
}

将此脚本放在您在预加载器中初始化的任何对象上

从任何地方访问对象

如果您想访问另一个场景中的对象,有多种方法,但我假设您没有对该对象的任何特定引用

因此,如果我们有一个 GameManager.cs 并且我们在预加载器中创建了一个名为 Cube 的持久立方体,我们可以通过说 GameObject 来获取对游戏对象的引用立方体 = GameObject.FindGameobjectWithName("Cube");

现在您可以使用cube做任何您想做的事情

少写,多用单例

创建单例也非常有用

public static class Singleton<T>: MonoBehavior where T: MonoBehavior{
  private static T instance;

  //Notice the lower and upper case difference here
  public static T Instance{
    get{
      if(instance == null){
        instance = GameObject.FindGameObjectOfType<T>();
      }
      return instance;
    }
  }
}

然后您可以将其添加到脚本中,从而更轻松地访问属性并减少必须编写的代码量

public class Cube: Singleton<Cube>{
  private string cubeName = "Jeff";

  public void ChangeCubeName(string newName){
    cubeName = newName;
  }
}

要访问此类的方法,您现在可以从代码中的任何位置调用单例

示例

public class GameManager: MonoBehavior{
  private void Start(){
    cube.Instance.ChangeCubeName("Joe");
  }
}

关于c# - 调用其他场景上的对象 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55691977/

相关文章:

C# 在 SQLite 和 SQL Server 之间同步数据

unity-game-engine - 检测透明度的网格碰撞器

javascript - 粒子生成速度太快 - Phaser 3

c# - 尝试获取加密字符串的长度

c# - 无法隐式转换类型 'List<System.Web.Mvc.SelectListItem> to ' IEnumerable<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>'

c# - 如何延迟 Unity 中切换场景的脚本?

android - 如何在 android 中为纸板渲染 3d 视频?

java - java中的投篮预测算法

c# - 什么是最有效的方法 - 检查标签或 GetComponent

由 c# silverlight wcf mysql