c# - 使用列表在场景之间移动对象(MoveGameObjectToScene) - 初学者问题
问题描述
我是 Unity 和 C# 的新手,所以这是一个相当初级的问题。我从 YouTube 视频创建了一个项目,以使用 Mapbox 创建一个基本游戏。完成基础项目后,我现在想从最后完成一些“挑战”以继续我的学习。
我希望能够将对象从一个 Unity 场景传递到另一个场景。在这种情况下,对象是一个“机器人”,当点击它时,会加载一个可以捕获机器人的新场景。捕获机器人的场景当前使用预先放置的机器人预制件作为占位符。我想要发生的是,在“世界”场景中点击的任何机器人都被实际传递到新场景中(这意味着使用不同预制件的机器人可以加载到新场景中,而不仅仅是预先放置的机器人当前存在的预制件)。
我列出了来自不同脚本的代码片段,这些脚本形成了点击机器人 (Droid.cs) 的过程,将点击的对象添加到列表并将其移动到所选场景 (SceneTransitionManager.cs)。
SceneTransitionManager.cs 脚本附加到机器人存在并被单击的“世界”场景中的对象,以及我希望将机器人对象传递到的“捕获”场景中的对象。
我正在努力寻找正确的语法来从列表中检索 droid 对象(可能是因为我还是个初学者!),我认为使用来自不同脚本的列表可能会让我的头脑比实际情况更难。
我相信此代码属于 CaptureScene.cs 脚本,因为这是我希望将移动场景的对象移动到的场景(此脚本与 SceneTransitionManager.cs 脚本附加相同的对象)。一旦我可以从列表中检索此对象,我假设下一步是将其分配给附加到空游戏对象的 SerializedField。
以下是脚本中与在场景之间移动对象相关的部分(还有 GameManager 和 Singleton 脚本,但我没有包括它们,因为我认为它们与此查询无关):
机器人.cs
public class Droid : MonoBehaviour
{
private void OnMouseDown()
{
PocketDroidsSceneManager[] managers = FindObjectsOfType<PocketDroidsSceneManager>();
foreach (PocketDroidsSceneManager pocketDroidsSceneManager in managers)
{
if (pocketDroidsSceneManager.gameObject.activeSelf)
{
pocketDroidsSceneManager.droidTapped(this.gameObject);
}
}
}
}
PocketDroidsSceneManager.cs
public abstract class PocketDroidsSceneManager : MonoBehaviour
{
public abstract void playerTapped(GameObject player);
public abstract void droidTapped(GameObject droid);
public virtual void droidCollision(GameObject droid, Collision other)
{
}
}
世界场景管理器.cs
public class WorldSceneManager : PocketDroidsSceneManager
{
public override void droidTapped(GameObject droid)
{
List<GameObject> list = new List<GameObject>();
list.Add(droid);
SceneTransitionManager.Instance.GoToScene(PocketDroidsConstants.SCENE_CAPTURE, list);
}
}
PocketDroidsConstants.cs
public class PocketDroidsConstants
{
public static string SCENE_WORLD = "World";
public static string SCENE_CAPTURE = "Capture";
public static string TAG_DROID = "Droid";
}
SceneTransitionManager.cs
public class SceneTransitionManager : Singleton<SceneTransitionManager>
{
private AsyncOperation sceneAsync;
public void GoToScene(string sceneName, List<GameObject> objectsToMove)
{
StartCoroutine(LoadScene(sceneName, objectsToMove));
}
private IEnumerator LoadScene(string sceneName, List<GameObject> objectsToMove)
{
SceneManager.LoadSceneAsync(sceneName);
SceneManager.sceneLoaded += (newScene, mode) =>
{
SceneManager.SetActiveScene(newScene);
};
Scene sceneToLoad = SceneManager.GetSceneByName(sceneName);
foreach (GameObject obj in objectsToMove)
{
SceneManager.MoveGameObjectToScene(obj, sceneToLoad);
}
yield return null;
}
}
CaptureScene.cs
public class CaptureSceneManager : PocketDroidsSceneManager
{
//what code goes here to retrieve the droid from the list
}
任何帮助将不胜感激!先感谢您。
解决方案
推荐阅读
- laravel - Laravel 查询“仅当”条件
- c++ - 当注入程序的内存空间时,如何读取从 0 到 0xFFFFFFFFF 的每个字节?我正在创建模式扫描仪
- python-3.x - 如何从字典中过滤一个值,这个字典在python中包含多个值?
- php - 如何在不重新定义变量的情况下将字符串影响到变量
- python - 使用组合两个连续的行
- javascript - SASS mixin 将十六进制转换为 CSS 过滤器
- javascript - 如何动态获取自定义元素并使用它
- javascript - 如何使用 JavaScript 用鼠标左键实现矩形拖选脚本(类似于在 Windows GUI 中选择多个文件)?
- java - 使用 Scanner 类正确放置 myScanner.next() 方法
- ruby - Sinatra 无法从帮助文件中设置 cookie