滑步处理 - 让动画脚步和移位一致
创始人
2025-06-01 01:20:30
0

游戏制作中,通常的做法是让动画播放跑步或者其他移动动画,然后让刚体跟着移动,这样就会出现不匹配现象,看起来角色看起来像滑冰一样。

Unity的动画本身有一个叫做ApplyRootMotion的东西,我么可以利用他让人物移动看起来一脚一个脚印的行走。

我们的制作原理就是把动画移动的位移数据获取到,然后利用这个位移信息进行移动。

动画处理

首先把要移动的动画要改成带位移的动画
请添加图片描述
我们来到动画的属性,需要修改Rig
在这里插入图片描述
下拉里选择CopyFromOtherAvatar,并且Source选择模型的Avatar。

来到Animation标签,这里是重点
在这里插入图片描述
对于行走动画,我们需要勾选LoopTime , LoopPose
RootTransformRotation和RootTransformPosition(Y)旋转我们不需要,所以直接勾选BakeIntoPose。
我们保留RootTransformPositionXZ。

其他移动的动画也是如此,待机动画因为不需要他有位移,所以idle我们全部勾选
在这里插入图片描述
设置完成后我们可以看下动画是否有问题
请添加图片描述

我们可以看到角色进行了移位,那么动画就设置完毕了。
动画控制器这里不说了,不是本文重点。

动画控制器设置

首先我们在Animator组件勾选ApplyRootMotion。
在这里插入图片描述

然后增加新的脚本,我这里命名TCharacterAnimation

	private void Awake(){animator = GetComponent();}void OnAnimatorMove(){fixedDeltaTime += Time.deltaTime;fixedDeltaPosition += animator.deltaPosition;fixedDeltaRotation *= animator.deltaRotation;}

保存脚本后,我们发现Animator发生了变化。
在这里插入图片描述
表示现在是由脚本来接管了。

动画控制脚本

通过获得Input或者其他输入,赋值给inputXZ变量前后和移动

    Vector3 moveDirectionVelocity;public float smoothAccelerationTime = 0.2f; // The smooth acceleration of the speed of the character (using Vector3.SmoothDamp)public float linearAccelerationSpeed = 3f; // The linear acceleration of the speed of the character (using Vector3.MoveTowards)void CheckAni(){MovieMove = Vector3.SmoothDamp(MovieMove, inputXZ, ref moveDirectionVelocity, smoothAccelerationTime);MovieMove = Vector3.MoveTowards(MovieMove, inputXZ, Time.deltaTime * linearAccelerationSpeed);//Vector3 dir = MovieMove;// transform.InverseTransformDirection(MovieMove);animator.SetFloat("velocity_X", MovieMove.x);animator.SetFloat("velocity_Z", MovieMove.z);}

这里的SmoothDamp,MoveTowards是一个让输入的数据进行渐变过渡,当然你可以直接把inputXZ传入动画。有过渡会丝滑一些。
动画参数velocity_X和Z是左右移动和前后移动。

玩家控制器脚本

这个脚本就是核心了,我们需要获取到动画数据进行移动

void FixedUpdate()
{nowVelocity = charAnimation.fixedDeltaTime > 0f ? charAnimation.fixedDeltaPosition / charAnimation.fixedDeltaTime : Vector3.zero;charAnimation.fixedDeltaTime = 0f;charAnimation.fixedDeltaPosition = Vector3.Zero;rig.velocity = nowVelocity;
}

网络同步

如果需要网络同步,我没有找到找到参考办法,我是这样处理的。
同步玩家的Input操作x和z的值。在进行处理,会出现一定的跟不上,我补充了位置同步,做一个位置慢慢的跟上的操作来弥补位置偏移。

		inputDir.x = hero.player.recInput.x;inputDir.z = hero.player.recInput.y;animator.SetFloat("velocity_X", inputDir.x);animator.SetFloat("velocity_Z", inputDir.z);
		float movSpeed = MoveSpeed * Time.deltaTime;thirdToPos = charAnimation.fixedDeltaPosition;// charAnimation.fixedDeltaTime = 0f;charAnimation.fixedDeltaPosition = Vector3.Zero;//movePos是同步过来的位置数据movePos += thirdToPos; //位置慢慢的跟上的操作来弥补位置偏移//这里需要调整速度,不能太快了transform.position = Vector3.Lerp(transform.position, movePos, movSpeed * 1.5f);

转身

