unity3d 删除切割图片_unity3d sprite切割图 - CSDN
  • 假设有一张png/tga图集,导入到Unity,放置目录"Assets/Resources/UI"(UI文件夹可...为了可以使用Unity自带的精灵切割,要将纹理类型改成"Sprite","Sprite Mode"改成"Multiple","Format"改成"Truecolor",点击"Appl
    假设有一张png/tga图集,导入到Unity,放置目录"Assets/Resources/UI"(UI文件夹可替换成其他的,重要的是要在"Assets/Resources/"路径下),默认为如下设置:

    为了可以使用Unity自带的精灵切割,要将纹理类型改成"Sprite","Sprite Mode"改成"Multiple","Format"改成"Truecolor",点击"Apply"按钮进行应用。

    接着,点击"Sprite Editor"打开精灵编辑器,点击左上角的"Slice"按钮,弹出切片设置,再次点击里面的"Slice"按钮,就会自动对图片进行切割,如下图所示:

    在对切割不完整的地方进行修正后,点击右上角的"Apply"按钮,进行保存。可以看到Project视图下这个图集,已经被分割出许多小图了,如下图所示:

    接下来,因为要对图片进行读写操作,要更改图片的属性才能进行,否则会提示如下:
    • UnityException: Texture 'testUI' is not readable, the texture memory can not be accessed from scripts. You can make the texture readable in the Texture Import Settings.
    将图片纹理类型更改为"Advanced",将"Read/Write Enabled"属性进行打勾,如下图所示:

    创建一个脚本文件,代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    using UnityEngine;
    using UnityEditor;

    public class TestSaveSprite
    {
        [MenuItem("Tools/导出精灵")]
        static void SaveSprite()
        {
            string resourcesPath = "Assets/Resources/";
            foreach (Object obj in Selection.objects)
            {
                string selectionPath = AssetDatabase.GetAssetPath(obj);

                // 必须最上级是"Assets/Resources/"
                if (selectionPath.StartsWith(resourcesPath))
                {
                    string selectionExt = System.IO.Path.GetExtension(selectionPath);
                    if (selectionExt.Length == 0)
                    {
                        continue;
                    }

                    // 从路径"Assets/Resources/UI/testUI.png"得到路径"UI/testUI"
                    string loadPath = selectionPath.Remove(selectionPath.Length - selectionExt.Length);
                    loadPath = loadPath.Substring(resourcesPath.Length);

                    // 加载此文件下的所有资源
                    Sprite[] sprites = Resources.LoadAll<Sprite>(loadPath);
                    if (sprites.Length > 0)
                    {
                        // 创建导出文件夹
                        string outPath = Application.dataPath + "/outSprite/" + loadPath;
                        System.IO.Directory.CreateDirectory(outPath);

                        foreach (Sprite sprite in sprites)
                        {
                            // 创建单独的纹理
                            Texture2D tex = new Texture2D((int)sprite.rect.width, (int)sprite.rect.height, sprite.texture.format, false);
                            tex.SetPixels(sprite.texture.GetPixels((int)sprite.rect.xMin, (int)sprite.rect.yMin,
                                (int)sprite.rect.width, (int)sprite.rect.height));
                            tex.Apply();

                            // 写入成PNG文件
                            System.IO.File.WriteAllBytes(outPath + "/" + sprite.name + ".png", tex.EncodeToPNG());
                        }
                        Debug.Log("SaveSprite to " + outPath);
                    }
                }
            }
            Debug.Log("SaveSprite Finished");
        }
    }
    在Unity编辑器将会看到Tools菜单下多了"导出精灵"项,选中图集,然后点击"导出精灵"菜单项,即可导出子图成功。如下图所示:

    展开全文
  • 在我们找资源的时候,有时候会遇到那种把一堆图片放进一张png图片里面的情况,在做2D游戏的时候,我们往往需要将里面的一块块小图片切割出来使用,那么问题就来了,怎么切割呢,现在我们提供一张小图片,给大家演示...

    (转载请注明出处:http://blog.csdn.net/hongyouwei/article/details/45011315)

    在我们找资源的时候,有时候会遇到那种把一堆图片放进一张png图片里面的情况,在做2D游戏的时候,我们往往需要将里面的一块块小图片切割出来使用,那么问题就来了,怎么切割呢,现在我们提供一张小图片(注意了,一般Unity里面要求的图片宽高最好是4的整数倍比如128*128),给大家演示一下:

    那么我们现在把图片导入到Unity中,选中图片你会看到上边的Inspector界面

    然后,选择Texture Type类型为Advanced,如下图:



    将Read/Write Enabled选上,然后Sprite Mode选择Multiple,如上图。然后点击Sprite Editor,进入图形剪切界面:


    点击左上角的Slice,在上面右图中我这里Type选择Grid,你也可以选择Automatic因为我要得到三个网格,所以我这里的像素是X:150  Y:200,其它不管,直接点击Slice,进入以下界面,然后选中每一个网格,进行调整,让其刚好与其边界搭边,如下图:



    然后点击上面菜条的Apply,即可获得一个剪切过的图集。现在这个图集,已经可以直接拖出来使用了,但是如果想快速得到里面一张张的图片呢,接下来给大家介绍一个简单的编辑器扩展,这是我在不经意间,在贴吧里面看到有人使用,拿出来和大家一起分享。

    首先,在Unity的Project窗口下的Assets里面创建一个文件夹名字叫Editor,然后在里面创建一个脚本,名字随便,我这里取名为: ImageSlicer,接下来就是打开脚本进行编码了,这里我直接贴上代码,然后大家就可以在选中图片后,进入Assets目录下,选择ImageSlider/Process to Sprites,然后就能得到一个文件夹,里面放有一张张的小图片,现在贴上代码和剪切结果图片:

    using UnityEngine;
    using System.Collections;
    using UnityEditor;
    using System.IO;
    using System.Collections.Generic;
    
    public static class ImageSlicer
    {
    	[MenuItem("Assets/ImageSlicer/Process to Sprites")]
    	static void ProcessToSprite()
    	{
    		Texture2D image = Selection.activeObject as Texture2D;//获取旋转的对象
    		string rootPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(image));//获取路径名称
    		string path = rootPath + "/" + image.name + ".PNG";//图片路径名称
    		
    
    		TextureImporter texImp = AssetImporter.GetAtPath(path) as TextureImporter;//获取图片入口
    		
    		
    		AssetDatabase.CreateFolder(rootPath, image.name);//创建文件夹
    		
    		
    		foreach (SpriteMetaData metaData in texImp.spritesheet)//遍历小图集
    		{
    			Texture2D myimage = new Texture2D((int)metaData.rect.width, (int)metaData.rect.height);
    			
    			//abc_0:(x:2.00, y:400.00, width:103.00, height:112.00)
    			for (int y = (int)metaData.rect.y; y < metaData.rect.y + metaData.rect.height; y++)//Y轴像素
    			{
    				for (int x = (int)metaData.rect.x; x < metaData.rect.x + metaData.rect.width; x++)
    					myimage.SetPixel(x - (int)metaData.rect.x, y - (int)metaData.rect.y, image.GetPixel(x, y));
    			}
    			
    			
    			//转换纹理到EncodeToPNG兼容格式
    			if(myimage.format != TextureFormat.ARGB32 && myimage.format != TextureFormat.RGB24){
    				Texture2D newTexture = new Texture2D(myimage.width, myimage.height);
    				newTexture.SetPixels(myimage.GetPixels(0),0);
    				myimage = newTexture;
    			}
    			var pngData = myimage.EncodeToPNG();
    			
    			
    			//AssetDatabase.CreateAsset(myimage, rootPath + "/" + image.name + "/" + metaData.name + ".PNG");
    			File.WriteAllBytes(rootPath + "/" + image.name + "/" + metaData.name + ".PNG", pngData);
    			// 刷新资源窗口界面
    			AssetDatabase.Refresh();
    		}
    	}
    }

    展开全文
  • Unity3D分割地形Terrain

    2017-04-09 16:51:21
    在制作地形的时候通常是直接刷出整个地形,但是在实际使用中也许地形过大,我们不能直接把...首先我制作了一个完整的地形,如下:直接上分割地形的代码public class TerrainSlicing : Editor { public static string Ter

    在制作地形的时候通常是直接刷出整个地形,但是在实际使用中也许地形过大,我们不能直接把整个地形完全加载,这样对内存的消耗很高,所以有时需要一小块一小块的加载地形.这时就需要把制作好的地形分割成几块后,再来动态加载.


    首先我制作了一个完整的地形,如下图:

    这里写图片描述


    直接上分割地形的代码

    public class TerrainSlicing : Editor
    {
        public static string TerrainSavePath = "Assets/Resources/" + TerrainLoad.TERRAIN_PATH;
        //分割大小
        public static int SLICING_SIZE = 4;
    
        //开始分割地形
        [MenuItem("Terrain/Slicing")]
        private static void Slicing()
        {
            Terrain terrain = GameObject.FindObjectOfType<Terrain>();
            if (terrain == null)
            {
                Debug.LogError("找不到地形!");
                return;
            }
    
            if (Directory.Exists(TerrainSavePath)) Directory.Delete(TerrainSavePath, true);
            Directory.CreateDirectory(TerrainSavePath);
    
            TerrainData terrainData = terrain.terrainData;
    
            //这里我分割的宽和长度是一样的.这里求出循环次数,TerrainLoad.SIZE要生成的地形宽度,长度相同
            //高度地图的分辨率只能是2的N次幂加1,所以SLICING_SIZE必须为2的N次幂
            SLICING_SIZE = (int)terrainData.size.x / TerrainLoad.SIZE;
    
            Vector3 oldSize = terrainData.size;
    
            //得到新地图分辨率
            int newHeightmapResolution = (terrainData.heightmapResolution - 1) / SLICING_SIZE;
            int newAlphamapResolution = terrainData.alphamapResolution / SLICING_SIZE;
            int newbaseMapResolution = terrainData.baseMapResolution / SLICING_SIZE;
            SplatPrototype[] splatProtos = terrainData.splatPrototypes;
    
            //循环宽和长,生成小块地形
            for (int x = 0; x < SLICING_SIZE; ++x)
            {
                for (int y = 0; y < SLICING_SIZE; ++y)
                {
                    //创建资源
                    TerrainData newData = new TerrainData();
                    string terrainName = TerrainSavePath + TerrainLoad.TERRAIN_NAME + y+ "_" + x + ".asset";
                    AssetDatabase.CreateAsset(newData, TerrainSavePath + TerrainLoad.TERRAIN_NAME + y + "_" + x + ".asset");
                    EditorUtility.DisplayProgressBar("正在分割地形", terrainName, (float)(x * SLICING_SIZE + y) / (float)(SLICING_SIZE * SLICING_SIZE));
    
                    //设置分辨率参数
                    newData.heightmapResolution = (terrainData.heightmapResolution - 1) / SLICING_SIZE;
                    newData.alphamapResolution = terrainData.alphamapResolution / SLICING_SIZE;
                    newData.baseMapResolution = terrainData.baseMapResolution / SLICING_SIZE;
    
                    //设置大小
                    newData.size = new Vector3(oldSize.x / SLICING_SIZE, oldSize.y, oldSize.z / SLICING_SIZE);
    
                    //设置地形原型
                    SplatPrototype[] newSplats = new SplatPrototype[splatProtos.Length];
                    for (int i = 0; i < splatProtos.Length;  ++i)
                    {
                        newSplats[i] = new SplatPrototype();
                        newSplats[i].texture = splatProtos[i].texture;
                        newSplats[i].tileSize = splatProtos[i].tileSize;
    
                        float offsetX = (newData.size.x * x) % splatProtos[i].tileSize.x + splatProtos[i].tileOffset.x;
                        float offsetY = (newData.size.z * y) % splatProtos[i].tileSize.y + splatProtos[i].tileOffset.y;
                        newSplats[i].tileOffset = new Vector2(offsetX, offsetY);
                    }
                    newData.splatPrototypes = newSplats;
    
    
                    //设置混合贴图
                    float[,,] alphamap = new float[newAlphamapResolution, newAlphamapResolution, splatProtos.Length];
                    alphamap = terrainData.GetAlphamaps(x * newData.alphamapWidth, y * newData.alphamapHeight, newData.alphamapWidth, newData.alphamapHeight);
                    newData.SetAlphamaps(0, 0, alphamap);
    
                    //设置高度
                    int xBase = terrainData.heightmapWidth / SLICING_SIZE;
                    int yBase = terrainData.heightmapHeight / SLICING_SIZE;
                    float[,] height = terrainData.GetHeights(xBase * x, yBase * y, xBase + 1, yBase + 1);
                    newData.SetHeights(0, 0, height);
                }
            }
    
            EditorUtility.ClearProgressBar();
        }
    }

    分割地形的操作肯定是在Editor模式下,所以这里我就直接使用Unity的Editor扩展了,直接添加进MenuItem.
    然后分割后动态加载地形,这里我的整张地形宽度为1200,长度也是1200.分割出来的小块地形为300,所以我一共创建了16个小地形.现在来看看动态加载的效果
    这里写图片描述
    这里写图片描述


    非常的简单.

    展开全文
  • 本文介绍了Unity3D界面及游戏对象基本操作。

    1 界面介绍

    在Windows等图形化操作系统上,熟练地使用菜单、图标、快捷键等,将会极大提升工作效率。因此,要认识一个软件,学会熟练使用他们,就必须先认识软件的界面。

    先点击菜单栏的Window——Layouts——2by3,设置成如下的界面,方便我们了解各个窗口。


    如下图所示,我们将各个区域分割出来,成为7个模块,逐一介绍主要的功能。这七个菜单分别是导航菜单栏、工具栏、场景视图、游戏视图、层次视图、项目视图、监测视图。


    (1)导航菜单栏

    Ÿ   File——场景的创建和保存、工程的创建和保存、程序的打包发布等等。

    Ÿ   Edit——包含一些复制、粘贴、删除、查找等基本编辑操作,还包含软件偏好设置(Preferences)和工程设置(Project Settings)等等。其中最常用的应该是偏好设置了。打开Preferences——External Tools,看到下面的视图。可以设置External Script Editor为自己喜欢的编辑器(例如,我就把内置的MonoDevelop改为了VisualStudio 2013了)。如果你需要发布程序到Android手机,那么你需要安装相应的模块,可以看到图中有Android设置。由于我已经安装了JDK和Android SDK,所以只需要将路径设置好就行了。对初学者来说,这还是有些复杂的,感兴趣可以找“Unity3D发布Android教程”来看看。当然,如果我们在学习初期只用到发布PC端程序,这些设置可以不用管它,保持系统默认就行了。


    Ÿ   Assets——创建、导入、导出素材等功能,一般情况下,Unity3D的外部插件都会通过导入unitypackage的方式来完成。

    Ÿ   GameObject——创建游戏对象以及一些对象属性的设置。

    Ÿ   Component——为游戏对象添加各种组件等。组件可以理解为一个个的小功能,对于一个游戏对象,如果添加了某个组件,它就具备了某种属性或者功能。

    Ÿ   Window——顾名思义,它是对界面的一些设置。

    Ÿ   Help——可以获取一些在线的帮助。

     

    (2)工具栏

    工具栏可以对放置于场景中的对象进行操作,如旋转、平移、缩放等。工具栏中间是游戏运行、暂停、按帧运行按钮。工具栏右侧是账户、显示层设置、窗口布局等。

    (3)场景视图

    场景视图是我们所创建和操作的空间。任何游戏物体都存在于场景中。场景视图是为我们开发者提供便利所设置的,我们可以从各个角度去观看游戏对象设置是否达到预期。场景视图中有很多可以设置的选项,例如2D-3D显示切换、灯光开关等。用到的时候再讨论即可。

    (4)游戏视图

    游戏视图是我们最终程序运行时所显示的画面,也是直接为用户呈现的画面。在我们开发过程中,它显示的是位于最高层级的camera所拍摄到的场景。

    (5)层次视图

    场景中的任何对象,名称都会显示在这个区域,这里可以清楚看出各个物体之间的联系,是分立关系还是父子关系(父物体可以影响子物体的运动)。也可以方便我们索引到场景中的任何对象。

    (6)项目视图

    资源文件在这里保存。我们也可以直接拖拽一些外部的资源(如图片等)到该区域中。这些资源文件都是保存在本地磁盘上的。

    (7)监测视图

    当选中某个游戏对象时,监测视图会显示它的组件,比如Transform等。


    2 游戏对象基本操作

    创建工程并创建场景后,我们就可以开始游戏开发了。不论你是不是要做一款游戏,我们姑且都叫做游戏开发吧。本质都是一样的。

    默认情况下,场景中已经有MainCamera和Directional Light等对象。我们现在以一个Cube为例来学习旋转、平移、缩放等基本操作。点击Hierarchy——Create——3D Object——Cube,就能创建一个立方体。

    当我们在场景视图中选中立方体,按下W,场景中的立方体就会如下所示。使用鼠标拖动这些带颜色的箭头就可以控制它的位置了。


    按下E,并拖动带颜色的圆环,可以控制物体旋转。


    按下R,拖动带颜色的方块,可以控制缩放。


    当然,在Inspector视图中还可以看到该立方体的Transform组件,设置Position、Rotation、Scale等值也可以改变立方体的位置、姿态和尺度。我们还看到立方体带有BoxCollider和MeshRenderer组件,后面都会讲到的。





    展开全文
  • Unity3D支持使用大部分位图格式作为图片素材,甚至包括带图层和图层效果的.psd格式文件。 但在实际使用中,并不推荐直接使用非通用的文件格式。这是因为对于任何格式的图片素材,Unity3D在导入时都会自动执行一个...
  • unity3d2017.3 TileMap使用

    2018-05-26 10:38:01
    1.新建unity项目,2d2.导入素材到unity中3.编辑精灵信息,把选中的精灵属性中的Sprite Mode的选项改为multiple,然后点击Apply...切割精灵,按照自己想要的样式切割比如Waterfall_SpriteSheet精灵,他的像素为640*2...
  • 我们在做大型3D游戏时,资源比较大的一部分就是场景,场景包含很多模型和贴图,还有Lightmap图片和数据,为了将一个场景打包成一个assetbundle以方便动态加载,可以把整个场景打成一个assetbundle,场景中的材质和...
  • Unity3D常用知识点总结

    2020-06-18 10:29:01
    Unity3D 可以通过将游戏中的物体拖入新键文件夹来重复使用(往往包括该物体用到的模型,动画,贴图,脚本等等) 右上可以调整Debug还是Normal模式 物体 unity3d下 常用物体 cube cylinder sphere plane quad ...
  • unity3d优化总结篇

    2018-07-31 17:42:11
    对项目优化有很多,如:mesh合并 ,减少DrawCall和模型骨骼以及物理计算,合并材质球,优化代码等等, 现在继续补上,该内容为本人经验以及网上收集整理,希望大家有更好的优化方法,能够继续跟帖,一起探讨,共同...
  • Unity3D脚本--常用代码集
  • 博主本来想自己写,有大大写的异常详细...在Unity3D中使用三维模型,主要依靠Mesh Filter组件载入多边形表面物体(polygon mesh),然后依靠Mesh Renderer组件将Mesh正确渲染出来。 内置基本3D模型 Unity3D内置有...
  • 一、目录 【Unity3D从入门到进阶】文章目录及设置这个专栏的初衷
  • Unity3D 优化总篇

    2015-05-08 09:35:32
    转载【整理】unity3d优化总结篇 -- yxriyin 对项目优化有很多点,如:mesh合并 ,减少DrawCall和模型骨骼以及物理计算,合并材质球,优化代码等等, 优化:  1. 更新不透明贴图的压缩格式为ETC 4bit,...
  • 今天我们要用Unity3D做一个植物大战僵尸的仿制版本。为了保持简单,我们将忽略所有花哨的东西,如菜单,多层次或剪裁场景,并专注于在后院与僵尸作战。 以下是游戏的预览: 二、版本 Unity5.0.1f1 三、正文 1.主...
  • 让我们使用Unity3D开发一个打地鼠游戏吧。 打地鼠游戏是一个非常有趣的街机游戏,是在1976年左右发明的。 游戏的主要玩法就是打击从洞里出来的鼹鼠,玩家击中鼹鼠的速度越快,得分就越高 我们将讲解制作游戏的所需的...
  •   本文小姐姐以一个办公场地为例,和童鞋们再次讨论Unity3d室内场景的灯光布设、光影烘焙和后处理,希望对初学者有所帮助,本例的3dmax场景如下两所示,其中第二张图为从后面观察的截图。这个场景的模型面数原本...
  • Unity3D】从今天开始做UnityProgrammer!(二)简单熟悉Unity3DEditor的界面
  • 本文小姐姐以一个办公场地为例,和童鞋们再次讨论Unity3d室内场景的灯光布设、光影烘焙和后处理,希望对初学者有所帮助
  • 选择剔除(Culling),光照贴图(Lightmap)当然还有强大而又脆弱的Unity3d引擎. 所有资料都来自互联网和Unity自带的文档。 http://blog.sina.com.cn/s/blog_409cc4b00100no8y.html 动态实时灯光相比静态...
  • 请注意,单独观看本文是不太容易吸收的。...从这篇文章开始,我们从Unity性能优化的几个方面来逐步讲解unity中具体的优化方法和作用。 就当前的游戏优化而言,主要是围绕CPU、渲染、内存,三大方面来进行,...
1 2 3 4 5 ... 20
收藏数 679
精华内容 271
关键字:

unity3d 删除切割图片