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格式
这会带来几个问题:
- 不能使用Humanoid格式的动画,于是动画数据要和模型的骨骼匹配
- 不能使用Playable Script播放动画,必须用老旧的Animation模块
使用TriLib2库加载模型
List<AnimationClip> clips = new List<AnimationClip>();
void Start() { var options = AssetLoader.CreateDefaultLoaderOptions(); var context = AssetLoader.LoadModelFromFile(modelPath, OnLoad, null, null, null, null, options); }
void OnLoad(AssetLoaderContext context) { 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() { 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; 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