第五十一章 Unity Input Manager 输入系统(下)

news2024/10/7 10:23:18

本章节我们就来使用水平轴和垂直轴来控制游戏物体的移动和旋转。我们之前大致讲过,游戏物体移动最重要的是方向,速度和时间三个要素,同样旋转也是。接下来,我们将之前创建的地形场景导入进来,如下所示

然后将之前的“MecanimDemo”工程里面的模型文件和动画文件拿过来使用,这里可以导入我自定义的“U_Character_Animatiion.unitypackage”资源包文件。

 

然后,我们将“U_Character_REF.fbx”模型拖入到场景中,

 

然后选中相机,点击菜单栏“GameObject”->“Align With View”调整Main Camera位置

接下来, 我们创建一个“U_Character_Controller”动画控制器文件,双击打开它

然后将我们之前复制过来的两个动画添加进来

我们默认动画是Idle休闲,然后在Idle和Run之间彼此建立过渡。接下来,我们创建一个动画参数is_run,类型为bool类型,如下所示

接下来,我们设置Idle到Run的过渡条件为is_run = true

然后Run到Idle的过渡条件为is_run = false

设置完毕后,我们将这个“U_Character_Controller.controller”文件拖拽到Animator组件的Controller项上面去。

最后,我们创建一个“MoveScript.cs”脚本文件来控制动画的播放,如下所示

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

public class MoveScript : 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()
    {
        // 按下按键W播放动画
        if (Input.GetKeyDown(KeyCode.W))
        {
            animator.SetBool("is_run", true);
        }
        // 抬起按键W停止播放动画
        if (Input.GetKeyUp(KeyCode.W))
        {
            animator.SetBool("is_run", false);
        }
    }
}

然后,我们将这个脚本附加到“U_Character_REF”游戏对象上面

我们Play运行工程查看一下。

现在我们的动画播放没有问题了。接下来,我们就开始控制角色的移动。我们之前讲过,这个最好使用“Character Controller”角色控制器组件来实现。

 

接下来,我们就来修改“MoveScript.cs”脚本文件,增加移动代码,如下所示

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

public class MoveScript : MonoBehaviour
{
    // 动画播放组件
    private Animator animator;

    // 角色控制器组件
    private CharacterController controller;

    // 定义移动速度和旋转速度
    private float moveSpeed = 10.0f;
    private float rotateSpeed = 2.0f;
    
    // Start is called before the first frame update
    void Start()
    {
        // 获取动画播放组件
        animator = GetComponent<Animator>();

        // 获取角色控制器组件
        controller = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        // 垂直方向的输入(WS按键)控制移动
        float v = Input.GetAxis("Vertical");
        controller.SimpleMove(transform.forward * moveSpeed * v);

        // 水平方向的输入(AD按键)控制旋转
        float h = Input.GetAxis("Horizontal");
        transform.Rotate(0, rotateSpeed * h, 0);

        // 按下按键W播放动画
        if (Input.GetKeyDown(KeyCode.W))
        {
            animator.SetBool("is_run", true);
        }
        // 抬起按键W停止播放动画
        if (Input.GetKeyUp(KeyCode.W))
        {
            animator.SetBool("is_run", false);
        }
    }
}

接下来,我们就来运行工程。

接下来,我们来添加相机跟随角色移动,鼠标控制相机旋转的代码。以前我们是将相机放置到角色的下面(成为角色的子游戏对象),这种方式虽然简单,但是存在一些问题。这里,我们将使用代码来控制相机跟随角色。原理很简单,就是当角色移动的时候,相机也跟随移动。我们创建一个新的脚本“CameraScript.cs”文件,内容如下

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

public class CameraScript : MonoBehaviour
{
    // 游戏角色
    private Transform player;

    // 相机控制参数
    private bool isRotating = false;
    private Vector3 offset;
    private float distance;
    private float rotateSpeed = 2.0f;

    // Start is called before the first frame update
    void Start()
    {
        // 获取游戏角色
        player = GameObject.Find("U_Character_REF").transform;

        // 相机和游戏角色的偏移
        offset = transform.position - player.position;

        // 相机和游戏角色之间的距离
        distance = offset.magnitude;
    }

    // Update is called once per frame
    void Update()
    {
        // 鼠标右键控制相机旋转
        if(Input.GetMouseButtonDown(1)) isRotating = true;
        if(Input.GetMouseButtonUp(1)) isRotating = false;

        // 相机围绕游戏角色旋转
        if (isRotating)
        {
            // 围绕游戏角色的Y轴左右旋转
            transform.RotateAround(player.position, player.up, rotateSpeed * Input.GetAxis("Mouse X"));
            // 围绕相机(也可以试试游戏角色)的X轴上下旋转
            transform.RotateAround(player.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));
        }

