一、第一人称角色

1.在场景中新建几个3D物体:Plane,作为地面;4个cube,作为墙面,每个物体的transform都在创建后reset一下,然后再移动到合适的位置。这样一个简单的场景就搭建完成了。

unity 帧率45_3d

2.在场景中新建一个空物体,reset一下,然后重命名为Player;创建一个胶囊物体(Capsule),作为角色的身体,也一样reset一下,然后把胶囊体变成Player的子物体;在物体身体的正前方偏上的位置增加一个正方体(Cube),调整大小和位置,作为角色的眼镜(可以把材质改为黑色或其他颜色),然后把正方体也变成Player的子物体。这样人物的身体就做好了。最后把Player的位置调整到地面(plane)上面

unity 帧率45_3d_02

3.把摄像机放到眼镜的位置,调整到合适的角度,使视口朝外。摄像机也变成Player的子物体。

unity 帧率45_Time_03

4.给Player增加一个角色控制器组件(Character Controller),调整Character Controller上的数值,使其网格的大小正好可以包裹住胶囊体。

unity 帧率45_3d_04

5.在资源窗口新建一个C#脚本文件,命名为PlayerMove,然后挂载到Player上,编写并保存脚本文件后;把Player的Character Controller组件拖拽到脚本上的PlayerController中;运行后可以用WSAD或者上下左右箭头控制Player前后左右移动:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{

    public float MoveSpeed=5f;//定义一个移动速度MoveSpeed 其类型为public类型

    //定义两个私有类型的浮点型数据horizontal和vertical来记录A、D键和
    //W、S键的数据,也可以理解为记录水平轴和竖直轴的数据,即X轴和Y轴 
    private float horizontal;
    private float vertical;

    //定义一个重力gravity 
    private float gravity = 9.8f;
    //定义一个起跳速度
    public float JumpSpeed = 15f;
    //定义一个公有类型的CharacterController,将其命名为PlayerController
    //用于实例化对象
    public CharacterController PlayerController;

    //定义一个Vector3,既表示向量的位置,也表示向量的方向
    Vector3 Player_Move;

 
    void Update()
    {
        //判断PlayerController是否在地面上,如果不是在地面上就不能够前后左右移动,也不能够起跳
        if (PlayerController.isGrounded)
        {
            //获取X(横轴)轴方向的值给horizontal
            horizontal = Input.GetAxis("Horizontal");
            //获取Z(纵轴)轴方向的值给Vertical
            vertical = Input.GetAxis("Vertical");

            //transform为本物体所在位置,forward是向前的一个分量,right是向右的一个分量
                      
            Player_Move = (transform.forward * vertical + transform.right * horizontal) * MoveSpeed;

            //判断玩家是否按下空格键
            if (Input.GetAxis("Jump") == 1)
            {
                //按下空格键,给其竖直方向添加一个向上的数度,使其跳起
                //Player_Move.y相当于Player_Move下的Vector3(0,1,0)
                Player_Move.y = Player_Move.y + JumpSpeed;
            }
        }

        //模拟重力下降的效果,让向上的量减去重力下降的量
        Player_Move.y = Player_Move.y - gravity * Time.deltaTime;

        //PlayerController下的.Move为实现物体运动的函数
        //Move()括号内放入一个Vector3类型的量,本例中为Player_Move
        PlayerController.Move(Player_Move * Time.deltaTime);
    }

}

6.新建一个C#脚本,重命名为CameraCtrler,挂载到主摄像机上(Main Camera),把Player物体拖拽到CameraRotation内,并给鼠标灵敏度填写一个数值,运行游戏后,鼠标就可以控制物体旋转了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraCtrler : MonoBehaviour
{


    public Transform CameraRotation;//定义摄像机旋转的Transform
    private float Mouse_X;//定义鼠标在X轴方向上的移动数值
    private float Mouse_Y;//定义鼠标在y轴方向上的移动数值
    public float MouseSensitivity;//定义鼠标灵敏度
    public float xRotation;//定义物体在X轴方向上转动角度




    void Start()
    {

    }

    private void Update()
    {
        //把鼠标输入的值乘上鼠标灵敏度乘上时间变化量,赋值给Mouse_X和Mouse_Y
        Mouse_X = Input.GetAxis("Mouse X") * MouseSensitivity * Time.deltaTime;
        Mouse_Y = Input.GetAxis("Mouse Y") * MouseSensitivity * Time.deltaTime;
        xRotation -= Mouse_Y;
        //限制物体在X轴上的转动角度
        xRotation = Mathf.Clamp(xRotation, -90f, 90f);
        CameraRotation.Rotate(Vector3.up * Mouse_X);
        this.transform.localRotation = Quaternion.Euler(xRotation, 0, 0);
    }


}