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

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

然后将之前的“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

### 回答1: Unity InputManagerUnity引擎中的一个组件,用于管理游戏中的输入设备,例如键盘、鼠标、手柄等。通过InputManager,开发者可以轻松地获取玩家的输入,并将其应用于游戏中的角色控制、UI交互等方面。同时,InputManager还提供了一些常用的输入设置,例如灵敏度、反转轴等,方便开发者进行游戏调试和优化。 ### 回答2: Unity InputManagerUnity游戏引擎的一个功能强大的模块,允许用户从多个输入源(比如键盘、鼠标、控制器等)中捕捉输入。用于操作游戏角色、快速移动相机、进入不同的游戏模式等。通过使用Unity InputManager,用户能够创建响应灵敏和良好输入交互的游戏。Unity InputManager是一种非常适合初学者的输入管理器,因为它很容易上手,并且可以快速设置和调试输入,使得游戏玩家体验到更加愉快的游戏过程。 Unity InputManager不仅仅是一个单纯的按键输入功能,它还提供了丰富的输入选项和配置选项。其中包括对多年轻玩家的支持、可配置的按键重复等。同时还可以对输入源进行映射,使得在不同的平台下都能够兼容游戏的输入方式。Unity Input Manager还支持事件和响应式编程模式。事件模式中,可以设置一系列事件,以响应特定的用户输入。而响应式编程模式则允许用户编写自定义脚本,处理用户输入并响应游戏行为,从而实现更加灵活和定制化的游戏场景。 总之,Unity InputManager是一个在Unity中广泛使用和高度可定制的输入管理器。无论您是初学者或专业游戏设计师,都可以使用Unity InputManager轻松地实现高质量的用户输入交互。 ### 回答3: Unity InputManager是一个可以通过核心脚本来访问输入数据的工具,它可以使得我们在游戏中使用键盘、鼠标、手柄等各种输入设备。Unity InputManager可以简化游戏中输入控制的开发,提供一种方法来方便的获取并配置用户输入数据,使得游戏控制更加方便与灵活,提升了用户游戏体验。 Unity InputManager提供了多种输入类型,如:Keyboard、Mouse、Joystick、Touch Screen等。根据不同的输入类型,我们可以在Unity InputManager中对键位进行配置,比如指定按键的名称、部件和轴等。配置完成后,我们可以通过脚本来访问Unity InputManager并接收输入数据。 Unity InputManager还提供了一份默认的输入映射,它已经包含了常见输入设备的配置,比如:鼠标左键、右键、中键,键盘的wasd、上、下、左、右等。当我们的项目中需要使用这些输入类型时,就可以直接使用Unity InputManager中的默认映射而无需重新配置。 Unity InputManager需要注意的一点是,当我们在脚本中访问输入数据时,最好使用Input.GetAxis和Input.GetButton等通用方法来获取数据,而不是通过KeyCode或if语句等来获取,因为InputManager可以帮助我们自动处理输入设备的不同和用户的个性化设置。这样不仅避免了代码冗长,也使得整体的代码更加简洁易读。 总之,Unity InputManagerUnity中一个非常实用的工具,可大大简化游戏中输入控制的开发工作,提升用户游戏体验,如果您想要更深入学习Unity InputManager,可以在Unity官网上找到更多关于该工具的学习资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咆哮的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值