        // 根据滚轮来增加和减小这个距离
        distance += Input.GetAxis("Mouse ScrollWheel") * 1.0f;        
        offset = offset.normalized * distance;

        // 游戏角色移动后,相机跟随移动,保持偏移
        transform.position = player.position + offset;
    }
}

接下来,我们要将这个脚本附加到相机上面。

接下来,我们稍微调整一下视角,

接下来,我们Play运行整个工程

总结:Unity推荐使用Input Manager来获取设备的输入信息。对于方向性输入肯定是使用Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")方法来获取X/Y数值。这些X/Y数值可以直接用来控制游戏角色的移动(后续章节我们会详细介绍)。而对于按钮的输入,可以通过使用Input.GetButtonUp("Fire1")来获取是否按下状态。至于输入轴对应的什么类型的设备的按键,就可以在Input Manager来设置。可以是键盘,鼠标,或者游戏手柄。当然,Unity默认已经给我们添加了18个输入轴的设置。我们也可以继续添加新的设备按键设置输入轴。但是,这些设置对于我们的代码修改则是没有太大的影响。因为我们代码中,不管使用GetAxis方法,还是GetButtonUp方法,它的参数仅仅是输入轴的名称而已。

本课程涉及的内容已经共享到百度网盘:https://pan.baidu.com/s/1e1jClK3MnN66GlxBmqoJWA?pwd=b2id

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

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

相关文章

OpenAI又火一个新项目,已开源...

大家好&#xff0c;我是 Jack。 OpenAI 又有新动作了&#xff0c;开源发布 Shap-E。 今天&#xff0c;我继续手把手教学。 算法原理、环境搭建、效果测试&#xff0c;一条龙服务&#xff0c;尽在下文&#xff01; 一、Shap-E 效果 Shap-E 算法的功能&#xff0c;简单来讲就…

第五十二章 Unity Input System 新输入系统

新输入系统InputSystem是2019年Unity新推出的插件。请注意&#xff0c;Unity默认使用旧的Input Manager&#xff0c;新的Input System处于未启用状态。当你安装Input System组件时&#xff0c;Unity会询问你是否启用新的输入系统。如果你选择Yes&#xff0c;Unity会启用新的并禁…

8通道高速同步采集板卡设计原理图与调试经验中文资料分享

采集卡实物图及功能框图如下 青翼型号-FMC128 FMC128功能框图 FMC148实物图 FMC148功能框图 FMC168实物图 FMC168功能框图 板卡对比如下图 青翼型号 通道数 采集分辨率 采样率 FMC1288通道16bit250MSPSFMC14814bit500MSPS/1GSPS/1.25GSPSFMC1682GSPS/2.6GSPS/3GSPS 技术指标FM…

Android 套壳本地html 生成apk

参考了:https://www.jianshu.com/p/ebf7948f3796 首页是前端会给到你html文件 目录基本上是这样的 image.png 步骤1: 创建assets目录 用户安卓studio 新合建工程就不写了 &#xff0c;下面的图是如何创建assets资源目录&#xff1a; image.png image.png 步骤2&#xff1a;拷贝…

JVM-类加载机制

类的生命周期 ​ 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中&#xff0c;加载、验证、准备和初始化这四个阶段发生的顺序是确定的&#xff0c;而解析阶段则不一定&#xff0c;**它在某些情况下可以在初始化阶段之后开始&#xff0c;这是为…

ext-5 void GPIO1Pin23PinMuxSetup(void)含义

在阅读starterware里控制led的代码&#xff0c;GPIO初始化有个这个函数 void GPIO1Pin23PinMuxSetup(void) {HWREG(SOC_CONTROL_REGS CONTROL_CONF_GPMC_A(7)) CONTROL_CONF_MUXMODE(7); } 如果不熟悉可能看的一头雾水&#xff0c;这个含义是&#xff1a; 解释一下&#xff…

【Nginx】Nginx面试题

什么是Nginx&#xff1f; Nginx是一个 轻量级/高性能的反向代理Web服务器&#xff0c;用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡&#xff0c;他可以处理2-3万并发连接数&#xff0c;官方监测能支持5万并发&#xff0c;现在中国使用ngin…

U-boot常用命令(二)

FAT格式文件系统操作命令 有时候需要在uboot中对SD卡或EMMC中存储的文件进行操作&#xff0c;这时候就要用到文件操作命令。跟文件操作相关的命令有&#xff1a;fatinfo、fatls、fstype、fatload 和 fatwrite&#xff0c;但是这些文件操作命令只支持 FAT 格式的文件系统&#…

