asset unity3d
2018-02-26 14:07:20 qq_15559109 阅读数 4685
在游戏开发中,经常会用到一些配置文件保存一些数据,然后项目运行中读取这些配置文件中的数据在游戏中使用。


如:配置血条:根据角色类型(人物、动物、怪物等)配置不同的血条,包括血条大小,血条名或血条预设,血条颜色等一些简单数据。


如:配置子弹:子弹类型(真子弹、假子弹、追踪子弹等),子弹速度,伤害数值,子弹关联的特效等。


诸如此类的配置很多种,可创建一个可序列化的类存储数据,或者创建 XML 、JSON 文件保存数据,创建 Excel 文件,创建 TXT 文件,皆可完成需求,灵活使用这些方法保存配置数据。


在此介绍一下使用可序列化类保存配置,并且将可序列化类保存成Unity的自定义文件(.asset),然后配置自定义文件(.asset)。


优点:
可以保存数据类型多样(int、string、Vector3、GameObject、Transform、Texture等)如关联预设,关联图片等资源数据,而XML、TXT等只能保存(int、string、Vector3 等基本数据类型)。


缺点:
如果配置数据中保存了(GameObject、Texture)等资源数据,当关联的资源被删除时,配置数据将丢失,需要重新将新的资源再次关联到配置数据上。


下面做个简单的子弹配置数据

方式一:

// 创建一个可序列化的子弹类

Bullet.CSusing UnityEngine;

using System.Collections;

using System;

// 子弹类型枚举

public enum BulletType

{ DirectAttack = 0, // 直接攻击  

Phony, // 假子弹  

Real, // 真子弹 

Track, // 追踪子弹}

/// <summary>/// 可序列化/// </summary>

[Serializable]

public class Bullet : ScriptableObject { // Bullet 类直接继承自 ScriptableObject  

// 子弹类型 public BulletType bulletType = BulletType.DirectAttack;

// 子弹速度
    public int speed = 10;


    // 伤害数值
    public int damage = 5;


    // 子弹关联的特效
    public GameObject effectObj;
}

1
2
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;


public class CreateAsset : Editor {


    // 在菜单栏创建功能项
    [MenuItem("CreateAsset/Asset")]
    static void Create()
    {
        // 实例化类  Bullet
        ScriptableObject bullet = ScriptableObject.CreateInstance<Bullet>();


        // 如果实例化 Bullet 类为空,返回
        if (!bullet)
        {
            Debug.LogWarning("Bullet not found");
            return;
        }
        // 自定义资源保存路径
        string path = Application.dataPath + "/BulletAeeet";
        // 如果项目总不包含该路径,创建一个
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }


        //将类名 Bullet 转换为字符串
        //拼接保存自定义资源(.asset) 路径
        path = string.Format("Assets/BulletAeeet/{0}.asset", (typeof(Bullet).ToString()));

        // 生成自定义资源到指定路径
        AssetDatabase.CreateAsset(bullet, path);
    }
}

如果想自定义 文件的 Inspector面板,使用编辑器类重写 Bullet.cs 的Inspector面板, 代码如下

using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(Bullet))]
public class BulletInspector : Editor {

    // 子弹类型
    public SerializedProperty bulletType;

    // 子弹速度
    public SerializedProperty speed;

    // 伤害数值
    public SerializedProperty damage;

    // 子弹关联的特效
    public SerializedProperty effectObj;

    private void OnEnable()
    {
        bulletType = serializedObject.FindProperty("bulletType");
        speed = serializedObject.FindProperty("speed");
        damage = serializedObject.FindProperty("damage");
        effectObj = serializedObject.FindProperty("effectObj");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        EditorGUI.indentLevel = 1;

        EditorGUILayout.PropertyField(bulletType, new GUIContent("子弹类型"));
        GUILayout.Space(5);

        EditorGUILayout.PropertyField(speed, new GUIContent("子弹速度"));

      GUILayout.Space(5);        EditorGUILayout.PropertyField(damage, new GUIContent("伤害数值"));

        GUILayout.Space(5);
        EditorGUILayout.PropertyField(effectObj, new GUIContent("特效对象"));
        GUILayout.Space(10);
        // 打印数据
        if (GUILayout.Button("Debug"))
        {
            Debug.Log("bulletType    :" + (BulletType)bulletType.enumValueIndex);
            Debug.Log("speed         :" + speed.intValue);
            Debug.Log("damage        :" + damage.intValue);


            if (effectObj.objectReferenceValue)
            {
                Debug.Log("effectObj    :" + effectObj.objectReferenceValue);
            }
        }


        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }

serializedObject.ApplyModifiedProperties();
    }

}

