Unity之动画和角色控制

news2024/12/24 2:05:37

目录

📕 一、动画

1.创建最简单的动画

2.动画控制器 

📕二、把动画和角色控制相结合 

📕三、实现实例

3.1 鼠标控制角色视角旋转

3.2 拖尾效果

📕四、混合动画


最近学到动画了,顺便把之前创建的地形(专栏第一篇文章)用上就形成了下面动图演示的效果,我给它取名为《绿洲大镖客之重生我是闪电侠》😋。


本篇内容讲解小编学到关于Unity动画的基本知识以及演示实例是如何实现的。

 当人物移动速度过快碰撞检测检测不到就会出现穿墙效果,不愧是闪电侠😃


 一、动画

Unity中关于动画的组件有两个,旧版动画组件Animation和新版动画组件Animator,这里我们讲解新版动画组件。

1.创建最简单的动画

新建一个立方体Cube,我们通过动画来让它实现向左和向右移动。给立方体挂载上新版动画组件Animator,然后新建一个动画器控制器,如下图所示:

我给这个动画器控制器命名为CubeController ,然后给它加到动画组件Animator中:


然后我们就可以实现向左向右的动画了,点击选中Cube ——>  窗口 ——> 动画 ——> 动画

这样创建动画的窗口就出来了我们点击创建按钮开始创建动画,小编给它取名为NewRight。

这就是我们创建好的动画文件,循环时间勾选上可以循环播放:


我们对NewRight文件进行编辑

  1. 点击选中Cube
  2. 点击添加属性
  3. 对应位置点击“+”

有了立方体的位置信息我们才能让它实现向左向右的运动:

这个面板就相当于进度条,白色竖线相当于进度条上的进度,竖着排的几个棱形是关键帧,当进度执行到此位置时要做出相应的动作。

 那怎么实现Cube的向右移动呢,我们通过一个动图来演示一下:

  1. 选中Cube方便观察运动
  2. 把白色竖线点到进度条结束
  3. 位置x的数值改为10,然后点击播放按钮

什么原理呢?进度条开始位置为0,结束位置为10,动画就为我们生成了从位置0到10的过程,向右运动的动画就被我们编辑好了。


关键帧我们也可以试一下:也是差不多的操作

  1. 白色竖线点到中间位置
  2. 点击添加关键帧按钮
  3. 修改位置信息数值改为0.09

形成的动画可以看到前半段几乎不动,后边才移动,由此可以看出关键帧的作用。 比如说我要去公司上班,整个动画就是家到公司的过程;但是我还要吃早餐,于是我加了关键帧,等我到达早餐店执行吃早饭的操作。


 向右移动的动画编辑好了向左运动的自然就会了吧,位置x的数值改为-10就实现了

创建新建新剪辑文件NewLeft,小编这里就不说了


2.动画控制器 

动画编辑好后我们来用它,双击我们之前创建好的动画器控制器CubeController,可以看到有很多大方块  ——  大方块叫做动画状态,每一个动画状态包含一个动画文件和其相关的设置。

Entry状态叫做入口状态,默认执行和箭头连接的动画,我们来编写脚本实现向右移动。创建脚本AnimatorTest挂载到Cube上:

public class AnimatorTest : MonoBehaviour
{
    private Animator animator;
    // Start is called before the first frame update
    void Start()
    {
        //获取动画器组件
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        //当点击鼠标左键播放  ——  NewRight
        if (Input.GetMouseButtonDown(0))
        {
            animator.Play("NewRight");
        }
    }
}

 关于动画的小实例我们就做好了,点击运行:最开始向左移动当点击鼠标左键变为向右移动

二、把动画和角色控制相结合 

角色是资源商店的免费角色,小编还给加了刚体和碰撞组件所以才会下落,先来看一下实现效果:

静止状态和跑步状态可以自由切换

先来导入一下免费资源,名称为Character Pack: Free Sample

 把最基础的人物模型加入场景里。

 同上面一样我们给人物模型挂载动画组件Animator,同时创建动画器控制器NewPlayerController把它挂到动画组件上,双击打开动画器控制器,这里我们用到静止(idle)和跑步(run)两个动作把它们拖到控制器里:

上面小编讲过Entry状态为入口状态,默认执行和箭头连接的动画 ,我们默认执行静止(idle)当人物移动时才会执行跑步(run)动画。

