2014-09-28 15:21:56 u013425527 阅读数 1872
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4646 人正在学习 去看看 张刚
using UnityEngine;
using System.Collections;
using UnityEditor;
public class Script1_1 : MonoBehaviour {
//贴图
Texture2D texture;
// Use this for initialization
void Start () {
//从project视图中记载资源
texture = (Texture2D)AssetDatabase.LoadAssetAtPath ("Assets/0.jpg",typeof(Texture2D));



}
void OnGUI(){
//渲染资源
GUI.DrawTexture (new Rect(0,0,texture.width,texture.height),texture);


}

// Update is called once per frame
void Update () {

}

}


注意using命名空间,,图片路径

2012-12-25 15:01:43 asd237241291 阅读数 4779
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4646 人正在学习 去看看 张刚

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅  QQ群:【119706192】 本文链接地址: Unity3D 批量图片资源导入设置

复制代码
using UnityEngine;
using System.Collections;
using UnityEditor;
/// <summary>
/// 批量图片资源导入设置
/// 使用说明: 选择需要批量设置的贴图,
/// 单击DuanMenu/Texture Import Settings,
/// 打开窗口后选择对应参数,
/// 点击Set Texture ImportSettings,
/// 稍等片刻,--批量设置成功。
/// </summary>


public class TextureImportSetting : EditorWindow {
    
    /// <summary>
    /// 临时存储int[]
    /// </summary>
    private int[] IntArray = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
    //AnisoLevel
    private int AnisoLevel = 1;
    //Filter Mode
    private int FilterModeInt = 0;
    private string[] FilterModeString = new string[] { "Point", "Bilinear", "Trilinear" };
    //Wrap Mode
    private int WrapModeInt = 0;
    private string[] WrapModeString = new string[] { "Repeat", "Clamp" };
    //Texture Type
    private int TextureTypeInt = 0;
    private string[] TextureTypeString = new string[] { "Texture", "Normal Map", "GUI", "Refelection", "Cookie", "Lightmap", "Advanced" };
    //Max Size
    private int MaxSizeInt = 5;
    private string[] MaxSizeString = new string[] { "32", "64", "128", "256", "512", "1024", "2048", "4096" };
    //Format
    private int FormatInt = 0;
    private string[] FormatString = new string[] { "Compressed", "16 bits", "true color" };
    
    /// <summary>
    /// 创建、显示窗体
    /// </summary>
    [@MenuItem("DuanMenu/Texture Import Settings")]
    private static void Init()
    {    
        TextureImportSetting window = (TextureImportSetting)EditorWindow.GetWindow(typeof(TextureImportSetting), true, "TextureImportSetting");
        window.Show();
    }
    
    /// <summary>
    /// 显示窗体里面的内容
    /// </summary>
    private void OnGUI()
    {
        //AnisoLevel
        GUILayout.BeginHorizontal();
        GUILayout.Label("Aniso Level  ");
        AnisoLevel = EditorGUILayout.IntSlider(AnisoLevel, 0, 9);
        GUILayout.EndHorizontal();
        //Filter Mode
        FilterModeInt = EditorGUILayout.IntPopup("Filter Mode", FilterModeInt, FilterModeString, IntArray);
        //Wrap Mode
        WrapModeInt = EditorGUILayout.IntPopup("Wrap Mode", WrapModeInt, WrapModeString, IntArray);
        //Texture Type
        TextureTypeInt = EditorGUILayout.IntPopup("Texture Type", TextureTypeInt, TextureTypeString, IntArray);
        //Max Size
        MaxSizeInt = EditorGUILayout.IntPopup("Max Size", MaxSizeInt, MaxSizeString, IntArray);
        //Format
        FormatInt = EditorGUILayout.IntPopup("Format", FormatInt, FormatString, IntArray);
        if (GUILayout.Button("Set Texture ImportSettings"))
            LoopSetTexture();
    }
    