方式二:


读取asset文件



2018-06-06 16:34:35 qq_31997391 阅读数 597

http://blog.csdn.net/amazonzx/article/details/7980117

Asset Server是目前Unity内部自带的资源版本管理工具,类似于我们平时所熟知的SVNperForce,但对于目前的UnityAsset
Server
要比SVNperForce等版本控制软件要好用一些,因为Unity3.x版本对于SVN等软件的支持并不是很好,在多人协同工作时,经常会发生数据丢失等情况。因此,本文重点介绍一下Asser
Server
的搭建方法。至于日常用法,其实与SVN等软件的用法非常相似,所以在这里就不多讲了。

关于Asset Server的搭建步骤,其实官网论坛上已经有了解释得比较详细明了,在这里,我只将其归纳总结一下,使其更加清晰明了。Asset Server的搭建步骤如下所示:

 

1、  首先去官网下载Asset Server工具,地址为:http://unity3d.com/unity/team/assetserver/。下好后在你的服务器上进行安装,这里有个重要的地方,即Asset
Server
的密码设置,界面如下,这个密码即为以后Asset Server的管理员密码。

2、 安装好后,运行Unity,通过“Window->Asset Server”打开Asset Server界面,如下所示:

3、 点击上图中的“Administration”,可打开如下界面:

4、 Server Address输入“localhost”,User Name输入“admin”,然后输入安装Asset Server时设置的密码,即可进行连接,连接成功后,右侧“Admin Actions”中的前两项会被点亮,如下所示:

(注:如果Server Address输入“localhost”提示地址不对,直接手动输入IP地址,这里的IP地址分局域网地址和外网地址,局域网地址比较容易直接输入服务器IP地址。如果是外网地址需映射另外一篇中讲)

5、 点击“Create”即可在服务器端建立起一个新的项目,再点击“New User”可对于该项目配置用户。点击“Create”后,会让你输入新的项目名称,假设为“AA”,界面如下:

6、 点击“Create Project”即可建立起一个名为“AA”新的空项目。点击项目AA,你会发现“Admin Actions”中的按钮全部变亮,即你可以对项目进行拷贝、删除等操作。

7、 在“User”中只有“admin”管理员用户,要想创建其他用户,可点击“New User”来建立。

8、 填好信息后,即可创建新用户,如下图所示:

9、 以上操作则在服务器上建立了一个新的空项目,以及新的用户,下面就介绍如何将已有项目资源导入到该空项目中。右键点击项目AA,选择“Connection”,即会出现如下界面:

10、输入Server IP,服务器则输入“localhost”,用户名和密码,点击“Show Projects”则可看到当前服务器上的项目名称,选择你想连接的项目,即可进行连接,如下图所示:

11、点击“Connect”,经过一段时间等待以后,即会出现如下界面:

12、右侧的后缀为“绿色New”的资源是表明该资源对于服务器来说是新的(因为当前服务器项目为空,所以所有资源全是New),需要进行Commint。点击“Commit”,则出现如下界面:

13、点击Add All后,即可进行Commit上传资源了,自此,服务器上的Asset Server搭建完毕,其他用户可以通过创建新用户来进行资源的下载和上传。


2014-12-21 22:15:45 qq617119142 阅读数 780

本系列文章由 Amazonzx 编写,欢迎转载,转载请注明出处。

http://blog.csdn.net/amazonzx/article/details/7980117


