animator animation

本文详细介绍了Unity中的动画系统,包括Animator和Animation的区别与应用。讲解了导入不同类型的FBX文件到Unity中的效果,如可修改的Animation和不可修改的关键帧。还涉及Humanoid动画系统,强调了Avatar和IK在新版动画系统中的重要性。此外,文章讨论了骨骼绑定、蒙皮模型的创建过程,以及如何使用IK进行精确控制。最后,提到了Apply Root Motion的用法和动画状态机的配置技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

================================================animation==================================================

==animation==2016.11.06


从其他美术软件导入到unity 的有3种
一种是导入animation(可修改但需先创建animation控件。然后放进去)(可以改关键帧)===提供可修改动作
一种是导入带白色框的prefab(可拉到场景   代码增加事件 不能改关键帧)含单个动作和模型但是没颜色===提供动作和动作预览
一种是导入带白色框的prefab(可拉到场景   代码增加事件 不能改关键帧)含所有动作合成和模型但是有颜色====主要物体引用以上两个动作,所有

的动作合成可以拆分

legacy
带白色框,不含avatar,含颜色,所有动作
带白色框,不含avatar,不含颜色,带单个动作
一个含颜色和所有动作,一个含拆分后的单个动作,利用率低

修改animation的事件会影响所有共用animation的物体
prefab类可以直接在prefab上看动作
打开animation窗口可以对带animation旧控件的物体修改
大部分animation可以公用通用。主要看放入animation后里面是否有对应的节点

如果在animation新增clip(animation),那么会自动生成animator和animation

================================================animator==================================================
human
使用新的动画human可以减少avatar,可用复用AC,可以IK
带白色框的prefab,含avatar,含颜色
n个带白色框的prefab,不含avatar,不含颜色,含动作
一个含avatar和颜色,一个含动作,最大利用率
================================================总结==================================================
新版和旧版的区别。作用。好处。新版怎么换成旧版,旧版怎么换成新版
1运动重定向2过度动画预览
新版旧版修改。不需要改动美术资源
重定向和IK功能只能用于hunman
公用animation control 不共用 avatar

================================================建模==================================================
骨骼绑定和蒙皮的人形模型---
1建立模型--一般由一组多边形或三角形组成
2骨骼绑定--创建骨骼关节层级(定义了网格内部的骨骼结构及其相互运动的关系)
3关联皮肤--蒙皮(通过关节的动画来控制特定网格的运动)

================================================总结==================================================
一般来说fbx包含了模型和动画
放进去unity里面之后在rig里面可以选择动画的状态:none,Legacy,geneic,hunman
选Legacy之后又可以选择动画存储的地方

 Store in Original Roots    存储在原始根对象中动画存储在动画包的根对象中(这可能与Unity中的根对象不同)。
 Store in Nodes    存储在节点中动画与对象存储在一起。当你有一个复杂的动画设置,并希望有完整的脚本控制时使用此选项。
 Store in Root     存储在根对象中动画存储在场景的变换根对象中。当动画驱动的是有层级结构的物体时使用此选项。

选genius和human可以 选择动画适用于哪个对象 avatar
引用其他avatar 还是自己创建avatar

================================================IK==================================================
==init
 avatar.SetIKPositionWeight(AvatarIKGoal.RightHand,0);//pos权重
 avatar.SetIKRotationWeight(AvatarIKGoal.RightHand,0);//rota权重
 avatar.SetLookAtWeight(0.0f);//lookAt权重
 bodyObj.position = avatar.bodyPosition;//身体位置
 bodyObj.rotation = avatar.bodyRotation;//身体rota
 rightHandObj.position = avatar.GetIKPosition(AvatarIKGoal.RightHand);
 rightHandObj.rotation  = avatar.GetIKRotation(AvatarIKGoal.RightHand);
 lookAtObj.position = avatar.bodyPosition + avatar.bodyRotation * new Vector3(0,0.5f,1);



 
==身体,眼睛,四肢,除了眼睛不要rotation其他都要pos和rota
==主要方法
SetIKPosition(AvatarIKGoal.RightHand,pos)
SetIKRotation(AvatarIKGoal.RightHand,rotat)
SetLookAtPosition(pos)

 SetIKPositionWeight(AvatarIKGoal.RightHand,1)
 SetIKRotationWeight(AvatarIKGoal.RightHand,1)
 SetLookAtPositionWeight(1)

例如右手,他有pos和rota,rota的旋转是关节的旋转,pos在关节的移动
void OnAnimatorIK(int layerIndex)

 ==================================MatchTarget===============
