繁体   English   中英

学习Unity中的保存和加载; 由于未知原因遇到错误 CS1513

Learning about Saving and Loading in Unity; encountered error CS1513 for unknown reason

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

所以我一直在为我的 Unity 项目制作一个保存/加载脚本,它看起来像这样(请不要复制):

using UnityEngine; 
 
 using System.Text;
 using System.IO;
 using System.Runtime.Serialization.Formatters.Binary;
 
 using System;
 using System.Runtime.Serialization;
 using System.Reflection;
 // Made By Wasabi.
 
 // === This is the info container class ===
 [Serializable ()]
 public class SaveData : ISerializable {
 
   // === Values ===
   public bool foundKeyCard1 = false;
   public bool foundKeyCard2 = false;
   public bool foundKeyCard3 = false;
   public bool foundKeyCard4 = false;
   public bool foundKeyCard5 = false;
   public bool foundKeyCard6 = false;
   public bool foundKeyCard7 = false;
   public bool foundKeyCard8 = false;
   public bool foundKeyCard9 = false;
   public bool foundKeyCard10 = false;
   public bool foundCarKeys1 = false;
   public float expscore = 0;
   public int levelReached = 1;
   // === /Values ===
 
   public SaveData () {}

   public SaveData (SerializationInfo info, StreamingContext ctxt)
   {
     foundKeyCard1 = (bool)info.GetValue("foundKeyCard1", typeof(bool));
     foundKeyCard2 = (bool)info.GetValue("foundKeyCard2", typeof(bool));
     foundKeyCard3 = (bool)info.GetValue("foundKeyCard3", typeof(bool));
     foundKeyCard4 = (bool)info.GetValue("foundKeyCard4", typeof(bool));
     foundKeyCard5 = (bool)info.GetValue("foundKeyCard5", typeof(bool));
     foundKeyCard6 = (bool)info.GetValue("foundKeyCard6", typeof(bool));
     foundKeyCard7 = (bool)info.GetValue("foundKeyCard7", typeof(bool));
     foundKeyCard8 = (bool)info.GetValue("foundKeyCard8", typeof(bool));
     foundKeyCard9 = (bool)info.GetValue("foundKeyCard9", typeof(bool));
     foundKeyCard10 = (bool)info.GetValue("foundKeyCard10", typeof(bool));
     foundCarKeys1 = (bool)info.GetValue("foundCarKeys1", typeof(bool)); 
     expscore = (float)info.GetValue("expscore", typeof(float));
 
     levelReached = (int)info.GetValue("levelReached", typeof(int));
   }
 
   public void GetObjectData (SerializationInfo info, StreamingContext ctxt)
   {
     info.AddValue("foundKeyCard1", (foundKeyCard1));
     info.AddValue("foundKeyCard2", (foundKeyCard2));
     info.AddValue("foundKeyCard3", (foundKeyCard3));
     info.AddValue("foundKeyCard4", (foundKeyCard4));
     info.AddValue("foundKeyCard5", (foundKeyCard5));
     info.AddValue("foundKeyCard6", (foundKeyCard6));
     info.AddValue("foundKeyCard7", (foundKeyCard7));
     info.AddValue("foundKeyCard8", (foundKeyCard8));
     info.AddValue("foundKeyCard9", (foundKeyCard9));
     info.AddValue("foundKeyCard10", (foundKeyCard10));
     info.AddValue("foundCarKeys1", (foundCarKeys1));
     info.AddValue("expscore", expscore);
     info.AddValue("levelReached", levelReached);
   }
 }
 
 // === This is the class that will be accessed from scripts ===
 public class SaveLoad {
 
   public static string currentFilePath = "SaveData.cjc";
 
   public static void Save ()  // Overloaded
   {
     Save (currentFilePath);
   }
   public static void Save (string filePath)
   {
     SaveData data = new SaveData ();
 
     Stream stream = File.Open(filePath, FileMode.Create);
     BinaryFormatter bformatter = new BinaryFormatter();
     bformatter.Binder = new VersionDeserializationBinder(); 
     bformatter.Serialize(stream, data);
     stream.Close();
   }
 
   public static void Load ()  { Load(currentFilePath);  }   // Overloaded
   public static void Load (string filePath) 
   {
     SaveData data = new SaveData ();
     Stream stream = File.Open(filePath, FileMode.Open);
     BinaryFormatter bformatter = new BinaryFormatter();
     bformatter.Binder = new VersionDeserializationBinder(); 
     data = (SaveData)bformatter.Deserialize(stream);
     stream.Close();
 
   }
 
 }
 
 // === This is required to guarantee a fixed serialization assembly name, which Unity likes to randomize on each compile
 // Do not change this
 public sealed class VersionDeserializationBinder : SerializationBinder 
 { 
     public override Type BindToType( string assemblyName, string typeName )
     { 
         if ( !string.IsNullOrEmpty( assemblyName ) && !string.IsNullOrEmpty( typeName ) ) 
         { 
             Type typeToDeserialize = null; 
 
             assemblyName = Assembly.GetExecutingAssembly().FullName; 
 
             // The following line of code returns the type. 
             typeToDeserialize = Type.GetType( String.Format( "{0}, {1}", typeName, assemblyName ) ); 
 
             return typeToDeserialize; 
         } 
 
         return null; 
     } 
 }

