900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 17.Unity2D 横版 骨骼动画 之 动画中局部骨骼旋转+多层动画共同控制+局部骨骼索敌攻击

17.Unity2D 横版 骨骼动画 之 动画中局部骨骼旋转+多层动画共同控制+局部骨骼索敌攻击

时间:2023-10-17 15:31:43

相关推荐

17.Unity2D 横版 骨骼动画 之 动画中局部骨骼旋转+多层动画共同控制+局部骨骼索敌攻击

主目录

承接上节课

16.Unity2D 横版 骨骼动画 之 单张PSB图+PS像素画软件_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客上一节课我们学习了单张的切片图,是最简单的一种骨骼动画,但是过几天我发现一个很大的问题--切片间的骨骼没有相连,就导致一个BUG:当你通过代码移动骨骼位置或者旋转的时候,另外一个相邻的切片图骨骼不会跟着上去,因为是切片图分别给每个骨骼做的动画。所以我们要回到单张不切图(多图层图)上来解决这个问题,骨骼相连问题就是IK动力学。我们要最先学习一下基础psd图片的骨骼动画的创建https://wulang./article/details/126987971?spm=1001..3001.5502

今天要讲述一个非常重要的功能,骨骼动画比起帧动画来说它有一个非常重要的优点,中间值是无限插值生成的,也就是说可以通过多层动画器叠加来完成一个动作。举个栗子,在骨骼动画中你有一个走路动画,和一个跑步动画,但走路到跑步之间过度动画要怎么完成?用多层动画器并给俩层动画赋权重!这也是3D动画常用功能,当然我们现在只讲2D。

来骚年,说出你要完成的目标:

完成骨骼动画中石头怪的头和手骨骼随着敌人的方位,而旋转跟随移动。也就是让它检测到有敌人就,就一直用手指着它,用眼看着它。索敌感一下就来了好不好!

先来个不用多层动画器的错误示范(虽然是错误示范,但也有可学的知识与思路哇!)

以头和手骨骼随鼠标方向移动为例子:

(1)先关闭动画控制器Animator(后面会讲原因)

(2)新建脚本RotateToTarger(旋转指向目标),并拖动到这个物体上

