Unity小白也能搞定!用Blender和Mixamo自制《原神》桌宠(附完整源码)

张开发
2026/4/13 16:02:24 15 分钟阅读

分享文章

Unity小白也能搞定!用Blender和Mixamo自制《原神》桌宠(附完整源码)
Unity小白也能搞定用Blender和Mixamo自制《原神》桌宠附完整源码最近在B站看到不少《原神》角色的桌宠视频作为一个刚接触Unity的新手我也跃跃欲试想自己做一个。经过两周的摸索终于从零开始完成了一个可交互的桌宠程序。整个过程虽然踩了不少坑但收获也很大。下面就把我的完整制作流程分享给大家即使是Unity零基础也能跟着做出来1. 准备工作与环境搭建在开始之前我们需要准备好以下工具和资源Blender 2.93用于模型处理和格式转换Unity 2021 LTS推荐使用长期支持版本Mixamo账号免费获取角色动画原神PMX模型可以从一些模型分享网站获取安装Blender时需要注意官网下载的版本通常是最稳定的。国内一些社区提供的汉化版可能会缺少某些插件。我第一次就踩了这个坑导致后面模型转换时各种报错。提示Blender安装完成后建议立即安装MMD Tools插件这对处理PMX模型至关重要。Unity的安装相对简单但要注意勾选以下模块Windows Build Support如果你要打包exeAndroid Build Support如果需要移动端支持iOS Build Support针对苹果设备2. 模型处理与格式转换拿到PMX模型后我们需要将其转换为Unity可用的FBX格式。这个环节最容易出问题我总结了几个关键步骤在Blender中导入PMX模型使用MMD Tools插件修正骨骼导出为FBX格式具体操作命令如下# Blender控制台命令示例 import bpy bpy.ops.mmd_tools.import_model(filepathyour_model.pmx) bpy.ops.object.mmd_root_fix() bpy.ops.export_scene.fbx(filepathoutput.fbx)常见问题及解决方案问题现象可能原因解决方法模型变形骨骼权重错误在Blender中重新计算权重材质丢失贴图路径错误手动指定贴图路径动画不流畅帧率不匹配调整输出帧率为60FPS我在第一次转换时就遇到了模型脖子扭曲的问题后来发现是Keep Upper Chest选项没取消勾选导致的。这个小细节花了我整整一天才排查出来。3. 动画配置与状态机设置Mixamo上有大量免费动画资源我们可以下载几个适合桌宠的动作。我选择了Idle和Wave两个基础动作让桌宠可以在闲置和打招呼之间切换。在Unity中配置Animator Controller的步骤如下创建Animator Controller资源拖入下载的FBX动画文件设置过渡条件和参数// 动画状态切换代码示例 public class PetController : MonoBehaviour { private Animator anim; private bool isWaving false; void Start() { anim GetComponentAnimator(); } void Update() { if(Input.GetMouseButtonDown(0)) { isWaving !isWaving; anim.SetBool(Wave, isWaving); } } }动画混合的小技巧使用CrossFade让过渡更自然调整Transition Duration控制切换速度设置Exit Time确保动画完整播放4. 交互功能实现桌宠的核心交互功能包括拖拽、旋转和点击切换动作。我尝试了三种不同的拖拽实现方式最终选择了最稳定的射线检测方案。4.1 拖拽功能实现public class DragHandler : MonoBehaviour { private Vector3 offset; private float zCoord; void OnMouseDown() { zCoord Camera.main.WorldToScreenPoint(transform.position).z; offset transform.position - GetMouseWorldPos(); } void OnMouseDrag() { transform.position GetMouseWorldPos() offset; } private Vector3 GetMouseWorldPos() { Vector3 mousePoint Input.mousePosition; mousePoint.z zCoord; return Camera.main.ScreenToWorldPoint(mousePoint); } }4.2 旋转功能实现右键旋转功能需要处理欧拉角限制避免模型翻转public class RotateHandler : MonoBehaviour { public float rotationSpeed 10f; private float rotationY 0f; void OnMouseOver() { if(Input.GetMouseButton(1)) { rotationY Input.GetAxis(Mouse X) * rotationSpeed; transform.rotation Quaternion.Euler(0, rotationY, 0); } } }4.3 点击切换动作将之前的动画控制代码整合进来并优化了点击检测void Update() { if(Input.GetMouseButtonDown(0)) { Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, out RaycastHit hit)) { if(hit.transform transform) { ToggleAnimation(); } } } }5. 最终优化与打包为了让桌宠看起来更专业我做了以下优化屏幕自适应通过计算屏幕DPI确保在不同分辨率下显示一致透明背景使用Unity的透明窗口设置性能优化减少不必要的Update调用打包时需要注意设置正确的图标和元数据调整窗口大小和位置测试不同DPI设置下的显示效果完整项目已经上传到GitHub包含所有资源和脚本。在实际开发中我发现最耗时的不是写代码而是调试各种小问题。比如模型比例不对、动画错位、点击区域不准等等。每个问题都需要耐心排查但解决后的成就感也很强。

更多文章