点击选中idle ——  右键  ——  设置为图层默认状态,这样默认执行动作就设置好了

选中idle ——  右键  ——  创建过渡,连接run动画,选中run ——  右键  ——  创建过渡,连接idle动画,这样两个动画就可以双向切换了。那怎么控制它们直接的切换呢?

我们来创建一个Bool类型的参数命名为isRun,通过true和false来控制动作之间的切换。

点击动画之间的过渡线,选中就会变为蓝色,点击添加到列表把创建好的Bool值加进来。

通过窗口面板可以看到当isRuntrue时就会由静止切换到跑步, 同样点击选中另一条过渡线把isRun改为false,表示当isRunfalse时就会由跑步切换到静止。

如果想让动画切换之间更为流畅可以把过渡退出时间取消勾选

 接下来编写脚本控制角色移动和动画之间的切换:

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

public class PlayerControl2 : MonoBehaviour
{
    //获取球体  ——  选中人,把球体拖到”目标“中
    public Transform target;
    //定义动画变量
    private Animator animator;
    // Start is called before the first frame update
    void Start()
    {
        //获取动画组件
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        //水平轴
        float horizontal = Input.GetAxis("Horizontal");
        //垂直轴
        float vertical = Input.GetAxis("Vertical");
        //向量
        Vector3 dir = new Vector3(horizontal, 0, vertical);

        //如果向量不等于空就证明我们按了方向键了
        if (dir != Vector3.zero)
        {
            //面向向量  按哪边朝向哪边,可以旋转
            transform.rotation = Quaternion.LookRotation(dir);
            //播放跑步动画
            animator.SetBool("isRun",true);
            //朝向前方移动    Time.deltaTime  ——  每帧换成每秒两米
            transform.Translate(Vector3.forward * 2 * Time.deltaTime);
        }
        //没有按方向键
        else
        {
            //播放站立动画
            animator.SetBool("isRun",false);
        }
        
        //随时获取test参数并打印出来
        //Debug.Log(animator.GetFloat("Test"));
    }
    ///下面的代码是小编做的其他练习,与此篇实例无关

    void leftFoot()
    {
        Debug.Log("leftFoot");
    }

    void rightFoot()
    {
        Debug.Log("rightFoot");
    }
    
    //IK(反向动力学) 写到这个方法内  
    private void OnAnimatorIK(int layerIndex)  // layerIndex 表示哪一个动画图层
    { 
        //设置头部IK
        animator.SetLookAtWeight(1);  //权重为1,表示生效
        //设置头部看向的位置
        animator.SetLookAtPosition(target.position);   //运行 头 就会看向球体
        
        //设置右手IK权重
        animator.SetIKPositionWeight(AvatarIKGoal.LeftHand,1);  //枚举类型:左手左脚,右手右脚
        //是否需要影响旋转权重
        animator.SetIKRotationWeight(AvatarIKGoal.LeftHand,1);
        //设置右手指向IK
        animator.SetIKPosition(AvatarIKGoal.LeftHand,target.position);
        //设置旋转
        animator.SetIKRotation(AvatarIKGoal.LeftHand,target.rotation);
    }
}

另外把摄像机摆好位置直接拖到人物里,这样人物和摄像机形成了一个整体就形成了第三人称操作视角。

把上面内容加入到我们创建好的地形中尽情奔跑吧 

三、实现实例

3.1 鼠标控制角色视角旋转

可以看到演示效果里还可以通过鼠标来控制角色视角的旋转,这是小编在这篇博客中学到的

Unity实现使用鼠标实现旋转Camera的功能_public class camerarot : monobehaviour { float _ro-CSDN博客文章浏览阅读1.1k次,点赞6次,收藏7次。Unity实现使用鼠标实现旋转Camera的功能_public class camerarot : monobehaviour { float _rotationx; float rotationy;https://blog.csdn.net/qq_17367039/article/details/111600909编写脚本CameraMovieManager挂载到人物上:

public class CameraMovieManager : MonoBehaviour
{
    float _rotationX;
    float rotationY;
    public float sensitivityHor = 5.0f;
    public float sensitivityVert = 5.0f;
    public float minimumVert = -45.0f;
    public float maximumVert = 45.0f;
    //是否可以控制旋转
    public bool CanControl = false;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        CameraRot();
    }
    
    void CameraRot()
    {
        if (CanControl)
        {
            //点击鼠标右键旋转摄像头
            if (Input.GetMouseButton(1))
            {
                rotationY = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityHor;
                _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
                _rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);
                transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
            }
        }
    }
}

