Unity3D中实现人物的第一人称视角

  1. 打开unity创建一个场景地图可以添加一个Plane作为地面
    在这里插入图片描述
  2. 在Hierarchy视图中右键创建一个胶囊体(Capsule)作为Player,添加好后重置胶囊体的位置,并且调整胶囊体在一个合适的位置。
    在这里插入图片描述
  3. 将Main Camera拖拽到到player内作为子对象,重置一下Main Camera的transform,并且再调整一下它在player中的位置。大致放在胶囊体的上方位置,像眼睛一样。
    在这里插入图片描述
  4. 在project视图中右键创建一个文件夹Scripts用来存放脚本,进入文件夹右键创建一个脚本并且命名为Camrea Controller将创建好的脚本添加到Main Camrea内用来控制相机。
    在这里插入图片描述
  5. 打开脚本进行编写
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    //获得player的transform
    public Transform player;
    //获取鼠标移动的值
    private float mouseX, mouseY;
    //添加鼠标灵敏度
    public float mouseSensitivity;
    //声明变量来累加mouseY
    public float xRotation;

    
    void Update()
    {
        //获得鼠标左右移动的值
        mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        //获得鼠标上下移动的值
        mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

        xRotation -= mouseY;
        //用数学函数Mathf.Clamp()将xRotation的值限制在一个范围内
        xRotation = Mathf.Clamp(xRotation, -70, 70);

        //使用transform中的Rotate()方法使player旋转
        player.Rotate(Vector3.up * mouseX);
        //使用transform.localRotation()方法使相机上下旋转
        transform.localRotation = Quaternion.Euler(xRotation, 0, 0);
    }
}

6.设置一下脚本的参数
在这里插入图片描述

  1. 再创建一个脚本Player Controller用来控制角色的移动跳跃。
    将胶囊体原有的coollder删除添加一个Character Controaller这个组件中包括了碰撞器与刚体组件。
    在这里插入图片描述
  2. 编写控制角色的脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerControaller : MonoBehaviour
{
    
    //获得Player的CharacterController组件
    private CharacterController cc;
    [Header("移动参数")]
    //定义player的移动速度
    public float moveSpeed;
    [Header("跳跃参数")]
    //定义player的跳跃速度
    public float jumpSpeed;

    //定义获得按键值的两个变量
    private float horizontalMove, verticalMove;

    //定义三位变量控制方向
    private Vector3 dir;
    //定义重力变量
    public float gravity;
    //定义y轴的加速度
    private Vector3 velocity;
    //检测点的中心位置
    public Transform groundCheck;
    //检测点的半径
    public float checkRadius;
    //定义需要检测的图层
    public LayerMask groundLayer;
    [Header("检测角色状态")]
    public bool isOnground;
    public bool isJump;
    void Start()
    {
        //用GetComponent<>()方法获得CharacterController
        cc = GetComponent<CharacterController>();
    }

    
    void Update()
    {
        //使用Physics.CheckSphere()方法改变isOnground的值为true
        isOnground = Physics.CheckSphere(groundCheck.position,checkRadius,groundLayer);

        if(isOnground && velocity.y < 0)
        {
            velocity.y = -1f;
        }

        //用Input.GetAxis()方法获取按键左右移动的值
        horizontalMove = Input.GetAxis("Horizontal") * moveSpeed;
        //用Input.GetAxis()方法获取按键前后移动的值
        verticalMove = Input.GetAxis("Vertical") * moveSpeed;

        //将方向信息存储在dir中
        dir = transform.forward * verticalMove + transform.right * horizontalMove;
        //用CharacterController中的Move()方法移动Player
        cc.Move(dir * Time.deltaTime);

        //当键盘按空格的时候可以完成角色的跳跃,并且使角色只能够跳跃一次
        if (Input.GetButtonDown("Jump") && isOnground)
        {
            velocity.y = jumpSpeed;
            isJump = true;
        }

        //通过每秒减去重力的值不断下降
        velocity.y -= gravity * Time.deltaTime;
        //用CharacterController中的Move()方法移动y轴
        cc.Move(velocity * Time.deltaTime);
    }
}
  1. 在胶囊体下新建一个空物体用来判断角色是否碰到地面图层,并且将位置调整到胶囊体的底部。
    在这里插入图片描述
  2. 将地面的图层设置为ground

在这里插入图片描述

  1. 对控制角色移动的脚本添加相应的参数

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_细嗅蔷薇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值