Input System的简单应用

本文详细介绍如何在Unity中使用InputSystem组件进行角色控制,包括键盘控制和UI控制的实现方法。通过创建InputActions并绑定到角色行为,实现了角色的移动、技能释放等功能。同时探讨了InputSystem对UI操作的影响及解决方案。
部署运行你感兴趣的模型镜像

通过前面两篇我们简单的了解了一下Input System,接着就是要学以致用,这样才能了解的更加透彻。

首先先搭一个简单的场景,随便摆放点东西,然后用个Cube来模拟角色,如图。

 

利用键盘控制

一般的游戏角色会有例如,移动、旋转、释放技能这类的操作,根据需求我们创建一个Input Actions,如图,通过WASD来触发移动,按键1和2来触发技能,然后将其导出为C#脚本。

      

然后我们创建一个类来管理它(InputManager),后续可以将其写作单例。

using System;
using UnityEngine;

public class InputManager : MonoBehaviour
{
	private PlayerInputAction m_action;

	public Action<Vector2> moveAction;
	public Action skill1, skill2;
	
	void Awake()
	{
		m_action = new PlayerInputAction();

		m_action.Player.Skill1.performed += ctx => { skill1?.Invoke();};
		m_action.Player.Skill2.performed += ctx => { skill2?.Invoke();};
	}
	
	public void OnEnable()
	{
		m_action.Enable();
	}

	public void OnDisable()
	{
		m_action.Disable();
	}

	void Update()
	{
		moveAction?.Invoke(m_action.Player.Move.ReadValue<Vector2>());
	}
}

接下来,我们用一个类(Player)来实现玩家的行为。

using UnityEngine;

public class Player : MonoBehaviour
{
	private float m_moveSpeed = 10;
	private Transform m_transform;
	private InputManager m_inputManager;
	
	void Start()
	{
		m_transform = transform;
		m_inputManager = GetComponent<InputManager>();

		m_inputManager.moveAction = Move;
		m_inputManager.skill1 = Skill1;
		m_inputManager.skill2 = Skill2;
	}

	void Move(Vector2 v)
	{
		var scaledMoveSpeed = m_moveSpeed * Time.deltaTime;
		var move = Quaternion.Euler(0, m_transform.eulerAngles.y, 0) * new Vector3(v.x, 0, v.y);
		m_transform.position += move * scaledMoveSpeed;
	}


	void Skill1()
	{
		Debug.Log("skill1111111111");
	}
	void Skill2()
	{
		Debug.Log("skill22222222222");
	}
}

只需要将这两个组件挂载到Player上即可利用键盘来控制角色行为了。

 

使用UI控制

手游而言,所有的操作基本都是由UI来解决的,那么用Input System对UI会有啥影响呢。

我们先简单的添加一些按钮,用于控制角色,如图:

注意要将EventSystem中的Standalone Input Module变更为新的Input System UI Input Module组件。

按照以前的做法,我们可以使用Button的onClick.AddListener()来添加事件,方向键的话可以使用UnityEngine.EventSystems.IDragHandler接口来实现拖动。

不过Input System提供了两个组件,分别是OnScreenStick和OnScreenButton,可以用来模拟输入设备。使用起来非常简单,我们只需要给Stick挂上OnScreenStick组件,给Skill1和Skill2分别挂上OnScreenButton,然后设置如下即可

 

Movement Range即拖动范围,Control Path即要模拟的输入设备输入。

例如,Skill1 Button添加了OnScreenButton组件,然后Control Path设置为Keyboard的 1 。那么当我们点击Skill1的时候,等同于键盘的1键按下,会触发相应的Action。

由于OnScreenStick我们绑定的是Gamepad的LeftStick,所以在之前的.inputactions文件中,我们给Move添加一个新的Binding来关联Gamepad的LeftStick。

这样搞好之后就不需要在添加别的代码,运行即可实现UI控制。

 

思考