我认为就是这样。 CS1513 不在那里。 如果您发现任何错误,请告诉我。 但问题出在我关闭应用程序时自动保存的另一个脚本中。 它看起来像这样(请不要复制):

using UnityEngine;    // For Debug.Log, etc.
 
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
 
using System;
using System.Runtime.Serialization;
using System.Reflection;
// Made by Wasabi.

 void OnApplicationQuit()
 {
   public class SaveLoad {
 
     public static string currentFilePath = "SaveData.cjc";    
 
     public static void Save ()  // Overloaded
     {
       Save (currentFilePath);
     }
     public static void Save (string filePath)
     {
       SaveData data = new SaveData ();
 
       Stream stream = File.Open(filePath, 
  FileMode.Create);
       BinaryFormatter bformatter = new BinaryFormatter();
       bformatter.Binder = new 
  VersionDeserializationBinder(); 
       bformatter.Serialize(stream, data);
       stream.Close();
     }
   }
 }

现在我知道void OnApplicationQuit()下的代码应该是我的保存程序。 好吧,我不确定我的保存脚本的哪一部分是我的保存程序。 所以如果你能帮我解决这个问题,请随时检查我的保存/加载脚本并告诉我我的实际保存程序是什么。 但无论如何,它一直告诉我“错误,“}”预期 (11,7) CS1513。 我检查我的脚本。 我读过另一篇文章,答案是错误意味着我忘记了在我的脚本末尾加上一个结束的“}”。 好吧,在我的情况下似乎不是这样,因为它没有丢失任何“}”。 我什至尝试在末尾添加一个额外的“}”,但它仍然说同样的话。 因此,当我在打开“{”之后直接放置另一个“}”时,它只会清除错误

void OnApplicationQuit()这没有任何意义。 但是当我这样做时,它会说另一个错误

void OnApplicationQuit() (具体来说: void OnApplicationQuit()OnApplicationQuit()void OnApplicationQuit() )并且我不能使用该命名空间的方法或函数,我不知道这意味着什么,我也不知道认为这是真的。 我相信第二个错误只是因为我不得不放置void OnApplicationQuit() {}才被触发。 这里发生了什么,我该如何解决? 另一件事:我在研究如何执行此操作后构建了我的保存/加载脚本,但是代码如何知道我何时收集钥匙卡1? 当我收集它时,我是否必须在 keycard1 中制作一个脚本来告诉保存/加载脚本? 这是否会导致我必须在保存/加载脚本中添加更多脚本来检测 keycard1 脚本,告诉保存/加载脚本我选择了它? 我对 Unity 的整个 C# 部分还是个新手,而且我完全是自学的。 你看,我才刚刚开始做我的第一个严肃的项目。 所以我需要知道我用来调用保存和加载的保存/加载脚本中的保存和加载例程到底是什么; 因为我需要制作一个带有按钮的菜单屏幕,当按下按钮时,调用保存或加载例程。 因此,当我按下“保存”或“加载”按钮时,查看我的脚本,脚本会知道我拥有 KeyCard,还是必须手动将其放入脚本中? 最后,当我获得 KeyCard2 时,如何制作一个调用保存的脚本?

