私はタワー防衛ゲームを作っています。最初のバージョンでは、単純なテキスト形式でレベルを使用していました。私は新しいレベルのプロパティを追加するたびに、それは非常に基本的であり、解析されたものを維持する必要がありました。私はシリアライゼーションと書き込み負荷を発見し、バイナリファイルから/に保存しました。そのために、私はこのようになります直列化可能クラスがあります。ユニティエディタスクリプト:エラー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;
宣言に私を指す)
私は、エラーを理解しません。助けてください。ありがとうございました:)
絶対に!それは、その行のすべての通常スペースの前に[U + 200B、 'ZERO WIDTH SPACE'](https://en.wikipedia.org/wiki/Zero-width_space)が1回出現したようです。私はあなたがどのようにそれを導入したのか分かりません。どのエディタや開発環境(Visual Studio?)を使用していますか?たぶんあなたが誤って使用したいくつかのあからさまなキーの組み合わせがこの文字を生成するでしょうか?あるいは、ワープロ文書やウェブページのような "リッチな"テキストファイルからいくつかのコードをコピーしたでしょうか? –
私はビジュアルスタジオ2015を使用しています。いいえ、コードスニペットを貼り付けたコピーはありませんが、Alt + 初めて、levelDataをエディタクラスのメンバ変数として設定しました。コンパイルしたときに同じエラーが出ていましたが、その行に表示されました。私は、どういうわけか、エディタスクリプトでメンバー変数としてユーザー定義のクラスを使用することを許可されていないと考えて、Alt + DownArrowで行を移動しました。新しい場所で同じエラーが表示されたので、LevelDataクラスと何か関係があると思いました。本当に私を混乱させる –