    /// <summary>
    /// 获取贴图设置
    /// </summary>
    public TextureImporter GetTextureSettings(string path)
    {
        TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
        //AnisoLevel
        textureImporter.anisoLevel = AnisoLevel;
        //Filter Mode
        switch (FilterModeInt)
        {
            case 0:
                textureImporter.filterMode = FilterMode.Point;
                break;
            case 1:
                textureImporter.filterMode = FilterMode.Bilinear;
                break;
            case 2:
                textureImporter.filterMode = FilterMode.Trilinear;
                break;
        }
        //Wrap Mode
        switch (WrapModeInt)
        {
            case 0:
                textureImporter.wrapMode = TextureWrapMode.Repeat;
                break;
            case 1:
                textureImporter.wrapMode = TextureWrapMode.Clamp;
                break;
        }
        //Texture Type
        switch (TextureTypeInt)
        {
            case 0:
                textureImporter.textureType = TextureImporterType.Image;
                break;
            case 1:
                textureImporter.textureType = TextureImporterType.Bump;
                break;
            case 2:
                textureImporter.textureType = TextureImporterType.GUI;
                break;
            case 3:
                textureImporter.textureType = TextureImporterType.Reflection;
                break;
            case 4:
                textureImporter.textureType = TextureImporterType.Cookie;
                break;
            case 5:
                textureImporter.textureType = TextureImporterType.Lightmap;
                break;
            case 6:
                textureImporter.textureType = TextureImporterType.Advanced;
                break;
        }
        //Max Size 
        switch (MaxSizeInt)
        {
            case 0:
                textureImporter.maxTextureSize = 32;
                break;
            case 1:
                textureImporter.maxTextureSize = 64;
                break;
            case 2:
                textureImporter.maxTextureSize = 128;
                break;
            case 3:
                textureImporter.maxTextureSize = 256;
                break;
            case 4:
                textureImporter.maxTextureSize = 512;
                break;
            case 5:
                textureImporter.maxTextureSize = 1024;
                break;
            case 6:
                textureImporter.maxTextureSize = 2048;
                break;
            case 7:
                textureImporter.maxTextureSize = 4096;
                break;
        }
        //Format
        switch (FormatInt)
        {
            case 0:
                textureImporter.textureFormat = TextureImporterFormat.AutomaticCompressed;
                break;
            case 1:
                textureImporter.textureFormat = TextureImporterFormat.Automatic16bit;
                break;
            case 2:
                textureImporter.textureFormat = TextureImporterFormat.AutomaticTruecolor;
                break;
        }
        return textureImporter;
    }
    
    /// <summary>
    /// 循环设置选择的贴图
    /// </summary>
    private void LoopSetTexture()
    {
        Object[] textures = GetSelectedTextures();
        Selection.objects = new Object[0];
        foreach (Texture2D texture in textures)
        {
            string path = AssetDatabase.GetAssetPath(texture);
            TextureImporter texImporter = GetTextureSettings(path);
            TextureImporterSettings tis = new TextureImporterSettings();
            texImporter.ReadTextureSettings(tis);
            texImporter.SetTextureSettings(tis);
            AssetDatabase.ImportAsset(path);
        }
    }
    
    /// <summary>
    /// 获取选择的贴图
    /// </summary>
    /// <returns></returns>
    private Object[] GetSelectedTextures()
    {
        return Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);
    }
}
复制代码

2016-12-27 12:48:32 xmousez 阅读数 17534
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4646 人正在学习 去看看 张刚

在上一篇文章里 Unity3D - 你导入的资源,并不是Unity使用的资源 介绍过,Unity使用的资源是你无法直接操作的,那么对于图片资源,我们应该如何去处理和优化工作流程呢?

图片资源的分类

在Unity中,图片一般可以分为两种:贴图(Texture)和精灵(Sprite)。我们可以简单的理解为3D(模型使用的)图片和2D(UI使用的)图片。在可以直接选择Texture Type去更改你的导入方式。

  • Texture
    • Texture一般作为3D模型上的贴图,需要有对应的材质球并关联到相应3D网格模型去使用。一般来说Texture会是一个长宽像素都是2的n次方的正方形,这也是大部分建模软件(如maya)规定的POT(Power Of Tow)。
    • 不过并不是说非POT图片就不能使用,只是在Unity的压缩上会很吃亏,而且你导入后Unity仍然会以POT方式去生成对应的图片。
    • POT实际上可以是长方形,只要长宽都是POT就可以,但是大部分建模软件上都会使用正方形。
  • Sprite
    • Sprite一般作为UI上的图片,一般不会去制作对应的材质球。在UGUI上一般是拖动到相应的控件上就可以了。
    • Sprite是一个资源导入的方式,一个资源导入后并非只能是单个Sprite,在Sprite Mode选项上可以选择Multiple去生成多个Sprite,不过需要在Sprite Editor选项上对图片进行切割,通常需要美术参与。
    • Sprite一般对大小不会做限制,UI需要多大就用多大,但是Unity在压缩上,对4的倍数分辨率的图片支持上会更好一点(应该是方便图片在POT下的位置计算),所以在制作时可以对PS的画布大小进行适当调整。
    • Sprite在导入设置完成后建议使用 Sprite Packer 进行打包,如果你确定不打包。。。那么建议你做成POT。。。
    • 在使用 Sprite Packer 打包图集后你会发现,Unity生成的图片都是POT的。