由于刚接触Input System,有些还是不是很清楚。例如我想实现滑动屏幕实现角色旋转,我可以通过Hold,在按下和松开的时候纪录鼠标偏移的值来处理。但是在我拖动UI上的移动按钮的时候,同时也会导致上述操作的触发,引起冲突。所以现在想的就是依旧使用UnityEngine.EventSystems.IDragHandler接口来实现拖动。

还有对于OnScreenButton的使用,例如商城背包等界面有一堆的按钮,而手游又不会想PC端网游那样有一堆的快捷键,需要去设置。所以个人感觉依旧还是使用Button.onClick.AddListener()来为按钮添加事件。

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

### 输入系统编程在游戏开发与操作系统中的应用 输入系统在编程、游戏开发以及操作系统中扮演着至关重要的角色。它负责处理用户的输入设备(如键盘、鼠标、游戏手柄等)与软件之间的交互,确保用户能够有效地控制应用程序或游戏。 #### 在游戏开发中的输入系统 在游戏开发中,输入系统通常用于处理玩家的实时操作。例如,在一个简单的游戏中,玩家可能使用键盘控制角色的移动,使用鼠标进行瞄准或点击操作。以下是一个使用 C++ 的简单示例,展示如何在游戏开发中处理键盘输入: ```cpp // 假设我们有一个游戏对象数组 GameObject* gameObjects[MAX_COUNT]; // 初始化代码... // ... // 在游戏循环中处理输入 void handleInput(float dt) { if (isKeyPressed(KEY_UP)) { // 向上键被按下,执行相应的操作 player.moveUp(); } if (isKeyPressed(KEY_DOWN)) { // 向下键被按下,执行相应的操作 player.moveDown(); } if (isKeyPressed(KEY_LEFT)) { // 向左键被按下,执行相应的操作 player.moveLeft(); } if (isKeyPressed(KEY_RIGHT)) { // 向右键被按下,执行相应的操作 player.moveRight(); } } // 更新游戏对象 for (int i = 0; i < objectInUse; ++i) { gameObjects[i]->Update(dt); } ``` 上述代码展示了如何检测键盘按键并更新游戏对象的状态,这是游戏开发中输入处理的一个基本示例 [^2]。 #### 在操作系统中的输入系统 在操作系统层面,输入系统的复杂性更高,因为它需要管理多个输入设备,并将这些输入传递给正确的应用程序。例如,在 Windows 操作系统中,输入系统负责处理来自键盘、鼠标的中断信号,并将这些信号转换为应用程序可以理解的事件。 Windows for Workgroups 3.1 是微软推出的第一个集成了 Windows 和网络功能的包,它不仅提供了对等网络的文件和打印机共享功能,还包括了 Microsoft Mail 和 Schedule+ 应用程序 [^3]。尽管它主要关注的是网络功能,但这也说明了操作系统需要处理多种输入设备以支持不同的应用需求。 #### 输入系统的面向对象设计 在面向对象编程中,输入系统的设计通常会利用继承和多态来实现灵活的输入处理机制。例如,可以通过定义一个基类 `InputDevice`,然后为不同的输入设备创建派生类,如 `Keyboard`、`Mouse` 和 `Gamepad`。这样可以方便地扩展输入系统以支持新的设备。 ```cpp class InputDevice { public: virtual void update(float dt) = 0; // 纯虚函数 }; class Keyboard : public InputDevice { public: void update(float dt) override { // 处理键盘输入 } }; class Mouse : public InputDevice { public: void update(float dt) override { // 处理鼠标输入 } }; // 创建输入设备数组 InputDevice* inputDevices[MAX_COUNT]; // 初始化代码... // ... // 更新输入设备 for (int i = 0; i < deviceCount; ++i) { inputDevices[i]->update(dt); } ``` 上述代码展示了如何使用继承和多态来实现一个灵活的输入系统,这种方法使得代码更加模块化和易于维护 [^2]。 ### 相关问题 1. 如何在 Unity 中实现输入系统的管理? 2. 游戏引擎中常见的输入事件处理机制有哪些? 3. 操作系统如何处理多点触控输入? 4. 面向对象设计在输入系统中的优势是什么? 5. 如何在 Linux 系统中配置和调试输入设备?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值