2017-02-22 82 views
2

在我的游戏中有一个地图视图,其中包含一个50x50的网格。当你点击瓦片时,你会发送到该瓦片视图和攻击等等。就代码而言,这些“瓦片”之间的唯一区别是瓦片ID,也就是说。网格上的哪个数字。该号码将在init上传递给服务器以处理剩下的事情。加载参数变量Unity

显然,这是瓷砖的唯一区别,创建场景“1”,场景“2”...场景“2500”并调用SceneManager.LoadScene切换到特定瓷砖视图将是错误的。

我可以使用DontDestroyOnLoad();当点击图块来保存场景开关上的图块ID时,但是1)它只接受游戏对象,而不仅仅是一个int变量。2)我不需要/想要在tile视图中保存该变量。所以虽然它可以工作,似乎是矫枉过正。

是否有更好的做法,基本上只是将参数传递给场景加载?

+1

我想你可以创建一个静态类来保存这些信息,如果你不需要它来和gameobjects对话(继承monobehaviour)。 1秒,我会给你一个快速的例子。 – Maakep

回答

3

您可以创建一个静态类来为您保存信息。这个类将不会附加到任何GameObject上,并且在更改场景时不会被销毁。它是static这意味着它只能有一个;你不能StaticClassName scn = new StaticClassName()创建新的静态类。您可以直接通过StaticClassName.SomeStaticMethod()访问它们,并可从的任意位置访问。参见如何将值存储在一个变量,改变场景,然后在现场使用这个例子:

连接到游戏物体正常的团结脚本场景“测试”:

using UnityEngine; 
public class TestingScript : MonoBehaviour { 
    void Start() 
    { 
     StaticClass.CrossSceneInformation = "Hello Scene2!"; 
     SceneManager.LoadScene("Test2"); 
    } 
} 

新静态类(而不是从monobehaviour继承)保持着信息:

public static class StaticClass { 
    public static string CrossSceneInformation { get; set; } 
} 

连接到一个游戏对象的脚本在现场 “的Test2”:

using UnityEngine; 
public class TestingScript2: MonoBehaviour { 

    void Start() { 
     Debug.Log(StaticClass.CrossSceneInformation); 
    } 
} 

你不需要让整个类都是静态的(如果你出于某种原因需要创建更多的实例)。如果您要从类中删除static(不是变量),则仍然可以通过StaticClass.CrossSceneInformation访问静态变量,但您也可以执行StaticClass sc = new StaticClass();。有了这个sc,您可以使用该类的非静态成员,但不能使用static CrossSceneInformation,因为只能有一个(因为它是静态的)。

+1

我通常只为每个场景制作一个这样的类,需要一些上下文信息 – Dunno

+1

我非常喜欢这个!正是我需要的。而且你提醒我什么是静态的,我一直在使用它们。 – DasBeasto

+0

太棒了!乐意效劳! – Maakep