Unity - A计划(永久有效期) 扫二维码继续学习 二维码时效为半小时

(197评价)
价格: 4431.00元
关于自定义TileMap中自定义Tile子类生成asset文件时批量指定sprite的问题
小池喵发起了问答2019-04-01
3
回复
249
浏览

老师您好,最近尝试使用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。

但是我实在找不到这个方法在哪=。=也就无从下手了。

还请老师给个方向,现在真的卡住了。

所有回复
  • 老师_Trigger 2019-04-02

    同学你好,第一个方法实现思路没有问题,因为具体老师也没测试过,估计掉什么坑了,可以试试看看能不能给它一个默认值,或者滞空,可以再查阅一些关于.asset文件的资料跟用法。第二个方法因为老师没有用过这个插件,所以只能靠同学自己去找了。翻翻它官方的一些说明文档看看。

    还有-3条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!