当前位置: 首页 > news >正文

unity学习39:连续动作之间的切换,用按键控制角色的移动

目录

1 不同状态之间的切换模式

1.1 在1个连续状态和一个连续状态之间的transition,使用trigger

1.2 在2个连续状态之间的转换,使用bool值切换转换

2  至少现在有2种角色的移动控制方式

2.1  用CharacterController 控制角色的移动

2.2 用animator1 控制角色移动

2.3 共同特点, WASD键盘控制可以通过这2个轴形成的向量的方法实现

3 代码控制移动动画的播放

3.1 检测WASD移动,用轴向量的代码实现

3.2 按键改变面向

3.3  播放动画

3.4 移动

3.5 Animator的设置

3.5.1 动作状态的设置

3.5.2 设置好新的参数

3.5 完整代码

3.6 小心难缠的BUG


1 不同状态之间的切换模式

  • 1个连续状态和一个连续状态之间的transition,使用trigger触发那个一次性状态即可
  • 2个连续状态之间的转换,使用bool值,在2个连续状态之间进行转换

1.1 在1个连续状态和一个连续状态之间的transition,使用trigger

  • 不勾选wave参数时,始终执行run 
  • 勾选了wave参数时,相当于满足了一次 wave的trigger触发条件
  • 可以看到会执行一次wave动作
  • 使用trigger来触发单次的动作

1.2 在2个连续状态之间的转换,使用bool值切换转换

  • 2个连续状态之间的转换
  • 因为2个状态都是连续的,所以任何一个状态都能持续
  • 使用bool值,在2个连续状态之间进行转换

2  至少现在有2种角色的移动控制方式

  • 角色控制器 CharacterController
  • 控制角色的移动动画  Animator

2.1  用CharacterController 控制角色的移动

  • 需要角色上有CharacterController 的component

   

    private CharacterController player1;

    player1=GetComponent<CharacterController>();

void Update()

    {

        //水平轴

        float horizontal=Input.GetAxis("Horizontal");

        //垂直轴

        float vertical=Input.GetAxis("Vertical");

        //创建成一个方向向量

        Vector3 dir1=new Vector3(horizontal,0,vertical);

        Debug.DrawRay(transform.position,dir1,Color.red);

        //

        player1.SimpleMove(dir1);

        //player1.transform.Translate(dir1*2.0f*Time.deltaTime);

        player1.Move(dir1*moveSpeed*Time.deltaTime);

    }

}

2.2 用animator1 控制角色移动

  • 需要角色上有animator的component
  • animator 吧动画state设置好
  • 且角色模型有不同的动作

    private Animator animator1;
     animator1=GetComponent<Animator>();