真诚的,

芥末。

1 个回复

请不要复制

我向你保证,我什至不想^^


你的第二个片段应该做什么?

您有一个方法声明OnApplicationQuit()并在该方法中声明public static字段和其他方法。

-> 在 c# 中不允许这样做。

  • 你的方法OnApplicationQuit()应该在MonoBehaviour {...}
  • 然后你不能在方法中使用访问修饰符。 您宁愿简单地调用该静态方法SaveLoad.Save()

你宁愿在你的场景中有一个游戏对象,并附有一个像

public class SaveLoadBehavior : MonoBehaviour
{
     private void Awake ()
     {
         SaveLoad.Load();
     }

     void OnApplicationQuit()
     {
         SaveLoad.Save();
     }
}

请参阅OnApplicationQuit

请注意,Unity 中的每个组件都需要编写在一个单独且同名的文件中。 所以在示例中它应该在SaveLoadBehaviour.cs (其中.cs隐藏在 Unity 中)


实际上,您可能想要使用例如RuntimeInitializeOnLoadMethodApplication.quitting这样的替代方法,您根本不需要上述组件和游戏对象:

public class SaveLoad
{
    // will be automatically called on application start
    [RuntimeInitializeOnLoadMethod]
    private static void Init()
    {
        Load();
        // register a callback to the application quitting event
        Application.quitting += OnQuit;
    }

    // will be automatically called on application quit
    private static void OnQuit()
    {
        Save();
    }

    .... // Your load and save methods just the way you have them already

}
2 CS1513错误}预期的[关闭]

我在用C#编写的Visual Studio中的以下代码上不断收到CS1513错误 有人看到我的错误吗? ...

2016-10-14 11:30:06 1 1332   c#
3 “ CS1513:}预期”错误[关闭]

编译以下代码时,我不断收到“ CS1513:}预期”错误。 该错误发生在user_input方法的左括号中。 我是C#的新手,仍然在学习。 抱歉,如果我缺少明显的内容。 我已经搜索了多个论坛,但未找到解决方案。 在此先感谢您的帮助! ...

4 编译器错误消息:CS1513:} 预期

我正在将一个对象从控制器传递到视图。 该对象包含属性名称、标题和事件列表,如列表事件。 您可以参考这里 (http://www.asp.net/mvc/tutorials/mvc-music-store-part-4)。 我正在使用 ASP.NET MVC 3 / C# / 和脚本 行(@for ...

5 编译器错误消息:CS1513

编译错误 描述:编译服务此请求所需的资源时发生错误。 请查看以下特定错误详细信息并相应地修改源代码。 编译器错误消息: CS1513:}预期 来源错误: ...

2013-11-11 04:44:48 1 293   asp.net
6 使用嵌套的IF语句导致“ CS1513:}预期”错误(Webmatrix中的C#)

使用C#和Webmatrix处理我的第一个Web Pages项目。 因此事情进展顺利,但现在遇到了一个困扰我的问题。 我正在做的是在此页面上发布一个包含消息的表单,然后将消息保存到DB(稍后还将处理电子邮件部分)。 我已经在下面发布了代码,实际上比说明问题要花的时间还长,但仍然以为我会 ...

8 错误CS1513}。 编译器过分挑剔?

这是我的代码。 这只是我在文本编辑器中编辑的基本cshtml页面(不是MVC)。 Visual Studio并没有太大帮助,它似乎遇到了与编译器相同的问题。 该代码将“计划”中的步骤列表打印到从db查询中检索的表中。 可能有多个计划,每有一个新计划,我都希望在面板中显示其名称,然后在 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM