【问题标题】:Unity Editor Script: error CS1525: Unexpected symbol `<internal>'Unity 编辑器脚本:错误 CS1525:意外符号 `<internal>'
【发布时间】:2016-08-14 12:05:49
【问题描述】:

我正在制作一款塔防游戏。在第一个版本中,我使用简单的文本格式来表示关卡。这是非常基本的,每次我添加新的级别属性时都必须维护解析过的内容。我发现了序列化和写入二进制文件的加载和保存。为此,我有一个可序列化的类,如下所示:

[Serializable]
public class LevelData {
public string filename;
public List<List<Tile>> grid;
public List<Vector2> waypoints;
public int width;
public int length;

public Vector2 startPos;
public Vector2 finishPos;

public List<TowerInfo> towers;
public List<WaveData> waveChain;
}

现在我想在我的 LevelManager 中添加一个编辑器脚本,它解析旧的文本文件格式并将它们转换为二进制格式。这是我的编辑器脚本:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(LevelManager))]
[CanEditMultipleObjects]
public class LevelManagerEditor : Editor {
public string levelFilename;

public override void OnInspectorGUI() {
    DrawDefaultInspector();
    if(GUILayout.Button("Load level " + levelFilename + " and serialize")) {
​        LevelData levelData;
        ParseFromFile(out levelData);
        Debug.Log("Parsing " + levelFilename + " successful!");
        SaveLevel(levelData);
        Debug.Log("Saved serialized level");
    }
}
private void ParseFromFile(out LevelData levelData) {
    levelData = new LevelData();
    levelData.filename = levelFilename;
    System.IO.StreamReader file = new System.IO.StreamReader(levelFilename + ".txt");

    string line;
    int y = 0;
    while ((line = file.ReadLine()) != null) {
        if (line[0] == '#') break;
        List<Tile> row = new List<Tile>();
        for (int x = 0; x < line.Length; x++) {
            switch(line[x]) {
                case '.':
                    row.Add(Tile.NORMAL_BRICK);
                    break;
                case 'P':
                    row.Add(Tile.PATH_BRICK);
                    break;
                case 'S':
                    row.Add(Tile.START_BLOCK);
                    levelData.startPos = new Vector2(x, y);
                    break;
                case 'F':
                    row.Add(Tile.FINISH_BLOCK);
                    levelData.finishPos = new Vector2(x, y);
                    break;
                default:break;
            }
        }
        levelData.grid.Add(row);
        levelData.width = row.Count;
        y++;
    }
    levelData.length = y;
    while((line = file.ReadLine()) != null) {
        levelData.waypoints.Add(ParseWaypoints(line));
    }
    file.Close();
}
private Vector2 ParseWaypoints(string line) {
    string[] tokens = line.Split(' ');
    return new Vector2(int.Parse(tokens[0]), int.Parse(tokens[1]));
}
private void SaveLevel(LevelData levelData) {
    string pathToLevel = Application.persistentDataPath + "/" + levelData.filename + ".dat";
    FileStream file = File.Create(pathToLevel);
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(file, levelData);
}
}

这是编译器错误: Assets/Tower Defense Assets/Scripts/Utilities/LevelManagerEditor.cs(17,5): 错误 CS1525: Unexpected symbol `'

当我双击它时,它会将我指向 OnInspectorGUI() 中的 LevelData levelData; 声明

我不明白这个错误。请帮忙。谢谢:)

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我想通了。我在那条线上有一个无法打印的字符。我不得不删除那行并重写它。

    【讨论】:

    • 绝对!它似乎是U+200B, 'ZERO WIDTH SPACE' 的一次出现,在该行的所有常用空格之前。不知道你是怎么介绍的。您使用的是什么编辑器或开发环境(Visual Studio?)。也许一些不起眼的组合键(你不小心使用)会产生这个字符?或者,您可能从“富”文本文件(如文字处理文档或网页)中复制了一些代码?
    • 我正在使用 Visual Studio 2015。不,我没有复制粘贴代码 sn-p,尽管我可能有 Alt+numpad 的东西而没有注意到,奇怪的大声笑!第一次,我将 levelData 设置为我的编辑器类的成员变量。当我编译它时,它给了我同样的错误,但在那一行。然后我想也许不知何故我不允许在编辑器脚本上使用用户定义的类作为成员变量,所以我通过 Alt+DownArrow 移动了该行。它在新位置告诉我同样的错误,所以我认为它与我的 LevelData 类有关。真的让我很困惑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多