u3d的ab文件注意事项

//----------------LoadAllAB.cs---------------------

using System.Collections;

using UnityEngine;


namespace System.IO

{

    public class LoadAllAB : MonoBehaviour

    {    

        //读取本地

        string path = "Assets/Actors/lznh/ab/animation/t_bl/";

        // Use this for initialization

        void Start()

        {

            //开始罗列目录内的文件

            if (Directory.Exists(path))

            {

                DirectoryInfo directoryInfo = new DirectoryInfo(path);

                FileInfo[] fileInfos = directoryInfo.GetFiles("*", SearchOption.AllDirectories);

               // Debug.Log(fileInfos.Length);


                for (int i = 0; i < fileInfos.Length;i++ )

                {

                    if (fileInfos[i].Name.EndsWith(".meta"))

                    {

                        continue;

                    }

                   // Debug.Log("Name:" + fileInfos[i].Name);


                    //开始读取目录内的文件

                    AssetBundle ab = AssetBundle.LoadFromFile(path + "/" + fileInfos[i].Name);

                    // 遍历所有object模型

                    object[] objs = ab.LoadAllAssets();


                    //遍历所有UnityEngine.Object模型

                    //UnityEngine.Object [] objs = ab.LoadAllAssets();


                    //遍历所有模型

                    foreach (UnityEngine.Object obj in objs)

                    {

                        //  输出所有模型

                        Instantiate(obj);

                    }

                }


            }


        }

    }

}


//----------------BuildAB.cs--------------------------

using System.IO;

using UnityEditor;

using UnityEngine;


public class BuildAB : MonoBehaviour

{


    //[MenuItem("AssetBundle/Package (Default)")]

    [MenuItem("Assets/Build AssetBundles")]

    static void BuildAllAssetBundles()

    {

        string assetBundleDirectory = "Assets/AssetBundles";

        if (!Directory.Exists(assetBundleDirectory))

        {

            Directory.CreateDirectory(assetBundleDirectory);

        }

        BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);

    }

}

-------------虚幻四使用的步骤-------------------
u3d导出ab包,输出skin蒙皮fbx。
首先我们使用LoadAllAB.cs导入所有的ab包,然后使用u3d自带的fbxExporter导出带skin蒙皮权重的fbx文件,注意一定要勾选导出skin蒙皮。
Tfbx的根骨骼要用原来夜神里面的角色资源名称。因为后续动作文件的根也是这个名字,去掉(clone)这部分。确认和skin名字不重复。

ab文件在u3d成功导入后的fbx时候,(我们叫它”Tpose的fbx“,简称Tfbx),在hierarchy改根骨骼为夜深模拟器里的角色资源码,比如M110005,生成Tfbx后再改为本身的文件名。这样,根骨骼都为M110005了,确认和skin名字不重复。

导入虚幻四才不会报错。
多组件身体部位的skin导入及合并。
如果碰到的是身体分组件,比如头肩,手,身,腿,脚。这种的,在第一次导入fbx的时候选择把所有骨骼都转为dummy物体,然后另存为max文件,然后再把这些max文件合并成一个文件,选择删除旧的重名物体,这样,所有的组件的skin都公用一个dummy的骨骼树了,再次输出为把dummy转换为bone骨骼)
Tfbx在u3d中生成ab文件,得到animator动画控制器,和动作片段一起输出Afbx文件。

然后这个Tfbx生成的预制体prefabs直接改ab名字,生成新的带animator的ab文件,改名为M110005,和动作片段animationClip的ab文件一起选择用assectsStudio导出动作Afbx文件。这个根骨骼是以新带animator的ab文件名命名的(因为目前还没有直接读取ab文件里的动画能力)
存在Tfbx和Afbx得尺寸不一样得情况。

看具体情况,有可能这个Tfbx的比例可能比动画Afbx文件的大100倍。所以要缩小为1%。才和动画文件Afbx一致,有点坑。

所以在虚幻四里导入动作文件要放大100倍。或者Tfbx文件缩小100倍。

---------u3d使用的步骤-----------------------

而在u3d中使用就很简单了,因为所有u3d的角色的根骨骼都是用文件名为根,所以不存在root根骨骼名不一致问题。也就不存在和skin蒙皮模型文件名一样导致出错。

而且这个skin在不同动画文件里不一样都没关系!它只要层级和主骨骼树(也就是cs的骨骼链)一致就行,骨骼树一致的就可以映射到动作,不一致的就不能映射到动作。

所以只需要加载几个不同的动画Afbx,加载第一个Afbx的模型。其他Afbx的动作,根本不再需要Tfbx了。

