C# 公共静态词典中的游戏对象<;字符串,游戏对象>;被破坏的现场变化是统一的

C# 公共静态词典中的游戏对象<;字符串,游戏对象>;被破坏的现场变化是统一的,c#,dictionary,unity3d,singleton,gameobject,C#,Dictionary,Unity3d,Singleton,Gameobject,第一次正式声明: 编程语言:C#in Unity(单行为) 我的技能水平:有点像noob(不到半年的c#经验) 我正在制作一个方块破坏者游戏(Arkanoid)并正在制作一个动作系统。游戏是一次性的,当您关闭web构建(没有缓存,没有文件保存,没有可序列化的类)时,所有内容都会被删除 Aceivement系统包含以下内容: “Aceivement”类:许多变量和一些跟踪进度的方法。它附加到同名空游戏对象的脚本。普通班 “经理”班。初始化“Acheivement”类的一组副本的类,给它们单独的值,

第一次正式声明: 编程语言:C#in Unity(单行为) 我的技能水平:有点像noob(不到半年的c#经验)

我正在制作一个方块破坏者游戏(Arkanoid)并正在制作一个动作系统。游戏是一次性的,当您关闭web构建(没有缓存,没有文件保存,没有可序列化的类)时,所有内容都会被删除

Aceivement系统包含以下内容: “Aceivement”类:许多变量和一些跟踪进度的方法。它附加到同名空游戏对象的脚本。普通班

“经理”班。初始化“Acheivement”类的一组副本的类,给它们单独的值,并将它们添加到下面提到的字典中。辛格尔顿班

“AcheivementDictionary”类:仅包含私有静态字典和访问方法。也是一个歌手班

问题是:

在第一个场景的“开始”处制作并添加这些效果。在添加它们之后,我重新检索游戏对象,测试它们的标签是否有效,一切都正常。然后,从我的“levelManager”类中,我从下一个场景调用相同的方法,并得到一条消息,游戏对象被销毁。如果我测试它们,它们也会返回null

所以。。。我真正的问题是:

如何使Aceivement游戏对象的实例化副本在Unity中的所有场景更改中保持不变

代码参考:

我不认为“acheivement”是一个有任何问题的类,如果您需要该类的代码,请大声呼叫

“经理”

公共类管理员:单行为{
public static Amanager acheivementManager=null;
公共游戏对象myAchObject;
无效唤醒(){
如果(acheivementManager!=null){
摧毁(游戏对象);
}否则{
acheivementManager=this;
GameObject.DontDestroyOnLoad(GameObject);
}
}
无效开始(){
myAchObject.AddComponent();
初始成果(“完成三级”、“三级”、“完成三级”、“三级”、“三级”、“五级”);
初始成果(“完成Televoleone”、“1级”、“完成1级”、“1级”、“5级”);
}
私有无效初始值(字符串inAch、字符串inNavn、字符串inHow、字符串inCountType、整数目标值、整数奖励){
Vector3 loc=新Vector3(0f,0f,0f);
游戏对象测试;
testAch=实例化(myAchObject,loc,Quaternion.identity)为游戏对象;
//testlifes.SetActive(true);
//testlifes.gameObject.tag=“克隆”;
testAch.GetComponent().setName(inNavn);
testAch.GetComponent().setHowToGet(inHow);
testAch.GetComponent().setCountType(inCountType);
testAch.GetComponent().setGoalVal(goalVal);
testAch.GetComponent().setReward(奖励);
testAch.tag=inCountType;
Log(“InitiAch确实运行”);
AcheivementDictionary.\u Instance.achRegAdder(inNavn,testAch);
}
AcheivementDictionary代码:

public class AcheivementDictionary : MonoBehaviour {
public static AcheivementDictionary _Instance;

    private static Dictionary<string,GameObject> AchReg = new Dictionary<string,GameObject>();

void Awake () {
        if (_Instance != null) { 
            Destroy(gameObject);
        } else {
            _Instance = this;
            GameObject.DontDestroyOnLoad(gameObject);
    }
    }

    public void achRegAdder (string inName, GameObject theAch) {
    AchReg.Add(inName,theAch);
    Debug.Log ("achRegAdded did run");
    readThisString = inName;
    tryRead = true;
    }

    private void readIt() {
    Debug.Log ("readItRan"); 
    GameObject testShit; 
    AchReg.TryGetValue("Level 1",out testShit);
    Debug.Log("if it works level should stand there ---> " + testShit.tag);
    tryRead = false;
    }

    public void achRegReader () {
        readIt ();
    }
公共类AchivementDictionary:MonoBehavior{
公共静态AcheivementDictionary_实例;
私有静态字典AchReg=新字典();
无效唤醒(){
如果(_Instance!=null){
摧毁(游戏对象);
}否则{
_实例=此;
GameObject.DontDestroyOnLoad(GameObject);
}
}
公共无效ACHRAGADDER(名称中的字符串,游戏对象名称){
AchReg.添加(inName,theAch);
Log(“achRegAdded确实运行”);
readThisString=inName;
tryRead=true;
}
私有void readIt(){
Debug.Log(“readItRan”);
游戏对象测试;
AchReg.TryGetValue(“1级”,输出测试值);
Log(“如果它工作的话,级别应该在那里-->”+testShit.tag);
tryRead=false;
}
公共再造粒机(){
readIt();
}
运行时,控制台中将显示以下消息:

initAch确实运行了

阿奇雷加德跑了

initAch确实运行了

阿奇雷加德跑了

雷迪特兰

如果它能工作,水平仪应该站在那里-->水平仪

雷迪特兰

MissingReferenceException:类型为“GameObject”的对象已销毁,但您仍在尝试访问它。您的脚本应检查它是否为null,或者不应销毁obejct

(当试图访问存储对象的标记时出现此错误,并在以下方法调用中出现:Debug.Log(“如果它工作,则级别应该在那里-->”+testShit.tag);)

这是用于在AchRegrader失败时(从另一个类)调用它的代码行: AcheivementDictionary._Instance.achRegrader()

另外:如果我计算字典中的对象数量,它会返回2。它们只是被销毁了,我真的不明白为什么。我的程序中没有任何代码可以销毁它们

我的猜测是:

关于在Singelton类中放置静态词典,有一些问题我不理解。 Acheivents的实例化副本不会在场景中持久存在,因为即使处理它们的两个类都已加载,它们也不会被dontDestroyOnLoad。
不管怎样,在过去6个小时的斗争中,我都没有成功地隔离或解决问题,请在initAcheivements函数中提供帮助!

testAch.transform.setParent(transform);

你的问题是因为遗嘱不是一个不会被毁灭的对象的孩子,或者遗嘱本身不是一个不会被毁灭的对象

作为对你评论的回应,我很快写下了这段代码,它没有给我任何问题,我是否可能遗漏了什么

Vector3 loc = new Vector3(0f, 0f, 0f);
var testAch = Instantiate(myAchObject, loc, Quaternion.identity) as GameObject;
DontDestroyOnLoad(testAch);

忘了提及:我在所有场景更改中都会调用“读取”消息。我在初始化的开始菜单中没有收到错误消息,但在之后的所有场景加载中都会收到相同的错误消息。我猜类似场景更改的东西会破坏游戏对象。请尝试ad
DontDestroyOnLoad(testAch);
Vector3 loc = new Vector3(0f, 0f, 0f);
var testAch = Instantiate(myAchObject, loc, Quaternion.identity) as GameObject;
DontDestroyOnLoad(testAch);