一、第一人称角色
1.在场景中新建几个3D物体:Plane,作为地面;4个cube,作为墙面,每个物体的transform都在创建后reset一下,然后再移动到合适的位置。这样一个简单的场景就搭建完成了。
2.在场景中新建一个空物体,reset一下,然后重命名为Player;创建一个胶囊物体(Capsule),作为角色的身体,也一样reset一下,然后把胶囊体变成Player的子物体;在物体身体的正前方偏上的位置增加一个正方体(Cube),调整大小和位置,作为角色的眼镜(可以把材质改为黑色或其他颜色),然后把正方体也变成Player的子物体。这样人物的身体就做好了。最后把Player的位置调整到地面(plane)上面
3.把摄像机放到眼镜的位置,调整到合适的角度,使视口朝外。摄像机也变成Player的子物体。
4.给Player增加一个角色控制器组件(Character Controller),调整Character Controller上的数值,使其网格的大小正好可以包裹住胶囊体。
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);
}
}