首页 > 解决方案 > 使用列表在场景之间移动对象(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
}

任何帮助将不胜感激!先感谢您。

标签: c#unity3d

解决方案



推荐阅读