Asset Server是目前Unity内部自带的资源版本管理工具,类似于我们平时所熟知的SVNperForce,但对于目前的UnityAsset Server要比SVNperForce等版本控制软件要好用一些,因为Unity3.x版本对于SVN等软件的支持并不是很好,在多人协同工作时,经常会发生数据丢失等情况。因此,本文重点介绍一下Asser Server的搭建方法。至于日常用法,其实与SVN等软件的用法非常相似,所以在这里就不多讲了。

关于Asset Server的搭建步骤,其实官网论坛上已经有了解释得比较详细明了,在这里,我只将其归纳总结一下,使其更加清晰明了。Asset Server的搭建步骤如下所示:

 

1、  首先去官网下载Asset Server工具,地址为:http://unity3d.com/unity/team/assetserver/。下好后在你的服务器上进行安装,这里有个重要的地方,即Asset Server的密码设置,界面如下,这个密码即为以后Asset Server的管理员密码。



2、 安装好后,运行Unity,通过“Window->Asset Server”打开Asset Server界面,如下所示:



3、 点击上图中的“Administration”,可打开如下界面:



4、 Server Address输入“localhost”,User Name输入“admin”,然后输入安装Asset Server时设置的密码,即可进行连接,连接成功后,右侧“Admin Actions”中的前两项会被点亮,如下所示:



5、 点击“Create”即可在服务器端建立起一个新的项目,再点击“New User”可对于该项目配置用户。点击“Create”后,会让你输入新的项目名称,假设为“AA”,界面如下:



6、 点击“Create Project”即可建立起一个名为“AA”新的空项目。点击项目AA,你会发现“Admin Actions”中的按钮全部变亮,即你可以对项目进行拷贝、删除等操作。



7、 在“User”中只有“admin”管理员用户,要想创建其他用户,可点击“New User”来建立。



8、 填好信息后,即可创建新用户,如下图所示:



9、 以上操作则在服务器上建立了一个新的空项目,以及新的用户,下面就介绍如何将已有项目资源导入到该空项目中。右键点击项目AA,选择“Connection”,即会出现如下界面:



10、输入Server IP,服务器则输入“localhost”,用户名和密码,点击“Show Projects”则可看到当前服务器上的项目名称,选择你想连接的项目,即可进行连接,如下图所示:



11、点击“Connect”,经过一段时间等待以后,即会出现如下界面:



12、右侧的后缀为“绿色New”的资源是表明该资源对于服务器来说是新的(因为当前服务器项目为空,所以所有资源全是New),需要进行Commint。点击“Commit”,则出现如下界面:



13、点击Add All后,即可进行Commit上传资源了,自此,服务器上的Asset Server搭建完毕,其他用户可以通过创建新用户来进行资源的下载和上传。



2015-12-02 09:38:13 yaokang522 阅读数 499

Unity3D 的 asset bundle 的格式并没有公开。但为了做更好的差异更新,我们还是希望了解其打包格式。这样可以制作专门的差异比较合并工具,会比直接做二进制差异比较效果好的多。因为可以把 asset bundle 内的数据拆分为独立单元,只对变更的单元做差异比较即可。

网上能查到的资料并不是官方给出的,最为流行的是一个叫做 disunity 的开源工具。它是用 java 编写的,只有源代码,而没有给出格式说明(而后者比代码重要的多)。通过阅读 disunity 的代码,我整理出如下记录:


asset bundle 分为压缩模式和非压缩模式。压缩模式仅仅是用开源的 lzma 库 对整个非压缩包做了一次整体压缩。压缩数据的头有 13 个字节,前 5 个字节是 lzma 解压缩的 API 需要穿入的 props ,接下来的 4 字节是解压缩后的数据库长度。最后 4 字节不用理会它。

把压缩数据解开后,就和非压缩模式没有差别,下面只讨论非压缩格式:

assert bundle 的文件头是从这样一个数据结构序列化出来的。

struct AssetBundleFileHead {
     struct LevelInfo {
          unsigned int PackSize;
          unsigned int UncompressedSize;
     };

