[Unity]尝试实现第三人称控制器(其一、输入监测)
【声明】此第三人称控制器是复现unity明星资产中第三人称控制器,如果有需要可以直接下载该资产并学习。我个人是不喜欢重复造轮子的行为的,但是官方的控制器我使用时有些不尽如人意的BUG。尽管如此,该控制器的效果让我觉得很不错,虽然无法实现无缝动画,不过个人项目应该先想办法让其动起来才行。
【版本】此项目基于Unity【2021.3lts】版本制作
使用新版的InputSystem的SendMessage制作输入响应
首先,我们去看官方文档关于SendMessage的使用方法:
GameObject components for input(新版InputSystem的PlayerInput脚本)
可以看到,Behavior的选项表明了此项Input如何和我们的脚本产生关联。如果选择UnityEvent,我们看到的是事件方式。我们选择使用SendMessages方式。(没有什么好坏之分吧,主要是你喜欢哪种)
如何使用SendMessages
其实官方给的Action中是有提到过的,尤其是代码部分
怎么理解呢?其实这样的:
在创建输入资源的时候如下图
然后对应的获取输入部分就会是(此处有些行为暂时没有写,此系列文章都是边做边写的)
其实就是playerinput与检测的脚本同时挂载在角色身上,当触发Look行为时,会调用OnLook方法。
我的代码
[Header("Character Input Values")]
public Vector2 move;
public Vector2 look;
public bool run;
public bool aim;
[Header("Movement Settings")]
public bool analogMovement;
[Header("Mouse Cursor Settings")]
public bool cursorLocked = true;
public bool cursorInputForLook = true;
#region 获取输入
public void OnPlayerMove(InputValue value)
{
MoveInput(value.Get<Vector2>());
}
public void OnLook(InputValue value)
{
if (cursorInputForLook)
{
LookInput(value.Get<Vector2>());
}
}
public void OnRun(InputValue value)
{
RunInput(value.isPressed);
}
#endregion
#region 更改对应值
public void MoveInput(Vector2 newMoveDirection)
{
move = newMoveDirection;
}
public void LookInput(Vector2 newLookDirection)
{
look = newLookDirection;
}
public void RunInput(bool newSprintState)
{
run = newSprintState;
}
public void AimInput(bool newAimState)
{
aim = newAimState;
}
#endregion
#region 设置鼠标状态
private void OnApplicationFocus(bool hasFocus)
{
SetCursorState(cursorLocked);
}
private void SetCursorState(bool newState)
{
Cursor.lockState = newState ? CursorLockMode.Locked : CursorLockMode.None;
}
#endregion