抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Unity 加载文件

当我们在使用Unity制作一些程序时,往往需要从磁盘中运行时加载一些资产,而非提前放进Assets中,打进包体里

加载贴图

string rootPath = Path.GetDirectoryName(Path.GetDirectoryName(Application.dataPath));
string uvPath = Path.Combine(rootPath, "uv.png");
if (File.Exists(uvPath))
{
byte[] fileData = System.IO.File.ReadAllBytes(uvmapPath);
Texture2D uvmap = new Texture2D(2048, 2048);
uvmap.LoadImage(fileData);
Shader.SetGlobalTexture("_GlobalTexture", uvmap);
}

加载动画

先给一个暴论,Unity运行时加载一个FBX动画,将其转换为Humanoid格式是不可能的,加载动画唯一可行的就是Legacy格式

这会带来几个问题:

  1. 不能使用Humanoid格式的动画,于是动画数据要和模型的骨骼匹配
  2. 不能使用Playable Script播放动画,必须用老旧的Animation模块

使用TriLib2库加载模型

List<AnimationClip> clips = new List<AnimationClip>();

void Start()
{
// load animation
var options = AssetLoader.CreateDefaultLoaderOptions();
var context = AssetLoader.LoadModelFromFile(modelPath, OnLoad, null, null, null, null, options);
}

void OnLoad(AssetLoaderContext context)
{
// Get all animations
var root = context.RootGameObject.GetComponent<Animation>();
if (root != null)
{
var localClips = root.GetAllAnimationClips();
foreach (var clip in localClips)
{
clips.Add(clip);
}
}
context.RootGameObject.SetActive(false);
}

void Update()
{
// load is asyc, so need wait
if (hadPlay)
{
return;
}
else if (clips.Count == 0)
{
return;
}
else
{
hadPlay = true;
Debug.Log(clips.Count);
animationLength = Mathf.RoundToInt(clips[0].frameRate * clips[0].length);
currentFrame = 0;
// play animation
var anim = GetComponent<Animation>();
anim.AddClip(clips[0], "0");
anim.clip = anim.GetClip("0");
anim["0"].time = 0;
anim["0"].speed = 1;
anim.CrossFade("0");
}
}

GLTF模型和动画是可以运行时导入的,但是GLTF的Humanoid和FBX Humanoid不兼容,且GLTF Humanoid转换时,必须原始骨架要符合规范,而FBX Humanoid可以映射MMD骨架,因此在Unity官方提供GLTF加载库前,我不建议在Unity使用GLTF

评论