【unity游戏开发入门到精通——动画篇】Animator反向动力学(IK)

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇

  • 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的同学入门。
  • 【unity通用篇】:主要讲解unity的基础通用的知识,包括unity界面、unity脚本、unity资源管理、unity动画、unity摄像机等,适合unity初学者入门。
  • 【unity3D篇】:主要讲解unity3D的知识,unity3D角色、unity3D物理系统、unity3D光照等,适合只想做2D游戏的开发者学习。
  • 【unity2D篇】unity2D篇:主要讲解unity2D的知识,包括unity2D角色、unity2D物理系统、unity2D光照等,适合只想做3D游戏的开发者学习。

这样方便大家按需选择性的去学习,比如有编程基础的大概率可以直接从unity通用篇开始入门,没有编程基础的建议从C#篇开始学习。只想做2D游戏的话,可以直接从unity2D篇开始学习,3D篇大概率就不需要看了,节约学习时间成本。

文章目录

什么是反向动力学(IK)

一般我们都是通过父节点来调动子节点运动,而在实际开发过程中,有时候我们需要子节点带动父节点进行相应的动作。这种情况就是反向动力学

用我们人体举例子,当我们拿起一个杯子的时候是用手掌去拿,以杯子为参照物,我们移动杯子的位置,手臂会随着杯子一起移动。用父子骨骼理解的话就是子带动了父。

IK反向动力学控制对于我们的意义

  • 让我们的人物模型的胳膊一直指向某一个物体(在不需要动画的前提下),拾取某一件物品
  • 设置人物头部一直看向某个位置
  • 人物走路踩到了石头,就需要由脚的子节点带动全身骨骼做出踩到石头的响应
  • 例如刺客信条,手部带动身体的爬行
  • 比如跳跃到某个位置
  • 持枪或持弓箭瞄准某一个对象等

为什么能实现IK?

首先我们要知道人的模型是由以节点模型为基础搭建而成的,通过反向动力学,我们可以调动节点来实现人物模型的运动。

比如让手臂指向某一个物体a:我们调用反向动力学,使得手臂的手掌节点指向物体a,然后手掌节点调动关节节点再调用肩膀处的节点,实现整个手臂指向物体a。

如何进行IK控制

在状态机的层级设置中开启 IK 通道。

继承MonoBehavior的类中,Unity定义了一个IK回调函数:OnAnimatorIK,我们可以在该函数中调用Unity提供的IK相关API来控制IK。

csharp 复制代码
private void OnAnimatorIK(int layerIndex)
{
    // 在这里进行IK控制的代码
}

Animator中的IK相关API:

csharp 复制代码
// 设置头部IK权重
animator.SetLookAtWeight(1, 1f, 1f);
// 设置头部IK看向位置
animator.SetLookAtPosition(pos.position);
// 设置IK位置权重
animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
// 设置IK旋转权重
animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);
// 设置IK对应的位置
animator.SetIKPosition(AvatarIKGoal.RightFoot, pos2.position);
// 设置IK对应的角度
animator.SetIKRotation(AvatarIKGoal.RightFoot, pos2.rotation);

简单的使用

游戏人物盯着某个游戏对象看,来达到时刻注视的效果。

创建一个位置变量来承接后面我们获取的要指向或看向的游戏物体的坐标

csharp 复制代码
//目标物体位置
public Transform target;

脚本绑定要看的物体

打开IK开关

游戏人物盯着某个游戏对象看,来达到时刻注视的效果

csharp 复制代码
public class ManScript : MonoBehaviour
{
    //目标物体位置
    public  Transform target;
    private Animator animator;
    
    void Start()
    {
        animator = GetComponent<Animator>();
    }
    
    void Update() {}

    // 特定方法 layerIndex:我们控制第几层的IK
    void OnAnimatorIK(int layerIndex)
    {
        //设置头部IK权重
        animator.SetLookAtWeight(1);
        //设置头部看向的位置
        animator.SetLookAtPosition(target.position);
    }
}

效果

更复杂一点,就是让身体右手也跟着注释的对象移动或摆动

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ManScript : MonoBehaviour
{
    //目标物体位置
    public  Transform target;
    private Animator animator;
    
    void Start()
    {
        animator = GetComponent<Animator>();
    }
    
    void Update()
    { }

    // 特定方法 layerIndex:我们控制第几层的IK
    void OnAnimatorIK(int layerIndex)
    {
        //设置头部IK权重
        animator.SetLookAtWeight(1);
        //设置头部看向的位置 后面还有
        animator.SetLookAtPosition(target.position);

        //设置右手IK
        animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
        //设置右手旋转权重
        animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);
        //设置右手指向物体
        animator.SetIKPosition(AvatarIKGoal.RightHand, target.position);
        animator.SetIKRotation(AvatarIKGoal.RightHand, target.rotation);
    }
}

效果


专栏推荐

地址
【零基础入门unity游戏开发------C#篇】
【零基础入门unity游戏开发------unity通用篇】
【零基础入门unity游戏开发------unity3D篇】
【零基础入门unity游戏开发------unity2D篇】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

相关推荐
一念&3 分钟前
每日一个C语言知识:C 头文件
c语言·开发语言·算法
DARLING Zero two♡1 小时前
仓颉GC调优参数:垃圾回收的精密控制艺术
开发语言·仓颉
白雪公主的后妈1 小时前
Auto CAD二次开发——多边形多段线
c#·cad二次开发·多边形
今日说"法"1 小时前
Rust探秘:所有权转移在函数调用中的表现
开发语言·后端·rust
java1234_小锋1 小时前
PyTorch2 Python深度学习 - 自动微分(Autograd)与梯度优化
开发语言·python·深度学习·pytorch2
Python私教2 小时前
C 语言运算符全景:从入门到进阶
c语言·开发语言·网络
csbysj20203 小时前
Perl 格式化输出
开发语言
tao3556673 小时前
【Python刷力扣hot100】42. Trapping Rain Water
开发语言·python·leetcode
2501_938782094 小时前
《UE4 蓝图基础:蓝图编辑器打开与节点连接的核心逻辑》
编辑器·ue4
消失的旧时光-19434 小时前
Kotlin 协程最佳实践:用 CoroutineScope + SupervisorJob 替代 Timer,实现优雅周期任务调度
android·开发语言·kotlin