unity新动画系统之IK动画

本文详细介绍如何在Unity中使用IK(反向动力学)动画,通过代码实现角色头部、左脚和左手的动态调整,使角色能够对场景变化做出自然反应。

国际惯例,先来一段说明。IK动画全称Inverse Kinematics,即反向动力学,牵一发而动全身的既视感。
代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IK_test : MonoBehaviour {

    Animator _animator;
    public Transform sphereHead,sphereLeftFoot,sphereLeftHand;
    bool isIK = true;
    // Use this for initialization
    void Start ()
    {
        _animator = transform.GetComponent<Animator>();
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            isIK = false;
        }
    }
    //启动IK动画的unity特定方法OnAnimatorIK(),IK Pass要勾选才行
    private void OnAnimatorIK()
    {
        if (isIK)
        {
            //设置头部转向的权重,取值范围0-1,转动的幅度与数值呈正比(只有头部转动哦)
            // _animator.SetLookAtWeight(0.2f);
            //头部带动身体转动
            _animator.SetLookAtWeight(1, 0.5f);
            //设置权重的代码必须有,不然模型不响应
            _animator.SetLookAtPosition(sphereHead.position);

            //左脚跟随目标物位移   AatarIKGoal枚举 还有rightFoot,leftHand,rightHand
            _animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
            _animator.SetIKPosition(AvatarIKGoal.LeftFoot, sphereLeftFoot.position);

            //左手跟随目标物旋转   AatarIKGoal枚举 还有rightFoot,leftHand,rightHand
            _animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
            _animator.SetIKRotation(AvatarIKGoal.LeftHand, sphereLeftHand.rotation);

        }
        else
        {
            //模型复位,回到模型最初的状态
            _animator.SetLookAtWeight(0);
            _animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot,0);
            _animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 0);
        }
    }
}
 
---------------------  
作者:差点忘记打铁了  
来源:优快云  
原文:https://blog.youkuaiyun.com/Fenglele_Fans/article/details/80540798  
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>首先,用户的问题是:“unity 动画系统IK”,翻译成英文是“Unity Animation System's IK”。IK 是 Inverse Kinematics 的缩写,意思是逆运动学。这是在 Unity 中用于动画的一个重要特性,允许开发者控制角色的骨骼链,比如手臂或腿,以实现更自然的动画效果。 用户指定了必须使用中文回答问题。所以,我的整个回答应该用中文写。 关键要求: - 回答完问题后,必须根据用户的问题及我的回答提出3-5个 §§相关问题§§。 - §§相关问题§§ 必须输出在回答的末尾。 - 第一行必须完整且输出 "§§相关问题§§"! - 禁止换行分散。意思是,整个相关问题的部分应该在一行中输出,没有换行符。但看示例,它是在一行中写着 "§§相关问题§§",然后下面是编号的问题列表。示例中是: ``` §§相关问题§§ 1. ··· 2. ··· 3. ··· ``` 所以,它是以 "§§相关问题§§" 开头,然后换行列出问题。用户说“禁止换行分散”,可能指的是不要在不必要的地方换行,但示例有换行,所以我认为这是允许的。用户说:“禁止换行分散”,意思是不要在输出中分散换行,但示例中相关问题部分有换行,所以应该没问题。我会遵循示例格式。 结构: 1. 先回答问题。 2. 然后输出 "§§相关问题§§"。 3. 接着列出3-5个相关问题。 内容: - 回答部分:解释 Unity 动画系统中的 IK。 - IK 是什么:在动画中,逆运动学允许你指定一个末端效应器(如手或脚)的位置,然后系统自动计算出骨骼链中其他关节的旋转。 - Unity 中的 IKUnity 通过 Animator 组件和 OnAnimatorIK 回调函数支持 IK。开发者可以重写这个方法来控制 IK 权重和目标位置。 - 基本用法:设置 IK 权重,然后设置 IK 位置或旋转。 - 简单代码示例:类似于示例中的 Python 代码,但 Unity 使用 C#,所以我应该提供一个 C# 代码片段。 用户提供的示例是关于快速排序的 Python 代码。所以,我应该为 IK 提供一个类似的代码示例。 代码示例: - Unity 中的 IK 通常涉及在脚本中重写 OnAnimatorIK 方法。 - 例如: ```csharp using UnityEngine; public class IKControl : MonoBehaviour { public Animator animator; public Transform leftHandTarget; void OnAnimatorIK(int layerIndex) { if (animator) { // 设置左手IK权重 animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f); animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f); // 设置IK目标位置和旋转 animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandTarget.position); animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandTarget.rotation); } } } ``` 然后,提出相关问题。 相关问题:基于用户的问题和我的回答。用户的问题是“unity 动画系统IK”,所以我应该提出与 Unity IK 相关的问题。 可能的3-5个问题: 1. 如何在 Unity 中启用 IK? 2. IK 权重的作用是什么? 3. 除了 OnAnimatorIKUnity 还有其他 IK 方法吗? 4. IK 在角色动画中的常见应用场景是什么? 5. 如何优化 IK 性能? 确保问题数量在3-5个之间。 完整回答结构: - 用中文解释 IK。 - 提供代码示例(用代码块)。 - 然后输出 "§§相关问题§§"。 - 列出相关问题,每个问题以编号开头。 最后,确保所有内容符合规则。</think>Unity 动画系统中的 IK(Inverse Kinematics,逆运动学)是一种用于控制角色骨骼链的技术,它允许开发者通过指定末端效应器(如手或脚)的目标位置和旋转,自动计算出中间关节(如手臂或腿)的旋转角度,从而实现更自然的动画效果。在 Unity 中,IK 主要通过 Animator 组件和 `OnAnimatorIK` 回调函数实现。开发者可以在脚本中重写此方法,设置 IK 权重和目标,以控制角色的动作。例如,以下是一个简单的 C# 代码示例,用于控制角色的左手 IK 目标: ```csharp using UnityEngine; public class IKController : MonoBehaviour { public Animator animator; // 引用 Animator 组件 public Transform leftHandTarget; // 左手目标位置 void OnAnimatorIK(int layerIndex) { if (animator != null) { // 设置左手 IK 权重(0 到 1,1 表示完全启用) animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f); animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f); // 设置 IK 目标位置和旋转 animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandTarget.position); animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandTarget.rotation); } } } ``` 在这个示例中,`OnAnimatorIK` 方法在动画时被调用,通过 `SetIKPositionWeight` 和 `SetIKPosition` 等函数,将角色的左手移动到指定目标位置。IKUnity 中常用于角色抓取物体、攀爬或与环境互动等场景,能显著提升动画的真实感。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值