以下是动画映射成功的两个文件,Tfbx的mesh和bip_body一级,父级是bp_root
 


动画Afbx是mesh和bp_root一级,父级是Tfbx的文件名。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: U3D是一种用于创建和展示3D模型的开发平台,它可以通过http协议上传文件。在U3D中,http上传文件的基本步骤如下: 1. 准备上传文件:首先,需要准备要上传的文件。可以是3D模型文件、纹理文件、动画文件等。 2. 创建http请求:使用U3D提供的网络请求功能,创建一个http请求对象。这可以通过调用U3D的API函数来实现。 3. 设置请求参数:在http请求对象中,设置请求的参数,包括URL、文件名、上传方法等。这些参数将决定文件上传的目标地址以及上传的方式。 4. 打开上传文件:使用文件操作相关的API函数,打开要上传的文件。可以通过指定文件路径或者文件流的方式,将文件载入到内存中。 5. 上传文件数据:将打开的文件数据写入http请求对象。可以使用U3D提供的字节流操作函数,将文件数据逐块写入http请求对象中。 6. 发送http请求:将填充好数据的http请求对象发送出去,向服务器上传文件。这可以通过调用U3D的网络请求函数来实现。 7. 等待响应:等待服务器的响应。上传大文件可能需要一段时间,所以需要等待服务器返回上传结果的信息。 8. 处理响应结果:根据服务器返回的响应结果来处理上传结果。如果上传成功,可以继续进行其他操作,如果失败则可以进行重新上传或者错误处理。 通过上述步骤,可以在U3D中实现http上传文件的功能。这在一些需要将3D模型或其他文件从本地发送到服务器的应用场景中非常有用,比如游戏资源更新、3D模型共享等。 ### 回答2: U3D是一种用于创建三维图形的开发平台,它支持在网页上上传文件,包括通过HTTP的方式。下面简要介绍了U3D如何进行HTTP上传文件的步骤。 首先,我们需要使用U3D的开发环境进行编程。我们可以使用C#或JavaScript语言来编写代码。在代码中,我们需要使用U3D提供的网络相关类和函数来实现HTTP上传文件的功能。 其次,我们需要创建一个上传文件的表单。表单应该包含一个文件选择框和一个提交按钮。我们可以使用U3D提供的GUI(图形用户界面)组件来创建表单元素,并设置它们的相应属性。 接下来,我们需要编写代码来处理用户点击提交按钮的事件。在事件处理函数中,我们可以通过U3D的网络类来创建一个HTTP请求对象。我们可以设置请求对象的属性,如URL地址、请求方法(POST或GET)、请求头部等。 然后,我们需要将需要上传的文件加载到内存中。U3D提供了一些读取文件内容的函数,我们可以利用这些函数来读取文件的二进制数据,并保存到一个字节数组中。 最后,我们需要将文件的二进制数据附加到HTTP请求对象中,并发送给服务器。我们可以使用U3D提供的网络类中的方法来发送请求,并获取服务器的响应结果。 总结来说,U3D支持通过HTTP上传文件。我们可以使用U3D提供的网络类和函数来实现HTTP请求的功能,然后将文件的二进制数据附加到请求对象中,并发送给服务器。这样,我们就可以实现在U3D中通过HTTP上传文件的功能了。 ### 回答3: U3D是一种常用的3D游戏开发引擎,可以用来制作3D游戏和应用程序。在U3D中,我们可以通过HTTP协议将文件上传到服务器。 首先,我们需要使用U3D中提供的网络相关类,例如UnityWebRequest或WWW类来进行文件上传。这些类可以帮助我们与服务器建立连接,并发送和接收数据。 其次,我们需要确定上传文件的目标服务器地址。可以根据实际情况选择使用HTTP还是HTTPS协议。 然后,我们需要读取要上传的文件的二进制数据。可以使用U3D中的File类或其他相关API,打开并读取本地文件。 接下来,我们使用网络请求类将文件数据发送到服务器。我们需要设置请求的URL、请求方法(例如POST)、请求头(例如Content-Type)和请求的主体数据(即文件数据)。 在上传文件时,还可以添加其他的参数,例如文件名、文件类型等,以便服务器正确处理上传的文件。 最后,我们发送请求并等待服务器的响应。服务器将返回一个响应状态码和其他相关信息。我们可以根据服务器的响应来判断文件上传是否成功,并可以根据需要进行进一步的处理。 需要注意的是,文件上传过程中可能会出现网络连接问题或服务器端的限制,因此我们需要适当处理这些异常情况,并提供给用户相应的反馈信息。 总的来说,通过U3D中的网络相关功能,我们可以方便地实现文件上传功能,满足开发项目中对文件上传的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值