[Unity]尝试实现第三人称控制器(其一、输入监测)

[Unity]尝试实现第三人称控制器(其一、输入监测)


【声明】此第三人称控制器是复现unity明星资产中第三人称控制器,如果有需要可以直接下载该资产并学习。我个人是不喜欢重复造轮子的行为的,但是官方的控制器我使用时有些不尽如人意的BUG。尽管如此,该控制器的效果让我觉得很不错,虽然无法实现无缝动画,不过个人项目应该先想办法让其动起来才行。
【版本】此项目基于Unity【2021.3lts】版本制作

使用新版的InputSystem的SendMessage制作输入响应

首先,我们去看官方文档关于SendMessage的使用方法:
GameObject components for input(新版InputSystem的PlayerInput脚本)
其中的Behavior
可以看到,Behavior的选项表明了此项Input如何和我们的脚本产生关联。如果选择UnityEvent,我们看到的是事件方式。我们选择使用SendMessages方式。(没有什么好坏之分吧,主要是你喜欢哪种)
设置为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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一个示例的Unity第三人称控制器的代码: ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine; public class ThirdPersonController : MonoBehaviour { public float moveSpeed = 5f; public float rotationSpeed = 5f; private Animator animator; void Start() { animator = GetComponent<Animator>(); } void Update() { float horizontalInput = Input.GetAxis("Horizontal"); float verticalInput = Input.GetAxis("Vertical"); Vector3 moveDirection = new Vector3(horizontalInput, 0, verticalInput).normalized; if (moveDirection.magnitude >= 0.1f) { float targetAngle = Mathf.Atan2(moveDirection.x, moveDirection.z) * Mathf.Rad2Deg; Quaternion rotation = Quaternion.Euler(0f, targetAngle, 0f); transform.rotation = Quaternion.Lerp(transform.rotation, rotation, rotationSpeed * Time.deltaTime); transform.Translate(moveDirection * moveSpeed * Time.deltaTime, Space.World); animator.SetFloat("Speed", moveSpeed); } else { animator.SetFloat("Speed", 0f); } } } ``` 这个控制器可以让角色根据输入进行移动和旋转。你可以通过调整`moveSpeed`和`rotationSpeed`来控制移动和旋转的速度。在Update函数中,我们获取输入的水平和垂直轴的值,然后根据这些值来计算移动方向。接下来,我们将角色的朝向逐渐插值到目标角度,然后将角色沿着移动方向进行移动。最后,根据移动方向的大小来设置角色动画的播放速度。 希望这个控制器能满足你的需求!如果有任何问题,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值