位置: 编程技术 - 正文

在Unity3D的Legacy动画系统中应用Root Motion(unity3d ide)

编辑:rootadmin

推荐整理分享在Unity3D的Legacy动画系统中应用Root Motion(unity3d ide),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:unity3d gameobject,unity中,unity3d功能,unity3d all compiler errors,unity3d ide,unity3d all compiler errors,unity3d instantiate,unity3d all compiler errors,内容如对您有帮助,希望把文章链接给更多的朋友!

在Unity3D的Legacy动画系统中应用Root Motion(unity3d ide)

最近仔细比较了Unity3D目前版本中的两套动画系统:Legacy和Mecanim。Mecanim系统功能较之Legacy要强大很多,但是使用AnimatorController着实不方便(尽管使用AnimatorOverrideController可以避免重复编辑状态机),是因为游戏逻辑层面往往要用一个状态机或者类&#;的机制来控制角色的状态,而角色层面的状态逻辑和动画层面是无法一一对应的,两套复杂的状态机要配合起来。。。想想就觉得蛋疼啊!难怪很多朋友现在还在使用Legacy动画系统。Legacy动画系统其实功能也很全面了,包括Layer、过渡混合、上下身混合之类的功能完全能够胜任,而且控制起来就直接的多了。唯独Root Motion这个我很需要特性没有支持,本文就探讨一下如何在Legacy动画系统之上附加Root Motion功能,其实很简单 。

何谓Root Motion在不使用Root Motion的情况下,类&#;走、跑这样的位移控制是这样的:1. 请美术在导出动画时把位移去掉;2. 在程序代码里控制角色移动的速度,在播放动画的同时,计算其位移。这种做法其实挺不科学的,程序控制的角色,只能当做一个质点来处理,并且大多数时候都是匀速运动,而动画中的角色的移动往往很难跟这个匹配。所以需要比较良好的计算和比较好的美术技巧才能避免角色“滑步”的现象。在“跑”这种快速移动这,滑步还比较好处理,如果是慢速移动。。。。再厉害的美术也爱莫能助了。这种情况下,最好还是使用Root Motion:1. 美术在导出动画的时候是附带位移的;2. 程序把动画的每一帧的位移是从动画中读取出来,再应用到角色上的,这样就能达到动画和位移的完美匹配了。在Legacy中添加Root Motion功能了解了Root Motion的概念之后,在Unity3D引擎中我们很简单就可以实现此功能了。Unity3D有一个统一的对象层次结构设计,这点非常赞,我们可以很简单找到角色的根骨骼,然后把其中的Transform变换读取出来,请见以下示例代码://-- 计算当前帧的Root Motion Vector3 rootPos = m_rootBone.localPosition; m_rootMotion = rootPos - m_lastRootPos; m_lastRootPos = rootPos; rootPos.x = 0; rootPos.z = 0; m_rootMotion.y = 0; m_rootBone.localPosition = rootPos;请注意,我们在后续的代码中要把m_rootMotion附加的角色对象上,所以m_rootBone的postion被reset了。在读取了此帧的Root Motion,在可以把它应用到当前对象之上了://-- Apply Root Motion Vector3 nextPos = this.transform.position &#; m_rootMotion; this.transform.position = nextPos;另外,一个细节需要处理一下,在动画循环的那一帧,需要特殊处理一下。好的,看一下完整的源代码吧:using UnityEngine;using System.Collections;public class ApplyRootMotion : MonoBehaviour{ public Transform m_flagObject; // 用来测试位置的一个对象 //-- Root Motion 控制变量 Transform m_rootBone; Vector3 m_lastRootPos; Vector3 m_rootMotion; int m_lastAnimTime; void Start () { //-- 从SkinnedMeshRenderer中读取Root Bone SkinnedMeshRenderer skinMesh = this.gameObject.GetComponentInChildren<SkinnedMeshRenderer>(); m_rootBone = skinMesh.rootBone; //-- 变量初始化 m_rootMotion = Vector3.zero; m_lastRootPos = m_rootBone.localPosition; m_lastAnimTime = 0; } void Update () { //-- Apply Root Motion Vector3 nextPos = this.transform.position &#; m_rootMotion; this.transform.position = nextPos; //-- 测试代码:更新测试物体的位置 Vector3 flagPos = m_flagObject.position; flagPos.x = nextPos.x; flagPos.z = nextPos.z; m_flagObject.position = flagPos; //-- 测试代码:更新摄像机 Camera.main.transform.LookAt(this.transform); } void LateUpdate() { AnimationState animState = this.animation["walking"]; if ((int)animState.normalizedTime > m_lastAnimTime) { //-- 动画循环处理 m_lastRootPos = m_rootBone.localPosition; m_rootMotion = Vector3.zero; } else { //-- 计算当前帧的Root Motion Vector3 rootPos = m_rootBone.localPosition; m_rootMotion = rootPos - m_lastRootPos; m_lastRootPos = rootPos; rootPos.x = 0; rootPos.z = 0; m_rootMotion.y = 0; m_rootBone.localPosition = rootPos; } m_lastAnimTime = (int)animState.normalizedTime; }}最后是截图。。。好吧,静态图片看不出效果,可以下载完整Demo(请使用Unity 4.6版本打开),角色移动非常平滑,毫无滑步。