using System.Collections;using System.Collections.Generic;using UnityEngine;public class RotateToTarget : MonoBehaviour{public float speed=1;//旋转速度private Vector2 direction;//获得本身指向目标的向量public Transform[] rotItems;//被旋转的骨骼组private void Update(){foreach (Transform t in rotItems)//遍历骨骼组{direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - t.position;//获得方向向量float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;//获得方向向量的夹角Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.forward);//获得夹角的旋转四元数t.rotation = Quaternion.Slerp(t.rotation, rotation, speed * Time.deltaTime);//缓慢旋转}}}

(3)拖动需要旋转的骨骼物体到脚本组件

运行结果:

(4)好,呈上问题!

来,我们打开动画控制器animator

一打开动画控制器,就不能控制骨骼旋转了,即动画限制了自己调整局部骨骼(非主骨骼)旋转参数,只能调整缩放参数

比较麻烦的解决方案:

首先,我们看一个特点,关闭动画控制器,调整好旋转局部骨骼角度(以头部骨骼为例),再打开动画控制器,查看效果:

注意:在idle动画里面没有设置局部骨骼的旋转动画;

头部旋转没有复原,我们可以理解局部骨骼动画是叠加在原来没动画控制器的物体上。

那么我们可以有这样一个思路:攻击动作,瞄准阶段关闭动画控制器,调整局部骨骼旋转。发射阶段打开动画控制器。以上都通过脚本完成。但是瞄准的时候身体没有起伏,感觉没有呼吸会很怪的,所以方案弃用。

正确示范(多层动画):

Unity3D之Mecanim动画系统学习笔记(八):Animator Layers(动画分层) - 阿诚de窝 - 博客园解决什么问题?动画分层可以用来解决什么样的问题呢?试想一下如果你要开发一款第三人称的射击游戏,那么肯定是希望身体的动画分为上下两部分,上方根据瞄准的位置和是否射击进行动画播放,下方根据移动播放动画。最/hammerc/p/4832637.html上面是3D人物模型动画分层,在2D中没有3D人物模型,不能用动画遮罩

开始

(1)创建旋转骨骼动画rotation,从起始位置旋转到头顶(上节课讲过如何录制骨骼动画)

图片中还分享了,如何快速创建起始状态帧方法,使用右键旋转-添加密匙(key关键帧,翻译问题)

(2)创建动画层重命名rotation Layer,赋权重1,并将这个rotation动画拖入到这个层中

(2)现在运行,我们发现旋转和呼吸(身体缩放)很好的融合在了一起

当然,第二层权重赋值0的时候,就是正常的idle动画

(3)骨骼瞄准索敌

关闭rotation的循环,让他播放一次后暂停到那个位置

现在,我们来看看第二层的权重与局部的骨骼旋转的关系

看到这想必你已经有思路了吧,没错,就是通过代码控制权重来控制角度,下面来简单的完成一个,随鼠标而旋转瞄准的局部手臂旋转,推荐先了解以下博文

Unity 角度与旋转(四元数与欧拉角)_心之凌儿的博客-CSDN博客_unity 四元数转欧拉角在Unity中,角度与旋转是一个比较复杂的事情,其实现方式也是有很多,但是使用的规则是比较复杂的,所以需要选择对应的方式来实现需要的效果一、Unity角度的表示方式在Unity中表示角度的方式主要有两种,四元数与欧拉角,两者的表示方式有很大的不同,需要深刻理解两者,才能更好的应用:四元数(Quaternion):四元数可用于表示GameObject的方向或旋转。该表示法内部包含四个数字(在Unity中称为x,y,z和w),但是这些数字并不表示角度或轴,因此通常不需要直接访问它们。除非您对四元./xinzhilinger/article/details/111469849?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166408130816800180657751%2522%252C%2522scm%2522%253A%25220713.130102334.pc%255Fall%255Fv2.%2522%257D&request_id=166408130816800180657751&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all_v2~first_rank_ecpm_v1~rank_v31_ecpm-1-111469849-null-null.142%5Ev50%5Econtrol_1,201%5Ev3%5Econtrol_1&utm_term=unity%E5%9B%9B%E5%85%83%E6%95%B0%E8%BD%AC%E6%8D%A2%E6%97%8B%E8%BD%AC%E8%A7%92%E5%BA%A6&spm=1018.2226.3001.4187

新建脚本SecondLayer,并拖到该物体下

using System.Collections;using System.Collections.Generic;using UnityEngine;public class SecondLayer : MonoBehaviour{private Animator ani;//动画控制器public float speed = 1;//旋转速度private Vector2 direction;//获得本身指向目标的向量public Transform goleTra;//目的获取初始的骨骼旋转,手臂骨骼拖入private float Tangle;//总角度private void Start(){ani = transform.GetComponent<Animator>();Tangle = 0-goleTra.rotation.z*180;//总旋转角,即手臂到头顶的旋转角度//rotation.z中范围为(-1,1)代表(-180度,到180度)竖直向上为0,顺时针旋转为负值,逆时针旋转为正值}// Update is called once per framevoid Update(){direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;//获得方向向量float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;//获得方向向量的夹角float rate = angle / Tangle;//获得两角比例Debug.Log(angle+" "+rate+" "+Tangle);ani.SetLayerWeight(1, rate);//赋值动画层权重;第一个参数为索引,第一层为0,第二层为1}}

把其中一条手臂拖入来获取初始旋转角

完成!查看成果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
Unity骨骼动画优化

Unity骨骼动画优化

2023-06-10

Unity 骨骼动画

Unity 骨骼动画

2021-08-21

Unity:骨骼动画

Unity:骨骼动画

2023-01-24

unity骨骼动画学习

unity骨骼动画学习

2020-03-26