对于转身,可以在Idle增加Turn属性来
在这里插入图片描述
转身需要勾选Position(Y)改为Feet,还有Position XZ
在这里插入图片描述
转身角度计算可以通过头部和身体的角度计算,超过一定数值,开启转身

	public float GetAngleFromForward(Vector3 worldDirection){Vector3 local = transform.InverseTransformDirection(worldDirection);return Mathf.Atan2(local.x, local.z) * Mathf.Rad2Deg;}float angle = GetAngleFromForward(hero.refParm.headDriect_actor.forward);float nowTurn = Mathf.Lerp(animator.GetFloat("Turn"), angle / turnAngle, Time.deltaTime * turnSpeed);animator.SetFloat("Turn", nowTurn);

到这里就按脚步移动就结束了。
另外还有一些其他技术例如motion matching。

这里有一些参考:
视频教程
好用的插件 FinialIK,这里有个下载,商用请支持Z版

相关内容

热门资讯

最新或2023(历届)清明节扫...  一、宣布仪式开始  1、“清明时节雨纷纷,路上行人欲断魂”。今天是清明节,我们来到了令人景仰的网上...
最新或2023(历届)中学生优... 世界上最无私的是母亲的爱,最伟大的也是母亲的爱,所以我们因该好好珍惜这份爱。  还记得有一次,五一劳...
最新或2023(历届)清明节扫... 一、开场白:  合:老师们、同学们,大家下午好:  男:又是一个清明节,我们站在庄严肃穆的烈士纪念碑...
最新或2023(历届)清明节祭... 学校清明节祭英烈活动方案  一、活动目的:  为了加强青少年学生的爱国主义教育和革命传统教育,进一步...
最新或2023(历届)清明节祭...   最新或2023(历届)清明节祭英烈活动方案  一、活动时间  4月1日——5月5日  二、活动目...
关于清明节祭英烈活动方案(2篇... 清明节祭英烈活动方案  第一篇  为加强未成年人中华民族优秀文化传统和中国革命传统教育,深入学习贯彻...
最新或2023(历届)公司企业...  中国元旦历来指的是农(夏、阴)历正月初一。元是“初”、“始”的意思,旦 指“日子”,元旦合称即是“...
最新或2023(历届)学校网上...   一、活动内容:组织学生进行网上祭奠、发表祭奠感言、开展网络访谈,撰写心得体会、表达对先烈、先人、...
最新或2023(历届)中小学生...  为了缅怀革命先烈丰功伟绩,引导广大青少年铭记中华民族艰苦卓绝的奋斗历程,大力弘扬爱国主义精神,进一...
最新或2023(历届)中国元旦...  在英国,公历元旦虽没有圣诞节那样隆重,但在除夕夜和元旦,还是根据当地的风俗习惯开展种种庆祝活动,以...
最新或2023(历届)中国元旦...  最新或2023(历届)中国元旦放假安排通知  最新或2023(历届)1月1日至1月3日,放假3天。...
大学新生军训广播稿 大学新生军...   大学新生军训广播稿(1)  年少的时候,总以为当兵是一首轻松浪漫的歌,歌里有绿色的橄榄枝,枝头挂...
最新或2023(历届)十八届五...  中共中央政治局10月12日召开会议,研究制定国民经济和社会发展第十三个五年规划重大问题,审议通过《...
有关微笑的校园广播稿 有关快乐...   甲:美丽的校园我的家,有你,有我,也有他!  乙:敬爱的老师们,亲爱的同学们  合:大家好!  ...
最新或2023(历届)十八届五... 最新或2023(历届)十八届五中全会什么时候召开?具体的召开时间通知已经公布,欢迎大家关注下文:  ...
预防疾病校园广播稿 预防疾病校...  甲:美丽的校园我的家,有你,有我,也有他!  乙:敬爱的老师们,亲爱的同学们  合:大家好!  甲...
小学生光盘行动广播稿 小学生光...  甲:大家好!很高兴和大家相会在这一期的红领巾广播站,我是主持人xxxx  乙:我是主持人xxxx首...
300字大学军训广播稿 300...  300字大学军训广播稿【1】  坚强,是生活在这个世界上的每个生物所具备的美好品质。  一望无垠的...
文明礼仪在心中校园广播稿 校园...   女:朝霞托着红日,徐徐从东方升起。  男:一个灿烂的日子,撒满大地。  女:春风吹,阳光照,语言...
勤奋主题小学生校园广播稿 勤奋...  甲:大家好,红领巾广播又准时和大家见面了  乙:本期红领巾广播的主题是《天才出于勤奋》  甲:有一...