     string          FileID;
     unsigned int     Version;
     string          MainVersion;
     string          BuildVersion;
     size_t          MinimumStreamedBytes;
     size_t          HeaderSize;
     size_t          NumberOfLevelsToDownloadBeforeStreaming;
     size_t          LevelCount;
     LevelInfo     LevelList[];
     size_t          CompleteFileSize;
     size_t          FileInfoHeaderSize;
     bool          Compressed;
};

string 是直接以 \0 结尾的字符串,顺序序列化;size_t 是大端的 4 字节数字;bool 是单个字节;vector 就是顺着排列的结构。

根据 Unity 版本的不同,assert bundle 的格式也不完全相同。Version 指明了 bundle 的格式版本,从 Unity 3.5 开始到 4.x 版都使用 Version = 3 ,下面只讨论这个版本。HeaderSize 应该恰好等于以上这个文件头的数据长度。

一个 assert bundle 是由多个 asset 文件打包而成,接下来顺序打包了这些 asset 。序列化成这样的结构:

struct AssetFileHeader {
     struct AssetFileInfo {
          string name;
          size_t offset;
          size_t length;
     };
     size_t FileCount;
     AssetFileInfo     File[];
};

这样我们就可以分解出被打包在一起的多个 Asset 了(大多数情况下只有一个)。offset 表示的是除去 HeaderSize 后的偏移量。我们可以用 HeaderSize 加上那个部分的 offset 得到这个部分相对于整个 bundle 的文件偏移。

对于每个 asset ,又有它自己的数据头。数据头除了基本的数据头结构 AssetHeader 外,还有额外的三个部分。disunity 把它们称为 TypeTree ObjectPath 和 AssetRef 。注意:这里 Format 随不同 Unity3D 的版本有所不同,我们只关心目前的版本的格式,这里 Format 为 9 (其它版本的格式,在大小端等问题上有所不同)。

struct AssetHeader {
     size_t TypeTreeSize;
     size_t FileSize;
     unsigned int Format;
     size_t dataOffset;
     size_t Unknown;

Unity 对 Asset 数据做了简单粗暴的序列化操作。整个序列化过程是针对每种对象的数据结构进行的。TypeTree 是对数据结构本身的描述,通过这个描述,就可以反序列化出每个对象。

AssetHeader 后面紧跟着的就是 TypeTree 。但是,这个 TypeTree 对于 asset bundle 来说是可选的,因为数据结构的信息可以事先放置在引擎中(引擎多半只支持固有的数据类型)。在发布到移动设备上时,TypeTree 是不打包到 asset bundle 中的。

每个 asset 对象,都有一个 class id ,可以在 TypeTree 中查到如何反序列化。class id 的和具体类型的对应关系,在Unity3d 的官方文档 可以查到。但若我们只是想将差异比较在对象一级进行(而不是具体比较对象中具体的属性),那么就不需要解开具体对象的细节信息,这部分也不用关心。所以这里也不展开(有兴趣可以读一下 disunity 的代码,格式并不复杂)。

在 AssetHeader 中的 TypeTreeSize 指的就是 TypeTree 部分的大小。接下来是每个 AssetObject 的描述数据。

struct ObjectHeader {
     struct ObjectInfo {
          int pathID;
          int offset;
          int length;
          byte classID[8];
     };
     int ObjectCount;
     ObjectInfo Object[];
};

这里,所有的 int 都是以小端编码的 4 字节整数(不同于外部文件格式采用的大端编码)。在 Unity3D 中,每个对象都有唯一的字符串 path ,但是在 asset bundle 里并没有直接保存字符串,而是一个 hash 过的整数,也可以看成是对这个对象的索引号。真正的对象放在数据头的后面,偏移量为 offset 的地方。

这里的 offset 是相对当前 asset 块的。如果想取得正确的相对整个文件的位置,应该是文件的 HeaderSize + asset 的 offset + asset 的 dataOffset + 这里的 object offset 。


接在 ObjectHeader 后的是 AssetRef 表,记录了 Asset 的引用关系。用于指明这个 bundle 内 asset 对外部 asset 的引用情况。AssetRefTable 结构如下:

struct AssetTable {
     struct AssetRef {
          byte GUID[8];
          int type;
          string filePath;
          string assetPath;
     };
     int Count;
     byte Unknown;
    vector Refs;
2014-12-24 15:12:51 OnafioO 阅读数 1761

http://blog.codingnow.com/2014/08/unity3d_asset_bundle.html

 

Unity3D 的 asset bundle 的格式并没有公开。但为了做更好的差异更新,我们还是希望了解其打包格式。这样可以制作专门的差异比较合并工具,会比直接做二进制差异比较效果好的多。因为可以把 asset bundle 内的数据拆分为独立单元,只对变更的单元做差异比较即可。

网上能查到的资料并不是官方给出的,最为流行的是一个叫做 disunity 的开源工具。它是用 java 编写的,只有源代码,而没有给出格式说明(而后者比代码重要的多)。通过阅读 disunity 的代码,我整理出如下记录:


asset bundle 分为压缩模式和非压缩模式。压缩模式仅仅是用开源的 lzma 库 对整个非压缩包做了一次整体压缩。压缩数据的头有 13 个字节,前 5 个字节是 lzma 解压缩的 API 需要穿入的 props ,接下来的 4 字节是解压缩后的数据库长度。最后 4 字节不用理会它。

把压缩数据解开后,就和非压缩模式没有差别,下面只讨论非压缩格式:

assert bundle 的文件头是从这样一个数据结构序列化出来的。

struct AssetBundleFileHead {
     struct LevelInfo {
          unsigned int PackSize;
          unsigned int UncompressedSize;
     };