MiniMap

图片资源在导入为Sprite后,我们可以看到一个MiniMap选项,该选项是生成该图片的低分辨图片(1/2,1/4,1/8。。。),这些小图会使生成的资源文件变大1/3,但是在3D渲染时Unity会根据物体显示的大小(或者距离?)自动选择不同的分辨率以提高渲染效率。
一般来说,Sprite不会有这种需求,所以关闭这个选项可以减少包体的大小。

而对于Texture,同样可以取消。Texture和Sprite实际上只是Unity的两种预设,当你在Texture Mode上选择Advance时,你会有很完全的导入选项。如果你确定你的3D物体不会有很多的远近变化时,选择Advance,取消MiniMap会是一个很正确的选择。而对于一般的3D物体,MiniMap带来的效率提高是值得你和用户去花费这点储存空间的。

资源的源文件格式

既然Unity可以使用PSD,那么你何必让美术去导出png呢?
PSD在导入速度上不比png和jpg慢(理论上应该会快,没测试),不过文件大小确实会变大。但是如果直接使用PSD,并要求美术直接在项目目录里进行资源管理和维护,实际上是在团队流程中省出了所有不必要的压缩格式文件(再次强调,导入资源使用的文件大小并不会影响最终的包体大小 )。
当然如果经常出现美术破坏项目目录结构的情况(上传非必要文件,命名不规范等),还是把文件发给程序比较好,而这种情况使用psd还是png那就见仁见智了,psd没有预览还是很难受的。(一般程序猿学PSD的基本操作比美术学SVN或者Unity都要快的多)

Sprite Packer + AssetBundle的注意事项

当你在使用AssetBundle时,你的Sprite引用实际上是Sprite Packer生成的图集的引用。所以在AssetBundle上,即便你只使用到一个图集中的一个小像素,Unity也会将该图集完整地打入AssetBundle中。所以Sprite尽量在Bundle的分包基础上去分图集。

2019-06-09 21:15:36 Mr_Sun88 阅读数 214
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4646 人正在学习 去看看 张刚

本篇博文转载自:https://www.jianshu.com/p/e2aa4d898fb7

作者:shimmery


图片

Unity3D支持使用大部分位图格式作为图片素材,甚至包括带图层和图层效果的.psd格式文件。

但在实际使用中,并不推荐直接使用非通用的文件格式。这是因为对于任何格式的图片素材,Unity3D在导入时都会自动执行一个转换过程,如果面对的是非通用格式,则会调用相应的第三方软件功能来执行转换,所以实际转换过程会比较慢,而且有些特殊文件格式,如果没有安装对应的软件,甚至根本不能识别。

因此,推荐先使用PS将图片素材另存为.png格式(无损且较小),然后使用.png格式的文件作为图片素材来使用。

在Project面板中选择图片,Inspector中对应出现图片转换的参数选项(要注意的是,选择不同Texture Type,其他的选项会略有不同)。

unity_image_01.png

 

unity_image_02.png

  • Texture Type:选择贴图类型
  • Texture Shape:选择贴图形状,这里是设置在预览区的显示方式,有2DCube两种,这个图例中选择2D是因为这是2D游戏素材
  • Advanced:高级选项(略)
  • Alpha Source:选择透明通道来源
  • Wrap Mode:修改贴图重复包裹方式,Repeat代表会不断重复,Clamp代表如果模型UV不在(0,1)象限的话就不会被附上贴图,只会显示材质的默认颜色
  • Filter Mode:对通道数据的过滤方式,通常选择Bilinear,但如果是高动态色彩贴图(hdr),就要选择Point (no filter)

各种不同的贴图类型:

unity_image_03.png

  • Default是作为普通类型,也就是颜色贴图
  • Normal map是作为法线贴图,法线贴图必须指定成这个type,否则渲染不正确
  • Editor GUI and Legacy GUI
  • Sprite是作为“精灵”来使用,2D精灵是一种特殊的图片显示方法,图片不失真,不受光照,同时还具备可切割的属性,通常用作UI元素或者2D游戏的素材
  • Cursor是拿来替换游戏中鼠标形状的
  • Cookie
  • Lightmap是作为光照烘焙贴图使用,有的时候我们想把以前烘焙好的贴图直接导入使用,就要选择这个类型
  • Single Channel是单通道图片,这种类型的贴图转换后只会保留alpha通道的信息

