Unity之动画和角色控制

目录

📕 一、动画

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 updatevoid Start(){//获取动画器组件animator = GetComponent<Animator>();}// Update is called once per framevoid Update(){//当点击鼠标左键播放  ——  NewRightif (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 updatevoid Start(){//获取动画组件animator = GetComponent<Animator>();}// Update is called once per framevoid 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 表示哪一个动画图层{ //设置头部IKanimator.SetLookAtWeight(1);  //权重为1,表示生效//设置头部看向的位置animator.SetLookAtPosition(target.position);   //运行 头 就会看向球体//设置右手IK权重animator.SetIKPositionWeight(AvatarIKGoal.LeftHand,1);  //枚举类型:左手左脚,右手右脚//是否需要影响旋转权重animator.SetIKRotationWeight(AvatarIKGoal.LeftHand,1);//设置右手指向IKanimator.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 updatevoid Start(){}// Update is called once per framevoid 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.mzph.cn/news/652788.shtml

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

相关文章

go语言数组和切片

1. 数组Array Golang Array和以往认知的数组有很大不同。 1. 数组&#xff1a;是同一种数据类型的固定长度的序列。2. 数组定义&#xff1a;var a [len]int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且是类型的组成部分。一旦定义&…

Redis3-秒杀活动

秒杀 准备工作 我是参照下面这位大佬的i骄傲成下载的 csdn友情链接 Jmeter模拟多线程的压力测试工具 秒杀代码&#xff1a; package com.aaa.controller;import io.netty.util.internal.StringUtil; import org.apache.commons.lang.StringUtils; import org.springfram…

appsmith安装手记:2.安装Docker compose

方法一&#xff1a;Install using the repository sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 在安装Docker 已经吃过了亏&#xff0c;所以已经修改成阿里云的镜像。 yum-config-manager --a…

【大数据】详解 Flink 中的 WaterMark

详解 Flink 中的 WaterMark 1.基础概念1.1 流处理1.2 乱序1.3 窗口及其生命周期1.4 Keyed vs Non-Keyed1.5 Flink 中的时间 2.Watermark2.1 案例一2.2 案例二2.3 如何设置最大乱序时间2.4 延迟数据重定向 3.在 DDL 中的定义3.1 事件时间3.2 处理时间 1.基础概念 1.1 流处理 流…

深度推荐模型之DeepFM

一、FM 背景&#xff1a;主要解决大规模稀疏数据下的特征组合遇到的问题&#xff1a;1. 二阶特征参数数据呈指数增长 怎么做的&#xff1a;对每个特征引入大小为k的隐向量&#xff0c;两两特征的权重值通过计算对应特征的隐向量内积 而特征之间计算点积的复杂度原本为 实际应…

javascript分解器

javascript分解器 //split into array of strings. var str "Well, how, are , we , doing, today"; var res str.split(",");

幻兽帕鲁的搭建和幻兽帕鲁需要什么配置的服务器

前言 大家好&#xff0c;今天教大家如何快速搭建幻兽帕鲁&#xff0c;并能满足8-32人游玩 第一步 购买服务器 1.CPU&#xff1a;4核&#xff08;最低需要4核起&#xff0c;当然可以选择更高的&#xff09;CPU的选择更看重单核性能&#xff0c;尽量选择主频2.5GHz以上的&#…

python3-cookbook-字典中的键映射多个值

第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典。大多数情况下使用这些数据结构是很简单的。但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题。 因此,这一章的目的就是讨论这些比较常见的问题和算法。 另外,我们也会…

嵌入式C语言--#pragma指令

嵌入式C语言–#pragma指令 嵌入式C语言--#pragma指令 嵌入式C语言--#pragma指令一. pragma预处理指令概念二. pragma预处理指令的作用三. 预处理指令的参数1&#xff09;message参数2&#xff09;code_seg参数3&#xff09;once参数4&#xff09;pack参数5&#xff09; section…

OpenTCS IDEA 全流程搭建和运行指南

OpenTCS IDEA 全流程搭建和运行指南 JDK安装下载JDK版本 openTCS源码下载IDEA 打开运行查看下载源码中gradle版本号下载gradle 二进制文件配置IDEA Gradle本地仓库IDEA打开openTCS项目运行顺序 JDK安装 下载JDK版本 JDK网址 注意&#xff1a; 请下载官方文档标准的java13JDK o…

paddle 动态图命名重复问题

引言 具体场景是这样的,我用ai studio提供的notebook跑动态图代码,第一遍正常,第二遍的时候就报参数名称已存在,虽然我也知道这是notebook存储之前的参数变量引起的,只需要重启再运行就可以了。但是重启代价太高了,尤其是前面已经写了很多代码,而我只是想测试这一个cell…

4G模块Air724如何访问天气信息

1.这是获得json数据&#xff1a; 左边是标准官方api说明中的&#xff0c;右边是我用串口获取的&#xff1a; 2.首先找一个天气服务器&#xff0c;我的&#xff1a;YY天气&#xff0c;直接百度&#xff0c;注册&#xff0c;然后找api即可&#xff1a; 3.用接口工具测试接口是否…

AV Foundation 视频播放中的可视拖拽进度条

引言 在视频播放软件中&#xff0c;通过拖拽进度条来调整播放进度几乎已成为不可或缺的功能。这一功能使用户能够精确指定视频播放的时间点。近年来&#xff0c;视频播放器在原有的拖拽进度条基础上进行了更加人性化的性能提升&#xff0c;引入了可视化拖拽条。这一创新为用户…

如何利用 chatgpt 提高查询效率

问 chatgpt 问题&#xff1a; 如何利用chatgpt 提高工作效率 chatgpt回答 利用ChatGPT可以提高工作效率的方法有很多。以下是一些建议&#xff1a;1. 自动化任务&#xff1a;将一些重复性的任务自动化&#xff0c;让ChatGPT代替你完成。 例如&#xff0c;你可以编写脚本来处理…

Ps:根据 HSB 调色(以可选颜色命令为例)

在数字色彩中&#xff0c;RGB 和 HSV&#xff08;又称 HSB&#xff09;是两种常用的颜色表示方式&#xff08;颜色模型&#xff09;。 在 RGB 颜色模式下&#xff0c;Photoshop 的红&#xff08;Red&#xff09;、绿&#xff08;Green&#xff09;、蓝&#xff08;Blue&#xf…

Spring Boot参数校验方案

NotNull&#xff1a;值不能为null&#xff1b;NotEmpty&#xff1a;字符串、集合或数组的值不能为空&#xff0c;即长度大于0&#xff1b;NotBlank&#xff1a;字符串的值不能为空白&#xff0c;即不能只包含空格&#xff1b;Size&#xff1a;字符串、集合或数组的大小是否在指…

基于SpringBoot微信小程序的宠物美容预约系统设计与实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容&#xff1a;SpringBoot、Vue、SSM、HLM…

rabbitmq基础-java-3、Fanout交换机

1、简介 Fanout&#xff0c;英文翻译是扇出。 2、 特点 1&#xff09; 可以有多个队列 2&#xff09; 每个队列都要绑定到Exchange&#xff08;交换机&#xff09; 3&#xff09; 生产者发送的消息&#xff0c;只能发送到交换机 4&#xff09; 交换机把消息发送给绑定过的…

React16源码: React中commit阶段的commitAllLifeCycles的源码实现

commitAllLifeCycles 1 &#xff09;概述 在 react commit 阶段的 commitRoot 第三个 while 循环中处理了生命周期相关的一些内容它这个方法的名字叫做 commitAllLifeCycles 2 &#xff09;源码 定位到 packages/react-reconciler/src/ReactFiberScheduler.js#L479 查看 co…

应用机器学习的建议

一、决定下一步做什么 在你得到你的学习参数以后&#xff0c;如果你要将你的假设函数放到一组新的房屋样本上进行测试&#xff0c;假如说你在预测房价时产生了巨大的误差&#xff0c;你想改进这个算法&#xff0c;接下来应该怎么办&#xff1f;实际上你可以考虑先采用下面的几种…