PCA(Principal Component Analysis,主成分分析)降维

1.PCA介绍 来源&#xff1a;视频https://www.bilibili.com/video/BV1E5411E71z/ 笔记&#xff1a;https://www.bilibili.com/read/cv23587690?spm_id_from333.999.0.0&jump_opus1 PCA就是找坐标系&#xff0c;使得数据在保留一维数据&#xff0c;损失是最小的。 目标&a…

Aescripts StyleX for AE(AI技术风格化插件)

Aescripts StyleX一款非常实用的视频风格和效果自动化处理插件&#xff0c;它提供了多种风格和效果、自动化处理、可自定义选项、支持多种分辨率、简单易用的界面和工具等功能&#xff0c;让用户可以轻松地为视频添加不同的风格和效果&#xff0c;并提高效率和准确性。StyleX 插…

基于STM32+RC522设计的门禁系统

一、项目背景 门禁系统是现代社会中非常重要的安全控制系统之一,其功能是在保障建筑物安全的同时,为合法用户提供便利。当前设计一种基于STM32+RC522的门禁系统设计方案,通过RFID-RC522模块实现了对用户卡的注册、识别及身份验证,通过控制SG90舵机实现门锁的开关,具有较高…

物联网架构和技术:如何实现物物互联和智能化控制

第一章&#xff1a;引言 物联网是一种新兴的技术领域&#xff0c;通过将物理设备、传感器和软件等连接起来&#xff0c;可以实现设备之间的互联互通&#xff0c;让各种设备可以进行数据交换和智能化控制。在这个数字化时代&#xff0c;物联网已经成为了连接万物的关键技术之一…

WiFi(Wireless Fidelity)基础(五)

目录 一、基本介绍&#xff08;Introduction&#xff09; 二、进化发展&#xff08;Evolution&#xff09; 三、PHY帧&#xff08;&#xff08;PHY Frame &#xff09; 四、MAC帧&#xff08;MAC Frame &#xff09; 五、协议&#xff08;Protocol&#xff09; 六、安全&#x…

程序设计入门——C语言 2023年5月9日

程序设计入门——C语言 一、基础理解1、什么是计算机&#xff1f;如何用计算机做事情&#xff1f;什么是应用软件&#xff1f;编程语言干啥的&#xff1f;计算机与人脑&#xff1f;学习编程能干啥&#xff1f;2、计算机-程序-算法3、解释语言vs编译语言 课程来源&#xff1a;链…

测试老鸟总结,性能测试常见瓶颈分析与调优,“我“也要卷出测试圈...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试过程中&a…

KingbaseES V8R3 集群运维系列 -- failover切换后集群自动恢复

​ 案例说明&#xff1a; KingbaseES V8R3集群默认在触发failover切换后&#xff0c;为保证数据安全&#xff0c;原主库需要通过人工介入后&#xff0c;恢复为新的备库加入到集群。在无人值守的现场环境&#xff0c;需要在触发failover切换后&#xff0c;主库可以自动恢复为新备…

jvm之图形化工具

写在前面 本文一起看下jvm图形化相关的工具&#xff0c;图形化的工具相比于命令行工具的好处是更加直观&#xff0c;也更容易分析问题。 1&#xff1a;jconsole 1.1&#xff1a;准备要连接的jvm进程 定义如下的类&#xff1b; package a.b; import java.util.concurrent.*…

Linux内核架构和工作原理

**前言&#xff1a;**作用是将应用层序的请求传递给硬件&#xff0c;并充当底层驱动程序&#xff0c;对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构&#xff0c;每个进程都依赖于一个父进程。内…

JavaScript模板引擎Template.js基本使用详解

template.js是一款JavaScript模板引擎&#xff0c;提供一套模板语法&#xff0c;简单好用&#xff0c;开发者可以写一个模板区块&#xff0c;每次传入的数据&#xff0c;生成对应数据产生的HTML片段&#xff0c;渲染不同的效果。官网&#xff1a;简洁语法版 https://github.com…

天猫数据分析:2023年Q1天猫净水器品牌销售TOP10排行榜

水质的好坏更是与人们的身体健康密切相关。随着社会经济的发展&#xff0c;居民生活水平提升&#xff0c;人们对饮用水质量、安全性的要求也不断提高&#xff0c;净水器也因此逐渐成为现代生活的必需品。 根据鲸参谋电商数据显示&#xff0c;2023年Q1在天猫平台上&#xff0c;净…