老师您好,最近尝试使用TileMap制作2d游戏地图,需要继承Tile类来写一个自己的Tile类,并批量生成一些自定义的Tile。在批量生成时我遇到了一点麻烦,目前想到了两条途径,均遇到一定困难,还希望老师能给一点继续研究的方向。
第一条路是通过Selection类获取到选中的Texture2D资源,并批量生成Tile。第一次尝试我是这样做的(其中MapTile是我自己定义的类继承自Tile):
[MenuItem("Assets/Create/MapTile")]
public static void CreateMapTile()
{
//弹出对话框,获取文件asset文件存放路径
string path = EditorUtility.SaveFolderPanel(
"Select a folder to save mapTile(s)",
"assets", null).
Replace(System.IO.Directory.GetCurrentDirectory().Replace('\\', '/')+"/", "");
//对话框关闭时返回,不执行后续操作
if (path == "")
{
return;
}
for(int i = 0;i<Selection.objects.Length;i++)
{
//将选中资源尝试转为Texture2D
Texture2D currentTexture = Selection.objects[i] as Texture2D;
//当选中文件为Texture2D时,新建Tile
if (currentTexture != null)
{
MapTile mapTile = ScriptableObject.CreateInstance<MapTile>();
//根据Texture2D创建Sprite并赋值
mapTile.sprite = Sprite.Create(
currentTexture,
new Rect(0, 0, currentTexture.width, currentTexture.height),
new Vector2(0.5f, 0.8f), 128,
new uint(),
SpriteMeshType.Tight
);
//创建Tile资源文件
AssetDatabase.CreateAsset(
mapTile,
path + "/" + Selection.objects[i].name + ".asset");
}
}
但是不知道是不是因为asset文件生成前就已经赋值,最终生成好的asset文件的sprite显示“Tpye mismatch”:
于是我尝试先创建asset文件再load这个文件进行赋值:
[MenuItem("Assets/Create/MapTile2")]
public static void CreateMapTile2()
{
//弹出对话框,获取文件asset文件存放路径
string path = EditorUtility.SaveFolderPanel(
"Select a folder to save mapTile(s)",
"assets", null).
Replace(System.IO.Directory.GetCurrentDirectory().Replace('\\', '/') + "/", "");
//对话框关闭时返回,不执行后续操作
if (path == "")
{
return;
}
for (int i = 0; i < Selection.objects.Length; i++)
{
Texture2D currentTexture = Selection.objects[i] as Texture2D;
if (currentTexture != null)
{
AssetDatabase.CreateAsset(
ScriptableObject.CreateInstance<MapTile>(),
path + "/" + Selection.objects[i].name + ".asset"
);
MapTile mapTile = AssetDatabase.LoadAssetAtPath<MapTile>(
path + "/" + Selection.objects[i].name + ".asset"
);
mapTile.sprite = Sprite.Create(
currentTexture,
new Rect(0, 0, currentTexture.width, currentTexture.height),
new Vector2(0.5f, 0.8f), 128,
new uint(),
SpriteMeshType.Tight
);
}
}
}
然而从结果上讲没有什么区别。
于是我想到第二条路,通过override将Sprite拖入TilePalette的方法,实现拖动时生成我自己写的Tile。
但是我实在找不到这个方法在哪=。=也就无从下手了。
还请老师给个方向,现在真的卡住了。