使用Unity的新输入系统
【Unity动画系统详解 预备知识】使用Unity的新输入系统(New Input System)控制动画状态机【Unity开发入门教程21】_单机游戏热门视频 (bilibili.com)
要点:
1. 安装 New Input System
我们打开Unity上方工具栏中的Window =>Package Manager打开Unity插件包管理界面
2.点击右上角Package选项中Unity Registry,然后在右侧搜索栏中搜索Input
3.找到InputSystem插件,点击安装
2. 添加 Player Input 组件
-
选择
玩家角色(Player)
为ta添加Player Input
组件
我们需要在场景中在我们需要的对象上添加PlayerInput组件
3. 新建输入配置文件
-
在
Assets
文件夹下创建Setting
文件夹 -
点击
Create Actions
按钮,输入配置文件命名为Locomotion
,存放在刚刚创建的Setting
文件夹
-
将组件选项
Behavior
选为Invoke Unity Events
(系统检测到我们的输入即WASD时,就会调用我们写好的方法)
-
编写脚本(移动初尝试)
-
创建一个
PlayerMoveTest
的脚本
public class PlayerMove : MonoBehaviour
{
// 移动速度
public float moveSpeed = 0.2f;
// 角色控制器
private CharacterController characterController;
void Start()
{
characterController = GetComponent<CharacterController>();
}
void Update()
{
}
/// <summary>
/// 角色移动(按下时监听 按一下动一下)
/// </summary>
/// <param name="callbackContext"></param>
public void PlayerMovement(InputAction.CallbackContext callbackContext)
{
// 获取 Horizontal(横向) 和 Vertical(纵向) 的值 --- 0到1
Vector2 moveVector2 = callbackContext.ReadValue<Vector2>();
// 移动方向
Vector3 moveDir = new(moveVector2.x, 0, moveVector2.y);
// 控制角色移动
characterController.Move(moveDir * Time.deltaTime * moveSpeed);
}
}
-
在
Player Input组件
展开Events
再展开Player
,在Move
方法上挂载PlayerMovement脚本的方法
-
编写脚本(持续移动)
-
勾选InputSystem 的 Generate C#Class
-
新建一个`PlayerKeepMove`的脚本
public class PlayerKeepMove : MonoBehaviour
{
public float moveSpeed = 0.2f;
private MoveInputAction moveInputAction;
private CharacterController characterController;
private void Awake()
{
//实例化我们刚刚生成的moveInputAction脚本
moveInputAction = new MoveInputAction();
}
void OnEnable()
{
//使用前需要将该moveInputAction开启
moveInputAction.Enable();
}
void OnDisable()
{
//使用完需要将该moveInputAction关闭
moveInputAction.Disable();
}
void Start()
{
characterController = GetComponent<CharacterController>();
}
void Update()
{
GetMoveInput();
}
private void GetMoveInput()
{
Vector2 moveVector2 = moveInputAction.Player.Move.ReadValue<Vector2>();
if (moveVector2 != Vector2.zero)
{
PlayerMove(moveVector2.x, moveVector2.y);
}
}
private void PlayerMove(float horizontal, float vetical)
{
characterController.Move(new Vector3(horizontal, 0, vetical) * Time.deltaTime * moveSpeed);
}
}