请移步百度网盘: 声明:此篇文档时来自于【狗刨学习网】社区,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。

标签: unity3d ide

本文链接地址:https://www.jiuchutong.com/biancheng/369416.html 转载请保留说明!

上一篇:unity开发炉石传说系列系统卡牌出入及移动排列代码(炉石传说代码怎么导入)

下一篇:openGL4.X 深度测试(depth testing) framebuffer中(opengl 4.2)

  • 委托加工物资的成本包括哪些内容
  • 其他债权投资的交易费用计入哪里
  • 建设单位施工现场补助
  • 一个月没有账务往来,现金日记账如何登记?
  • 企业所得税季度申报时间
  • 不是公司员工可以举报公司不交社保吗
  • 借款利息抵扣土增
  • 研发费用直接计入成本吗
  • 取消待摊费用科目
  • 公司财务外包费怎么入账
  • 润滑油怎么做账务处理
  • 金税盘证书口令被锁死自己能解吗
  • 单独计价作为固定资产入账的土地为什么不计提折旧
  • 房地产开发公司取名
  • 员工就诊发票可以报销吗
  • 出口发票金额和备注了差了1分钱
  • 行政机关作出下列行为属于行政复议的范围
  • 公司购买地下停车位如何入账
  • 应交税费借方余额填列资产负债表
  • 参加展会的住宿费计入什么科目
  • 专用发票不抵扣联可以当普票用吗?
  • 企业合并以外
  • 退回工资能退个税吗
  • 注册会计师考点分析
  • 软件开发过程中采用多种图形化工具
  • 无偿划转净资产为负数的企业账务处理
  • 增值税普票当月开错了怎么办
  • 小规模纳税人开专票不超过30万要交税吗
  • 补交以前年度个税怎么做账
  • 进项转出税务处理
  • 固定资产残值率计算公式
  • mac auto tune
  • php中数组的常用函数及用法
  • 台式机用win7
  • 货物退回的会计处理
  • 秋日里通往卢浮宫的杜乐丽花园,法国巴黎 (© Brian A. Jackson/Getty Images Plus)
  • linuxvim批量替换
  • vue3props用法
  • 华硕11代笔记本装win10
  • php 时间
  • 房地产企业销售佣金税前扣除
  • 如何使用应用程序
  • vue过滤器可以异步吗
  • 企业所得税如何计算应纳税所得额
  • 什么是对公账户和个人账户
  • 企业计提养老保险分录
  • 邀请客户参加会议
  • 认缴制下,资金什么时候必须到位
  • 库存商品和固定成本区别
  • 小规模企业没有进项票能开发票吗
  • 起征点和免征额都是税收优惠形式
  • 劳务派遣人员的档案会保存在用人单位吗
  • 农民专业合作社法
  • 员工安全培训费可以抵扣增值税吗
  • 应交税费属于什么科目借方
  • 视同销售但未收到钱怎么做账?
  • 企业的管理人员应该是互补型
  • mysql中一个普通ERROR 1135 (HY000)错误引发的血案
  • 如何查看连接网络的密码
  • windowsxp忘记密码了怎么办简单点
  • Win7/Win8/Win10单、多系统一键安装教程 只需30秒!
  • vc运行程序exe停止工作
  • 电脑桌面图标有虚影怎么回事
  • windows 8.1更新
  • Radio.exe - Radio是什么进程 有什么用
  • win8.1安装过程
  • WIN10系统怎么查看隐藏的文件夹
  • ajax请求数据放到页面
  • perl中$_
  • linux 编译
  • python re 查找
  • Node.js中的核心模块包括哪些内容?
  • 批处理之家官网
  • 安卓手机查看sd卡
  • 猫猫的娱乐
  • js原生方法大全
  • Python中使用装饰器来优化尾递归的示例
  • 国税局宁夏税务
  • 广东省电子税务局官网登录入口
  • 梨树烧烤一条街打人
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设