     string          FileID;
     unsigned int     Version;
     string          MainVersion;
     string          BuildVersion;
     size_t          MinimumStreamedBytes;
     size_t          HeaderSize;
     size_t          NumberOfLevelsToDownloadBeforeStreaming;
     size_t          LevelCount;
     LevelInfo     LevelList[];
     size_t          CompleteFileSize;
     size_t          FileInfoHeaderSize;
     bool          Compressed;
};

string 是直接以 \0 结尾的字符串,顺序序列化;size_t 是大端的 4 字节数字;bool 是单个字节;vector 就是顺着排列的结构。

根据 Unity 版本的不同,assert bundle 的格式也不完全相同。Version 指明了 bundle 的格式版本,从 Unity 3.5 开始到 4.x 版都使用 Version = 3 ,下面只讨论这个版本。HeaderSize 应该恰好等于以上这个文件头的数据长度。

一个 assert bundle 是由多个 asset 文件打包而成,接下来顺序打包了这些 asset 。序列化成这样的结构:

struct AssetFileHeader {
     struct AssetFileInfo {
          string name;
          size_t offset;
          size_t length;
     };
     size_t FileCount;
     AssetFileInfo     File[];
};

这样我们就可以分解出被打包在一起的多个 Asset 了(大多数情况下只有一个)。offset 表示的是除去 HeaderSize 后的偏移量。我们可以用 HeaderSize 加上那个部分的 offset 得到这个部分相对于整个 bundle 的文件偏移。

对于每个 asset ,又有它自己的数据头。数据头除了基本的数据头结构 AssetHeader 外,还有额外的三个部分。disunity 把它们称为 TypeTree ObjectPath 和 AssetRef 。注意:这里 Format 随不同 Unity3D 的版本有所不同,我们只关心目前的版本的格式,这里 Format 为 9 (其它版本的格式,在大小端等问题上有所不同)。

struct AssetHeader {
     size_t TypeTreeSize;
     size_t FileSize;
     unsigned int Format;
     size_t dataOffset;
     size_t Unknown;

Unity 对 Asset 数据做了简单粗暴的序列化操作。整个序列化过程是针对每种对象的数据结构进行的。TypeTree 是对数据结构本身的描述,通过这个描述,就可以反序列化出每个对象。

AssetHeader 后面紧跟着的就是 TypeTree 。但是,这个 TypeTree 对于 asset bundle 来说是可选的,因为数据结构的信息可以事先放置在引擎中(引擎多半只支持固有的数据类型)。在发布到移动设备上时,TypeTree 是不打包到 asset bundle 中的。

每个 asset 对象,都有一个 class id ,可以在 TypeTree 中查到如何反序列化。class id 的和具体类型的对应关系,在 Unity3d 的官方文档 可以查到。但若我们只是想将差异比较在对象一级进行(而不是具体比较对象中具体的属性),那么就不需要解开具体对象的细节信息,这部分也不用关心。所以这里也不展开(有兴趣可以读一下 disunity 的代码,格式并不复杂)。

在 AssetHeader 中的 TypeTreeSize 指的就是 TypeTree 部分的大小。接下来是每个 AssetObject 的描述数据。

struct ObjectHeader {
     struct ObjectInfo {
          int pathID;
          int offset;
          int length;
          byte classID[8];
     };
     int ObjectCount;
     ObjectInfo Object[];
};

这里,所有的 int 都是以小端编码的 4 字节整数(不同于外部文件格式采用的大端编码)。在 Unity3D 中,每个对象都有唯一的字符串 path ,但是在 asset bundle 里并没有直接保存字符串,而是一个 hash 过的整数,也可以看成是对这个对象的索引号。真正的对象放在数据头的后面,偏移量为 offset 的地方。

这里的 offset 是相对当前 asset 块的。如果想取得正确的相对整个文件的位置,应该是文件的 HeaderSize + asset 的 offset + asset 的 dataOffset + 这里的 object offset 。


接在 ObjectHeader 后的是 AssetRef 表,记录了 Asset 的引用关系。用于指明这个 bundle 内 asset 对外部 asset 的引用情况。AssetRefTable 结构如下:

struct AssetTable {
     struct AssetRef {
          byte GUID[8];
          int type;
          string filePath;
          string assetPath;
     };
     int Count;
     byte Unknown;
    vector Refs;

Unity3D asset bundle 格式解析

阅读数 521

转自云风的Blog:http://blog.codingnow.com/2014/08/unity3d_asset_bundle.htmlUnity3Dassetbundle格式简析Unity3D的assetbundle的格式并没有公开。但为了做更好的差异更新,我们还是希望了解其打包格式。这样可以制作专门的差异比较合并工具,会比直接做二进制差异比较效果好的多。因为可以把asset

博文 来自: u013895270

Unity3D asset bundle 格式简析

阅读数 319

Unity3D的assetbundle的格式并没有公开。但为了做更好的差异更新,我们还是希望了解其打包格式。这样可以制作专门的差异比较合并工具,会比直接做二进制差异比较效果好的多。因为可以把assetbundle内的数据拆分为独立单元,只对变更的单元做差异比较即可。网上能查到的资料并不是官方给出的,最为流行的是一个叫做disunity的开源工具。它是用java编写的,

博文 来自: cbbbc

Unity3D asset bundle 格式简析

阅读数 257

Unity3Dassetbundle格式简析Unity3D的assetbundle的格式并没有公开。但为了做更好的差异更新,我们还是希望了解其打包格式。这样可以制作专门的差异比较合并工具,会比直接做二进制差异比较效果好的多。因为可以把assetbundle内的数据拆分为独立单元,只对变更的单元做差异比较即可。网上能查到的资料并不是官方给出的,最为流行的是一个叫做

博文 来自: wuxiaoming1733

Unity3D 官方基础教程 Asset Workflow

阅读数 1571

AssetWorkflow(资源工作流程)Herewe'llexplainthestepstouseasingleassetwithUnity.Thesestepsaregeneralandaremeantonlyasanoverviewforbasicactions.Fortheexample,we'lltalkabout

博文 来自: wuzehai02

Unity3D asset bundle 格式简析

阅读数 218

Unity3Dassetbundle格式简析Unity3D的assetbundle的格式并没有公开。但为了做更好的差异更新,我们还是希望了解其打包格式。这样可以制作专门的差异比较合并工具,会比直接做二进制差异比较效果好的多。因为可以把assetbundle内的数据拆分为独立单元,只对变更的单元做差异比较即可。网上能查到的资料并不是官方给出的,最为流行的是一个叫做

博文 来自: wuxiaoming1733
没有更多推荐了,返回首页