用于旋转角色和攀山
==================================apply root motion ============

=========
apply root motion false
那么动作的位移不会影响到人物,由脚本控制handled by script
void OnAnimatorMove()
{
controller.Move(avatar.deltaPosition);
transform.rotation = avatar.rootRotation;//setfloat里面让状态树改变人物方向,然后根据方向来改人物旋转
       }
              或者直接设置rotation不经过动作
=========
apply root motion true
那么动作的位移会影响到人物
 ==================================总结======================================

    Update Mode:更新模式:Normal表示使用Update进行更新,Animate Physics表示使用FixUpdate进行更新(一般用在和物体有交互的情况下),

Unscale Time表示无视timeScale进行更新(一般用在UI动画中)。
    Culling Mode:剔除模式:Always Animate表示即使摄像机看不见也要进行动画播放的更新,Cull Update Transform表示摄像机看不见时停止动

画播放但是位置会继续更新,Cull Completely表示摄像机看不见时停止动画的所有更新。


    首先,我们发现的是3个默认的状态,这些状态是Unity自动帮我们创建的同时也无法删除:
        Entry:表示当进入当前状态机时的入口,该状态连接的状态会成为进入状态机后的第一个状态;
        Any State:表示任意的状态,其作用是其指向的状态是在任意时刻都可以切换过去的状态;
        Exit:表示退出当前的状态机,如果有任意状态指向该出口,表示可以从指定状态退出当前的状态机;
   
    线条中有一个勾选项Has Exit Time
    我们勾选了该项,在动画转换时会等待当前动画播放完毕才会转换到下一个动画,如果当前动画是循环动画会等待本次播放完毕时转换,所以对于

需要立即转换动画的情况时记得要取消勾选

    当我当前的动画播放完毕后就自动转换到箭头所指的下一个状态(没有其他跳转条件),此时必须勾选该选项,否则动画播放完毕后就会卡在最后

一帧,如果是循环动画就会一直循环播放。

     solo为一定切换到该状态
    mute为不能够切换到该状态
    animation包含animationState包含animationClip包含animationEvent
    animator包含animationStateInfo

    过渡为从一个动画切换到另外一个动画。中间不能逗留
    混合数为两个动画的叠加。可以在中间逗留

     cycle offset为播放偏移

layer包含状态机包含状态
状态机可以包含子状态机
=========================中文手册
http://www.ceeger.com/Components/FBXImporter-Model.html ;
 
================================================end==================================================
public WorkspaceRevealAnim(Launcher launcher, boolean animateOverviewScrim) { prepareToAnimate(launcher, animateOverviewScrim); ResourceProvider rp = DynamicResource.provider(launcher); mScaleStart = rp.getFloat(R.dimen.swipe_up_scale_start); Workspace<?> workspace = launcher.getWorkspace(); workspace.setPivotToScaleWithSelf(launcher.getHotseat()); // Add reveal animations. addRevealAnimatorsForView(workspace, WORKSPACE_SCALE_PROPERTY); addRevealAnimatorsForView(launcher.getHotseat(), HOTSEAT_SCALE_PROPERTY); // Add overview scrim animation. if (animateOverviewScrim) { PendingAnimation overviewScrimBuilder = new PendingAnimation(DURATION_MS); launcher.getWorkspace().getStateTransitionAnimation() .setScrim(overviewScrimBuilder, NORMAL, new StateAnimationConfig()); mAnimators.play(overviewScrimBuilder.buildAnim()); } // Add depth controller animation. if (launcher instanceof QuickstepLauncher) { PendingAnimation depthBuilder = new PendingAnimation(DURATION_MS); DepthController depth = ((QuickstepLauncher) launcher).getDepthController(); depth.setStateWithAnimation(NORMAL, new StateAnimationConfig(), depthBuilder); mAnimators.play(depthBuilder.buildAnim()); } // Add sysui scrim animation. mAnimators.play(launcher.getRootView().getSysUiScrim() .getSysUIMultiplier().animateToValue(0f, 1f)); mAnimators.setDuration(DURATION_MS); mAnimators.setInterpolator(Interpolators.DECELERATED_EASE); mAnimators.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationCancel(Animator animation) { super.onAnimationCancel(animation); Log.d(TAG, "onAnimationCancel"); } @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); Log.d(TAG, "onAnimationEnd: workspace alpha = " + workspace.getAlpha()); } }); } 这是什么意思
最新发布
08-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值