void Update()

    {

        float horzontal=Input.GetAxis("Horizontal");

        float vetical=Input.GetAxis("Vertical");

        Vector3 dir1=new Vector3(horzontal,0,vetical);

        Debug.DrawRay(transform.position,dir1,Color.red);

       

        //如果按下了移动按键

        if(dir1 != Vector3.zero)

        {

            //面向向量

            transform.rotation=Quaternion.LookRotation(dir1);

            //播放跑步动画
            animator1.SetBool("IsRun",true);
            //朝着面向的前方移动
            //transform.Translate(Vector3.forward*2*Time.deltaTime);

2.3 共同特点, WASD键盘控制可以通过这2个轴形成的向量的方法实现

        float horzontal=Input.GetAxis("Horizontal");

        float vetical=Input.GetAxis("Vertical");

        Vector3 dir1=new Vector3(horzontal,0,vetical);

3 代码控制移动动画的播放

3.1 检测WASD移动,用轴向量的代码实现

float horzontal=Input.GetAxis("Horizontal");

float vetical=Input.GetAxis("Vertical");

Vector3 dir1=new Vector3(horzontal,0,vetical);

3.2 按键改变面向

  • 可以实现原地播放动画

//面向向量
transform.rotation=Quaternion.LookRotation(dir1);

//可以实现原地播放动画

3.3  播放动画

//播放跑步动画
            animator1.SetBool("IsRun",true);

//播放walk动画
            animator1.SetBool("IsRun",false);

3.4 移动

//朝着面向的前方移动
//transform.Translate(Vector3.forward*2*Time.deltaTime);
 

3.5 Animator的设置

3.5.1 动作状态的设置

3.5.2 设置好新的参数

  • entry接着默认状态是walk
  • 新增参数IsRun
  • IsRun,用来切换walk和RUN
  • wave参数继续控制WAVE动作

3.5 完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestPlayer1 : MonoBehaviour
{private Animator animator1;// Start is called before the first frame updatevoid Start(){animator1=GetComponent<Animator>();}// Update is called once per framevoid Update(){float horzontal=Input.GetAxis("Horizontal");float vetical=Input.GetAxis("Vertical");Vector3 dir1=new Vector3(horzontal,0,vetical);Debug.DrawRay(transform.position,dir1,Color.red);//如果按下了移动按键if(dir1 != Vector3.zero){//面向向量transform.rotation=Quaternion.LookRotation(dir1);//播放跑步动画animator1.SetBool("IsRun",true);//朝着面向的前方移动transform.Translate(Vector3.forward*2*Time.deltaTime);}else{//播放walk动画animator1.SetBool("IsRun",false);}if(Input.GetKeyDown(KeyCode.Q)){//触发wave参数GetComponent<Animator>().SetTrigger("wave");}}
}

实测OK 

3.6 小心难缠的BUG

  • 不要把轴名字写错
  • 否则怎么也无法移动,但是很难定位错误
  • float vetical=Input.GetAxis("Vetical");     //错误的轴,但是不给你报错,大概时因为轴可以自定义名称吧
  • float vetical=Input.GetAxis("Vertical");    //正确的轴

http://www.lryc.cn/news/538185.html

相关文章:

  • C++ ——构造函数
  • Python实现语音识别详细教程【2025】最新教程
  • 【第12章:深度学习与伦理、隐私—12.4 深度学习与伦理、隐私领域的未来挑战与应对策略】
  • Django中数据库迁移命令
  • Win11 远程 连接 Ubuntu20.04(局域网)
  • 安卓手游内存call综合工具/内部call/安卓注入call/数据分析(类人猿学院)
  • PPT工具集
  • SpringBoot:使用spring-boot-test对web应用做单元测试时如何测试Filter?
  • 解锁 Java 回调函数:异步编程与事件处理的利器
  • 记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-Web.IIS.Administration解读(5)
  • MySQL Workbench安装教程以及菜单汉化
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十节】
  • Python的imutils库详细介绍
  • 常用查找算法整理(顺序查找、二分查找、插值查找、斐波那契查找、哈希查找、二叉排序树查找、平衡二叉树查找、红黑树查找、B树和B+树查找、分块查找)
  • 2526考研资料分享 百度网盘
  • 网络编程(24)——实现带参数的http-get请求
  • 东方财富股吧发帖与评论爬虫
  • 【Elasticsearch】match_bool_prefix查询
  • 微信小程序image组件mode属性详解
  • 数据结构:最小生成树
  • C语言-章节 4:函数的定义与声明 ——「神秘法术的卷轴」
  • 《云原生安全攻防》-- K8s镜像安全:镜像全生命周期安全管理
  • uniapp商城之首页模块
  • 【Javascript Day13、14、15、16】
  • linux 板子的wifi模块连上路由器后,用udhcpc给板子wifi分配ip,udhcpc获取到ip,但没有写入wlan0网卡上
  • openGauss 3.0 数据库在线实训课程13: 学习逻辑结构:表管理1
  • 网络编程-
  • 基于单片机的常规肺活量SVC简单计算
  • 【PostgreSQL】PG在windows下的安装
  • 电动汽车电池监测平台系统设计(论文+源码+图纸)