勾选脚本上的 Control 就可以通过鼠标右键旋转人物视角了。

3.2 拖尾效果

我们都知道闪电侠奔跑后边会带着闪电,小编通过拖尾组件模仿这个效果(虽然很不像)

给人物添加拖尾组件TrailRenderer,时间表示拖尾形成后多长时间拖尾会消失,小编给拖尾加了一个烟雾的材质,颜色为橙红色,有拖尾开始到结束颜色渐变的作用。

四、混合动画

混合动画直接靠字面意思理解,就是两个或多个动画混在一起。 很多游戏中我们控制的角色都有快跑这一操作,比如操作方式是 W + Shift ,它是由走路变为跑步的过程,这就是通过混合动画来实现的。


在动画器窗口中右键  ——>  创建状态  ——>  从新混合树(翻译怪怪的)来创建混合树。 

双击创建好的混合树我们发现可以点进去,Test这里作为一个参数,意思是这个混合状态目前是以Test这个参数来进行混合的。当然我们也可以自己改其他的参数来用,为了方便演示小编这里新建了一个Blend参数。

我们来给混合树添加动画,添加运动域就是添加动画,下边的NewBlendTree是添加新的混合树,俗称无限套娃(doge.jpg)

我们把走路和跑步的动画添加进来就变成了这样,两个动画连在我们的混合树上。

 拖拽Blend改变其数值,下面动图演示一下混合动画走路到跑步的过渡。

如果我们想自己修改参数可以把AutomateThresholds取消勾选。

比如我们在套一个娃,新建一个状态树,里面在添加其他动作,凭自己的操作可以玩出花来

关于动画其实还有很多内容,小编也在持续学习中,本篇就先讲到这里,拜拜┏(^0^)┛

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1419093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp实现页面左滑右滑切换内容

uniapp uview&#xff1a;使用uniapp的swiper和uview的tabs标签组合实现 Tabs 标签 | uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架 vue <template> <view class"main"> <view class""> …

Spring中用Mybatis注解查询映射多个对象

