Unity解决:3D开发模式第三人称视角 WASD控制角色移动旋转 使用InputSystem

Unity版本:2019.2.3f1

目录

安装InputSystem

[1:创建InputHander.cs脚本 挂载到Player物体上 获取键盘输入WADS](#1:创建InputHander.cs脚本 挂载到Player物体上 获取键盘输入WADS)

2.创建PlayerLocomotion.cs挂载到Player物体上,控制物体移动转向


安装InputSystem

菜单栏/Window/Package Manager/Input System

工程面板内 右键-->创建Input Actions

选中New Controls改名为PlayerControls 然后属性 面板按下Edit asset

Action Maps添加:PlayerMovement

Actions添加:New action 改名为MovementAction

Properties项 修改ActionType=Pass Through

修改ControlType= Vector2

在MovementAction项点击+号 选择Add 2D Vector Composite

生成WASD

绑定Up、Down、Left、Right,如此类推

回到PlayerControls属性面板 勾选Generate C# Class\*

工程面板就生成了一份 PlayerControls.cs 脚本,先不管它

然后创建2个脚本挂到Player物体上

1:创建InputHander.cs脚本 挂载到Player物体上 获取键盘输入WADS

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputHander : MonoBehaviour
{

    public float horizontal;
    public float vertical;
    public float moveAmount;
    public float mouseX;
    public float mouseY;

    PlayerControls inputActions;//声明 InputSystem的脚本对象
    Vector2 movementInput;//存储 WASD输入的值

    public void OnEnable()
    {
        //获取设备上的输入
        if (inputActions == null)
        {
            inputActions = new PlayerControls();
            //绑定输入的值
            inputActions.PlayerMovement.MovementAction.performed += outputActions => movementInput = outputActions.ReadValue<Vector2>();
        }

        inputActions.Enable();//启用
    }

    public void OnDisable()
    {
        inputActions.Disable();//禁用
    }


    public void TickInputt(float delta)
    {
        MoveInput(delta);
    }

    public void MoveInput(float delta) {

        horizontal = movementInput.x;
        vertical = movementInput.y;
        moveAmount = Mathf.Clamp01(Mathf.Abs(horizontal) + Mathf.Abs(vertical));
    }

}

2.创建PlayerLocomotion.cs挂载到Player物体上,控制物体移动转向

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerLocomotion : MonoBehaviour
{

    InputHander inputHander;
    Vector3 moveDirection;

    public CapsuleCollider capsuleCollider;
    public new Rigidbody rigidbody;
    Vector2 movementInput;//存储 WASD输入的值
    Transform cameraObject;

    [HideInInspector]
    public Transform myTransform;

    [Header("Stats")]
    [SerializeField]
    float movementSpeed = 5;
    [SerializeField]
    float rotationSpeed = 10;



    // Start is called before the first frame update
    void Start()
    {
        rigidbody = GetComponent<Rigidbody>();
        if (rigidbody==null)
        {
            rigidbody = gameObject.AddComponent<Rigidbody>();
            rigidbody.constraints = RigidbodyConstraints.FreezeRotation;
            
        }
        capsuleCollider = GetComponent<CapsuleCollider>();
        if (capsuleCollider==null)
        {
            capsuleCollider = gameObject.AddComponent<CapsuleCollider>();
            capsuleCollider.center = new Vector3(0, 1, 0);
            capsuleCollider.radius = 0.5f;
            capsuleCollider.height = 2;
            capsuleCollider.direction = 1;
        }
       
        inputHander = GetComponent<InputHander>();
        cameraObject = Camera.main.transform;
        myTransform = transform;
    }

    // Update is called once per frame
    void Update()
    {
        float delta = Time.deltaTime;
        inputHander.TickInputt(delta);

        moveDirection = cameraObject.forward * inputHander.vertical;
        moveDirection += cameraObject.right * inputHander.horizontal;
        moveDirection.Normalize();

        float speed = movementSpeed;
        moveDirection *= speed;

        //移动
        Vector3 projectedVelocity = Vector3.ProjectOnPlane(moveDirection, new Vector3(0, 0, 0));
        rigidbody.velocity = projectedVelocity;

        HandleRotation(delta);
    }

    //转向
    private void HandleRotation(float delta) {

        Vector3 targerDir = Vector3.zero;

        targerDir = cameraObject.forward * inputHander.vertical;
        targerDir += cameraObject.right * inputHander.horizontal;

        targerDir.Normalize();
        targerDir.y = 0;

        if (targerDir == Vector3.zero)
        {
            targerDir = myTransform.forward;
        }

        Quaternion tr = Quaternion.LookRotation(targerDir);
        Quaternion targetRotation = Quaternion.Slerp(myTransform.rotation, tr, rotationSpeed * delta);

        myTransform.rotation = targetRotation;
    
    }
}

完成

相关推荐
帅_shuai_9 小时前
unity 静态字段内存查找工具
unity·游戏引擎
郝学胜-神的一滴15 小时前
[简化版 GAMES 104] 现代游戏引擎 06:从Tick时序到邮局模型,拆解确定性世界的底层密码
开发语言·c++·游戏引擎·图形渲染·软件开发·opengl
鹿野素材屋2 天前
Unity超轻量级中文语音播报,仅5兆大小,无需联网即可使用,适用于弹幕、提示等动态语音播出
unity·游戏引擎
电子云与长程纠缠3 天前
UE5 Lyra PocketWorld进行3D内容UI预览 - 上
开发语言·学习·3d·ue5·游戏引擎
玖玥拾3 天前
Unity3D RPG 入门项目(八)游戏设置面板、帧率控制、快捷技能药品栏、技能解锁系统
游戏·3d·unity·游戏引擎
ellis19703 天前
u3d插件xLua[十] lua侧判空问题
unity
牛哇网络工作室3 天前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
ellis19703 天前
u3d插件xLua[九]例8 Hotfix
unity
淡海水3 天前
01-07-运行时-GC深度剖析-内存分配回收与结构选择
jvm·windows·unity·gc
优梦创客4 天前
游戏开发架构选型:第1篇|什么是架构?从进球事件看 MVC 的局限
unity·架构·游戏引擎·游戏开发