最下面一栏是关于贴图尺寸和贴图压缩的选项:

unity_image_04.png

  • Max Size代表转换后该贴图的最大可能尺寸,如果本身贴图尺寸就小于这个尺寸的话,贴图不会被放大,但如果本身贴图尺寸大于这个尺寸,就会被缩小成这个尺寸;
  • Compression选择压缩质量,有高中低三档;
  • Format(略)

最关键的是,做完所有设置工作以后一定要点击Apply按钮应用设置,否则就白做了。旁边的Revert按钮可以将设置参数恢复到修改前的状态。

普通图片素材

普通图片素材选择Default类型即可。需要注意的是,对于一些很小的贴图,最好设置一下Max Size属性,这样比较节约系统资源。

Sprite类型素材

Sprite类型又叫精灵类型,主要用于UI、粒子、2D游戏等等。

将图片设置成sprite类型之后会得到以下特性,首先,图片不会被压缩,所以不会有JPEG图片颜色失真等现象;其次,图片可以被再次分割成为多个Sprite。

Unity3D 2017中新增了对Sprite的九宫格切分功能支持。所谓九宫格切分是指将图片按3*3的方式分成9个部分,当该图片被缩放是,不同部分会进行不同的变化,四个角落的4部分会保持不变,上中和下中的两部分会横向重复(tile),左中和右中的两部分会纵向重复(tile),而正中间一部分会横向纵向一起重复(tile)。这种方式很适合用在2D游戏的地面、墙面、门窗等物体上。

对法线贴图的处理

法线贴图必须设置成Normal map类型,否则不会被正确识别。

对HDR素材的处理

HDR素材要单独设置。通常被运用在天空球的贴图上。
HDR素材最关键的是要设置其为16bit色深或者32bit色深,否则引擎会自动将其处理成8bit色深的普通贴图,这样就丢失了高动态颜色信息了。


着色器(shader)

着色器(Shader)和材质球(Material)的区别

使用过三维软件的同学对材质的概念都很熟悉,在Maya中我们称之为“材质球”,其英文名称是Material。但在Unity3D(以及其他的很多游戏引擎)中,“材质”通常被用来指Shader,而非Material,所以这里我给shader起了个专门的中文名字叫“着色器”,以示区别。

Shader是编写的材质脚本,而shader编译出来的结果显示为各种不同的material。很多游戏都自己写shader,这样更自由也更优化,但我们不具备这个能力,只能使用系统给出的默认shader或者下载其他人写好的shader来使用。

自己写的shader需要放在Assets文件夹下才会起作用。可以在Project面板中点击Create或者直接右键单击选择创建不同类型的shader资源。

unity_shader_01.png

根据shader中编写的设置,shader会出现在material设置选项的Shader下拉框中,比如上面图例中的NewSurfaceShader就显示在Custom一栏之中。

内置常用Shader的使用

因为内置shader太多了,而且并不是所有的都常常会被用到,所以这里我先不细讲每一种shader可以做什么,只介绍最常用的基本类别。

  • Standard类型的shader和我们在Maya中使用的材质球最接近,初学者为了方便可以完全用这一个shader来制作所有材质。
  • Mobile类别下面的shader顾名思义是给移动平台做游戏时使用的shader,下属的shader基本上也能涵盖各种用途了。
  • Nature类别下的shader主要是给Unity3D自己的Tree类型物体准备的,有些特殊属性专门针对Tree物体的显示。通常创建Tree的时候会自动赋上对应的material,初学者不要胡乱改shader类型和参数。
    同理,Particles类别下的shader专为Unity3D的自带粒子系统准备,Skybox类别下的shader专为Unity3D的自动天空盒功能准备,Sprites是给精灵面片用的,UI是给UI物体贴图用的,VR是给VR用的(我也不清楚怎么用)。
  • Unlit类别下的shader都是所谓“无光照“shader,也就是说光照对这类材质无影响。

分成这么多类别,主要还是出于性能优化的考虑。比如Standard shader当然可以用来模拟unlit shader,但使用unlit shader无疑会减少很多计算量。


材质球(Material)

材质球(Material)可以被认为是一个基于shader的参数文件,同样需要手动创建在Assets目录中,后缀名是.mat

Maya的材质球可以随着.ma格式文件被导入Unity3D(但严重不推荐)。