1.映射写法如下 SelectProvider(type UserGroupMapper.class, method "getOrigins")Results({Result(property "id", column "id"),Result(property "groupId", column "groupId"),Result(property "resId&qu…

C#,打印漂亮杨辉三角形(帕斯卡三角形)的源代码

杨辉 Blaise Pascal 这是某些程序员看完会哭的代码。 杨辉三角形&#xff08;Yanghui Triangle&#xff09;&#xff0c;是一种序列数值的三角形几何排列&#xff0c;最早出现于南宋数学家杨辉1261年所著的《详解九章算法》一书。 欧洲学者&#xff0c;最先由帕斯卡&#x…

老龄化对投资意味着什么?

1月15日&#xff0c;国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措&#xff0c;为我国首个以“银发经济”命名的政策文件。 近期&#xff0c;国信证券分析师王开发布题为《银发经济再思考&#xff1a;老龄化对投资的影响》的报告&#xff0…

使用this调用兄弟构造器

在任意类的构造器中&#xff0c;都可以通过this(...)去调用该类的其他构造器。 假如说只给有参构造器传了两个参数&#xff0c;想让第三个参数有默认值&#xff0c;那么可以这样&#xff1a; 可以看出有一部分代码重复了&#xff0c;那么可以通过this()优化&#xff1a; 这样可…

202412读书笔记|《做自己的花》——走自己的路,成为自己的星星

202412读书笔记|《做自己的花》——走自己的路&#xff0c;成为自己的星星 《做自己的花&#xff08;微信读书联合出品&#xff09;》作者月芽&#xff0c;一个用画画和诗讲故事的插画师、诗人。 画风治愈&#xff0c;故事感强&#xff0c;擅长在童话般的故事中描绘现实温暖的心…

js实现贪吃蛇

文章目录 实现方法_11实现效果2 实现步骤2.1 移动场地2.2 游戏难度2.3 造蛇和食物2.4 蛇的移动2.5 产生食物的随机位置 3 全部代码 实现方法_21 实现效果2实现想法2.1 蛇的存储和显示2.2 蛇的移动(重难点)2.3 吃食物 3 完整代码 实现方法_1 1实现效果 2 实现步骤 html部分忽略…

酒鬼酒2024年展望:稳发展动能,迈入恢复性增长轨道

文 | 琥珀酒研社 作者 | 渡过 最近几个月来&#xff0c;白酒估值回落到近十年来低位&#xff0c;反映出了整个白酒行业的市场低迷和虚弱现状。不管是头部企业五粮液、泸州老窖&#xff0c;还是区域酒企口子窖、金种子酒等&#xff0c;最近都通过“回购”或“增持”&#xff0…

python之组合数据类型-列表

列表操作 列表增删改查列表增加元素的方法列表删除元素的方法列表修改元素的方法列表查找元素的方法 列表其他常用方法列表的切片用法列表修改排序的方法列表的常用符号、常用函数 列表是什么&#xff1f; 列表是有序集合&#xff0c;列表可以一次性存储几个或几万个元素&#…

【安装指南】HBuilder X 下载、安装详细教程

目录 &#x1f33a;1. 概述 &#x1f33b;2. HBuilder X 安装包下载 &#x1f33c;3. 安装详细教程 &#x1f33a;1. 概述 HBuilder X 是一款由DCloud开发的基于Electron框架的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Web和移动应用程序的开发。以下是…

表贴式PMSM的直接转矩控制(DTC)MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 表贴式PMSM的直接转矩控制(DTC),直接使用滞环控制对转矩和磁链进行控制&#xff0c;相对于传统的FOC控制而言&#xff0c;其不需要进行解耦变换&#xff0c;在此次的有以下几点需要注意&#xff1a…

uniCloud ---- JQL语法 连表查询

目录 JQL数据库操作 JQL流程图解 JQL的限制 单表查询 联表查询 新增 修改 删除 联表查询 例子 字段过滤field 字段别名as 限制查询记录的条数limit 只查一条记录getone JQL数据库操作 JQL&#xff0c;全称 javascript query language&#xff0c;是一种js方式操…

Chapter 8 - 1. Congestion Management in TCP Storage Networks

This chapter covers the following topics. 本章包括以下主题。 Understanding congestion in TCP storage networks. Detecting congestion in TCP storage networks. Traffic patterns with iSCSI and NVMe/TCP and correlation with network congestion. Preventing co…

Linux——文本编辑器Vim

Linux中的所有内容以文件形式管理&#xff0c;在命令行下更改文件内容&#xff0c;常常会用到文本编辑器。我们首选的文本编辑器是Vim&#xff0c;它是一个基于文本界面的编辑工具&#xff0c;使用简单且功能强大&#xff0c;更重要的是&#xff0c;Vim是所有Linux发行版本的默…

【项目设计】仿muduo实现高性能服务器组件

尊敬的玩家您好 系统检查到您的主线任务进展缓慢 请您不要过度沉迷日常任务&#xff0c;尽快完成您的主线任务 请勿在npc身上浪费太多时间&#xff0c;避免影响玩家自身情绪 《地球Online》祝您游戏愉快 文章目录 一、实现目标1. 项目定位2. Reactor模式 二、前置知识1. C11的b…

【数据分析】numpy基础第一天

文章目录 前言本文代码&#xff1a;使用jupyter notebook打开本文的代码操作示例步骤1.打开Anaconda Powershell Prompt步骤2.复制代码文件地址步骤3.在Anaconda Powershell Prompt中打开jupyter notebook步骤3.5.解决一个可能的问题步骤4.在浏览器中查看ipynb文件步骤5.运行代…

【面试深度解析】哔哩哔哩后端面试:JDK 集合源码、线程状态及转换、Future和CompletableFuture、JVM生产命令(下)

欢迎关注公号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 文中所有相关面试资料可从公号领取 文章导读地址&#xff1a;点击查看文章导读&#xff01; 感谢你的关注&#xff01; 前言&…

Android创建工程

语言选择Java&#xff0c;我用的Java 最小SDK&#xff1a;就是开发的APP支持的最小安卓版本 Gradle 是一款Google 推出的基于 JVM、通用灵活的项目构建工具&#xff0c;支持 Maven&#xff0c;JCenter 多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml 文件&#xff0c;转而…

【JaveWeb教程】(32)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(5)文件上传的实现

目录 SpringBootWeb案例052. 文件上传2.1 简介2.2 本地存储 SpringBootWeb案例05 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能&#xff0c;还有两个需要实现新增和修改员工。 本节的主要内容&#xff1a; 文件上传 2. 文件上传 在我们完成…