Unity 第一人称视角 角色控制脚本

使用方法

WSAD 控制四个方向的移动

鼠标 控制角色的水平、竖直朝向

空格 控制角色跳跃

配置

需要指定玩家的第一人称摄像头

  

效果

代码

using UnityEngine;

public class PlayerControl : MonoBehaviour
{
    //摄像机
    public GameObject playerView;

    //速度:每秒移动5个单位长度
    public float moveSpeed = 6;
    //角速度:每秒旋转135度
    public float angularSpeed = 135;
    //跳跃参数
    public float jumpForce = 200f;

    //水平视角灵敏度
    public float horizontalRotateSensitivity = 10;
    //垂直视角灵敏度
    public float verticalRotateSensitivity = 5;

    //最大俯角
    public float maxDepressionAngle = 90;

    //最大仰角
    public float maxElevationAngle = 25;

    //角色的刚体
    private Rigidbody rigidbody;

    void Start()
    {
        rigidbody = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        Move();
        View();
        Jump();
    }
 
    void Move()
    {
        //通过键盘获取竖直、水平轴的值,范围在-1到1
        float v = Input.GetAxis("Vertical");
        float h = Input.GetAxis("Horizontal");

        //按照矢量移动一段距离
        transform.Translate(Vector3.forward * v * Time.deltaTime * moveSpeed);
        transform.Translate(Vector3.right * h * Time.deltaTime * moveSpeed);
    }

    void View()
    {
        //锁定鼠标到屏幕中心
        SetCursorToCentre();

        //当前垂直角度
        double VerticalAngle = playerView.transform.eulerAngles.x;

        //通过鼠标获取竖直、水平轴的值,范围在-1到1
        float h = Input.GetAxis("Mouse X");
        float v = Input.GetAxis("Mouse Y") * -1;

        //角色水平旋转
        transform.Rotate(Vector3.up * h * Time.deltaTime * angularSpeed* horizontalRotateSensitivity);

        //计算本次旋转后,竖直方向上的欧拉角
        double targetAngle = VerticalAngle + v * Time.deltaTime * angularSpeed * verticalRotateSensitivity;

        //竖直方向视角限制
        if (targetAngle > maxDepressionAngle && targetAngle < 360 - maxElevationAngle) return;

        //摄像机竖直方向上旋转
        playerView.transform.Rotate(Vector3.right * v * Time.deltaTime * angularSpeed * verticalRotateSensitivity);
    }

    void SetCursorToCentre()
    {
        //锁定鼠标后再解锁,鼠标将自动回到屏幕中心
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.lockState = CursorLockMode.None;
        //隐藏鼠标
        Cursor.visible = false;
    }

    void Jump()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            rigidbody.AddForce(Vector3.up * jumpForce);
        }
    }
}

解析

Move函数

控制角色前后左右移动,改变的是位置,并不会改变角色朝向

View函数

控制角色左右旋转,朝上或朝下看

注意:在水平方向移动鼠标,将改变角色(包括摄像头)的朝向,在竖直方向上移动鼠标,只改变摄像头的朝向,并不改变角色朝向

SetCursorToCentre函数

将鼠标设定在屏幕中心并隐藏

Jump函数

控制角色跳跃

相关函数的用法

获取WSAD输入

float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");

(取值范围在-1~1之间)

获取鼠标输入

float h = Input.GetAxis("Mouse X");
float v = Input.GetAxis("Mouse Y") * -1;

(取值范围在-1~1之间)

获取空格键

Input.GetKeyDown(KeyCode.Space)

给刚体在某一个方向上施加力

rigidbody.AddForce(Vector3.up * jumpForce);

按照矢量移动一段距离

transform.Translate(Vector3 位移)

物体前方

Vector3.forward 也可以写作 Vector3(0, 0, 1)

物体左边

Vector3.right 也可以写作 Vector3(1, 0, 0)

旋转

gameObject.transform.Rotate(Vector3 欧拉角)

鼠标的锁定状态

Cursor.lockState 可以设定为 CursorLockMode.Locked 或 CursorLockMode.None

鼠标的显示

Cursor.visible 可以设定为 true 或 false

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值