2016-08-14 6 views
0

私はタワー防衛ゲームを作っています。最初のバージョンでは、単純なテキスト形式でレベルを使用していました。私は新しいレベルのプロパティを追加するたびに、それは非常に基本的であり、解析されたものを維持する必要がありました。私はシリアライゼーションと書き込み負荷を発見し、バイナリファイルから/に保存しました。そのために、私はこのようになります直列化可能クラスがあります。ユニティエディタスクリプト:エラーCS1525:予期しないシンボル「<internal>」

[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にエディタのスクリプトを追加したいと思います。これは私のエディタのスクリプトです: 資産/タワーの防衛資産/スクリプト/ユーティリティ/ LevelManagerEditor.cs(17,5):

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); 
} 
} 

これは、コンパイラエラーですエラーCS1525:予期しない記号 `<内部>」

私はそれをダブルクリックしたときに、それはOnInspectorGUI(内部LevelData levelData;宣言に私を指す)

私は、エラーを理解しません。助けてください。ありがとうございました:)

答えて

1

私はそれを..私はその行に印刷できない文字を持っていました。私はその行を削除して書き直さなければならなかった。

+0

絶対に!それは、その行のすべての通常スペースの前に[U + 200B、 'ZERO WIDTH SPACE'](https://en.wikipedia.org/wiki/Zero-width_space)が1回出現したようです。私はあなたがどのようにそれを導入したのか分かりません。どのエディタや開発環境(Visual Studio?)を使用していますか?たぶんあなたが誤って使用したいくつかのあからさまなキーの組み合わせがこの文字を生成するでしょうか?あるいは、ワープロ文書やウェブページのような "リッチな"テキストファイルからいくつかのコードをコピーしたでしょうか? –

+0

私はビジュアルスタジオ2015を使用しています。いいえ、コードスニペットを貼り付けたコピーはありませんが、Alt + 初めて、levelDataをエディタクラスのメンバ変数として設定しました。コンパイルしたときに同じエラーが出ていましたが、その行に表示されました。私は、どういうわけか、エディタスクリプトでメンバー変数としてユーザー定義のクラスを使用することを許可されていないと考えて、Alt + DownArrowで行を移動しました。新しい場所で同じエラーが表示されたので、LevelDataクラスと何か関係があると思いました。本当に私を混乱させる –

関連する問題