实际上Unity3D自动识别了Maya材质球的相关参数,并以此创建了基于Stadard Shader的新的.mat文件,然后赋给转换后的模型。因此实际上并不一定能够保证新material的效果和在Maya中的效果一样,毕竟两个软件所采用的渲染方式都是天差地别的。

所以建议大家导入模型之后还是自行创建material并手动指定比较好。自动转换的material如果不使用的话最好删除掉,避免混淆。

所以,在Unity3D中给模型添加材质的一般流程是这样的:

  1. 如果不是使用内置shader的话,就要先下载shader资源并导入Unity3D,或者用可视化shader插件(比如Shader Forge)创建好shader;
  2. 在Unity3D中新建一个Material,并附加给模型;
  3. 选择这个Material,指定合适的shader(在Assets目录下的所有有效shader都会自动被加载到material的shader选择列表中去);
  4. 修改Material的各项参数并指定各种贴图

Material可以在Inspector最下面的预览窗口被预览到,右上方的模型按钮可以切换不同的预览模型(有方块、球、圆环、单面等)

常用材质球参数

Standard:

unity_material_standard.png

  • Albedo是颜色,可以将贴图资源从Project面板拖到前面的小方块上来添加贴图,贴图与后面的颜色设置相乘才是最终的效果(也就是说这个颜色会被multiply到贴图颜色上去)
  • Metallic是金属质感,数值越高,反光颜色越偏向本色(贴图颜色×颜色值)
  • Smoothness是光滑度,数值越高,表面越光滑,高光越集中,反射越清晰
  • Source是透明通道来源,可以选择使用Albedo贴图上的透明通道或者Metallic贴图上的透明通道
  • Normal Map是法线贴图
  • Height Map是高差图
  • Occlusion是模拟AOCC效果的贴图
  • Detail Mask是在表面再叠加一层细节遮罩时使用的贴图
  • Emission勾选表示材质“自发光”,会多出一个Color参数来指定发光的颜色、发光贴图、发光强度。强度可以设置到超过1,表示是一个很亮的物体。自发光材质会影响光照烘焙的结果
  • Tiling是贴图重复次数
  • Offset是贴图位移
  • Secondary Maps是可以添加次级细节贴图,当物体很靠近摄影机是会自动切换显示次级细节贴图
    • Detail Slbedo ×2是次级细节颜色贴图,建议创建成原来贴图的2倍大
    • Normal Map是次级细节法线贴图
  • Tiling同上
  • Offset同上
  • UV Set是选择UV组

Standard (Specular setup)与Standard的唯一区别,就在于采用Specular而非Metallic属性来设置高光,这样可以获得不同于颜色贴图色彩的高光颜色。

unity_material_standard2.png

Mobile/Bumped Specular:

unity_material_mobile_specular.png

Mobile类型的shader就简单很多了,可以看到只有最最基础的参数:

  • Shininess:光亮度
  • Base (RGB) Gloss (A):这里使用一张贴图的RGB通道作为颜色,A通道作为高光贴图
  • Normalmap:法线贴图

Unlit/Texture:

unity_material_unlit_texture.png

Unlit类型的shader就更简单,就只有贴图参数。Unlit/Color更简单,就只有一个颜色参数。Unlit/Transparent可以识别贴图的A通道并将其作为透明贴图,Unlit/Transparent Cutout与之类似,但处理透明贴图的方式不太一样,会将半透明区域简化成全透明或者全不透明。

2017-11-06 20:51:27 RoseChan 阅读数 3408
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4646 人正在学习 去看看 张刚

使用Unity3D自带的图片裁剪功能,实现逐帧图片的裁剪。

1.导入图片资源

这里写图片描述

2.点击选中一张图片,右侧属性面板,SpriteMode选择Multiple

这里写图片描述

这样就认为这张图片是由多张小图片组合而成的。

3.点击SpriteEditor按钮,在弹出的窗口点击Apply,进入图片编辑界面。

这里写图片描述
这里写图片描述

4.在图片编辑界面,点击slice按钮进入切歌菜单,点击slice切割图片,图片会根据分辨率自动切割,再点击右边的apply应用。

这里写图片描述
这里写图片描述

5.切割完成,再次回到资源面板查看图片,点击右边的播放按钮就可以预览到切割后的图片。

这里写图片描述

Tips:如果对切割结果不满意,可以再次回到SpriteEditor界面手动拖出一个区域进行切割。

没有更多推荐了,返回首页