方法一、
特点:相机不用放在玩家模型下方,适合第一人称射击游戏的单人模式使用
一、创建第一人称主角
因为是第一人称,玩家看不见自己,所以直接用胶囊体替代,在胶囊体上添加Character Controller组件,控制玩家移动
二、控制玩家行走跳跃
1、在玩家身上添加PlayerControl脚本控制玩家移动
private CharacterController cc;//获取组件
public float MoveSpeed = 10;//移动速度
void Start () {
cc = GetComponent<CharacterController>();//得到组件
}
2、添加移动方法,并且在Update方法中调用
void Update () {
PlayerWalk();//玩家行走方法
}
void PlayerWalk()//玩家行走方法
{
float h = Input.GetAxis("Horizontal");//得到水平轴输入
float v = Input.GetAxis("Vertical");//得到垂直轴输入
cc.Move(cc.transform.TransformDirection(new Vector3(h, 0, v) * Time.deltaTime * MoveSpeed));//控制玩家以自身坐标方向移动
}
3、实现玩家跳跃
public float vy = 0;//重力
public float gravity = -5;//重力加速度
void PlayerWalk()//玩家行走方法
{
float h = Input.GetAxis("Horizontal");//得到水平轴输入
float v = Input.GetAxis("Vertical");//得到垂直轴输入
if (!cc.isGrounded)//玩家没有落地
{
vy += gravity * Time.deltaTime;//重力计算
}
//主角跳跃
if (cc.isGrounded&& Input .GetKeyDown(KeyCode.Space))//按下空格键并且玩家已经落地
{
vy = 2f;
}
cc.Move(cc.transform.TransformDirection(new Vector3(h, vy, v) * Time.deltaTime * MoveSpeed));//控制玩家以自身坐标方向移动
}
三、摄像机设置
1、在PlayerControl脚本中进行相机控制
private Camera m_camera; //添加相机组件
void Start () {
m_camera = Camera.main;//将当前相机设为主相机
}
2、添加相机控制方法,并且在Update方法中调用
void CameraControl()//摄像机控制
{
Vector3 cmEuler = m_camera.transform.eulerAngles;
cmEuler.y += Input.GetAxis("Mouse X");//获取鼠标输入
cmEuler.x -= Input.GetAxis("Mouse Y");
m_camera.transform.eulerAngles = cmEuler;
}
void Update () {
PlayerWalk();//玩家行走方法
CameraControl();//摄像机控制
}
3、摄像机的跟随,添加摄像机高度
public float cmHight = 0.5f;//相机高度
4、在相机控制函数CameraControl方法中同步相机和玩家视角
void CameraControl()//摄像机控制
{
Vector3 cmEuler = m_camera.transform.eulerAngles;
cmEuler.y += Input.GetAxis("Mouse X");//获取鼠标输入
cmEuler.x -= Input.GetAxis("Mouse Y");
m_camera.transform.eulerAngles = cmEuler;//得到当前摄像机旋转角度
cmEuler.x = cmEuler.z = 0;
transform.eulerAngles = cmEuler;//同步玩家旋转角度
//摄像机的跟随
m_camera.transform.position = transform.position+new Vector3(0,cmHight,0);//当前位置等于摄像机位置
}
代码总
private CharacterController cc;//获取组件
public float MoveSpeed = 10;//移动速度
public float vy = 0;//重力
public float gravity = -5;//重力加速度
private Camera m_camera; //添加相机组件
public float cmHight = 0.5f;//相机高度
void Start () {
cc = GetComponent<CharacterController>();//得到组件
m_camera = Camera.main;//将当前相机设为主相机
}
void Update () {
PlayerWalk();//玩家行走方法
CameraControl();//摄像机控制
}
void PlayerWalk()//玩家行走方法
{
float h = Input.GetAxis("Horizontal");//得到水平轴输入
float v = Input.GetAxis("Vertical");//得到垂直轴输入
if (!cc.isGrounded)//玩家没有落地
{
vy += gravity * Time.deltaTime;//重力计算
}
//主角跳跃
if (cc.isGrounded&& Input .GetKeyDown(KeyCode.Space))//按下空格键并且玩家已经落地
{
vy = 2f;
}
cc.Move(cc.transform.TransformDirection(new Vector3(h, vy, v) * Time.deltaTime * MoveSpeed));//控制玩家以自身坐标方向移动
}
void CameraControl()//摄像机控制
{
Vector3 cmEuler = m_camera.transform.eulerAngles;
cmEuler.y += Input.GetAxis("Mouse X");//获取鼠标输入
cmEuler.x -= Input.GetAxis("Mouse Y");
m_camera.transform.eulerAngles = cmEuler;//得到当前摄像机旋转角度
cmEuler.x = cmEuler.z = 0;
transform.eulerAngles = cmEuler;//同步玩家旋转角度
//摄像机的跟随
m_camera.transform.position = transform.position+new Vector3(0,cmHight,0);//当前位置等于摄像机位置
}
四、添加脚步声
在玩家身上添加脚本StopSound,控制脚步声播放
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(AudioSource))]//表示游戏物体想要挂此脚本时,必须有AudioSource脚本,没有的话,该代码会自动创建AudioSource组件
public class StopSound : MonoBehaviour {
public AudioClip[] stopSound;//将脚步声存进数组中
private CharacterController cc;//得到玩家身上的角色控制器
private AudioSource _audio;//添加组件
void Awake()//得到组件
{
cc = GetComponent<CharacterController>();
_audio = GetComponent<AudioSource>();
}
void Start () {
StartCoroutine(PlaySound());
}
IEnumerator PlaySound()
{
while (true)
{
if (cc.isGrounded && cc.velocity.sqrMagnitude > 0.3f)//玩家着地,并且速度的平方大于0.3时
,sqrMagnitude返回这个向量的长度的平方(只读){
AudioClip acp = stopSound[Random.Range(0, stopSound.Length)];//随机播放脚步声
_audio.PlayOneShot(acp);//只播放一次
yield return new WaitForSeconds(acp.length);
}
else
{
yield return null;//如果不满足上述条件,就直接返回,执行下一个循环
}
}
}
}
方法二、
特点:角色控制脚本和相机控制脚本分开,适合第一人称射击游戏的对战模式使用,相机需要放到模型下方,和方法一相比,除了相机设置不同之外,其他的设置都一样
虽然是第一人称,玩家看不见自己,但是这是对战模式,对方可以看见自己,所以我们使用模型,将模型拖进场景,命名为Player,在Player上上添加Character Controller组件,控制玩家移动
摄像机设置
1、因为相机的旋转是由鼠标在屏幕上的x和y轴控制的,x轴控制相机水平方向旋转,所以鼠标在屏幕上的X轴移动即是相机在三维空间围绕自身的Y轴旋转,Y轴控制相机垂直方向旋转,
所以鼠标在屏幕上的Y轴移动即是相机在三维空间中围绕自身的X轴旋转,将相机放到模型下方,在相机上创建MouseLook脚本中进行相机控制
public enum RotationAxes { MouseXandY = 0, MouseX = 1, MouseY = 2 }//鼠标控制的枚举类型
public RotationAxes axes = RotationAxes.MouseXandY;//默认鼠标X轴和Y轴一起控制
public float sensitivityX = 15f;//鼠标X方向的灵敏度
public float sensitivityY = 15f;//鼠标Y方向的灵敏度
public float minimunX = -360f;//鼠标X轴旋转的最小范围
public float maximunX = 360f;//鼠标X轴旋转的最大范围
public float minimunY = -60f;//鼠标Y轴旋转的最小范围
public float maximunY = 60f;//鼠标Y轴旋转的最大范围
float rotationY = 0f;//鼠标Y轴旋转的范围
2、添加相机控制方法,并且在Update方法中调用
void Update () {
CameraControl();//摄像机控制
}
void CameraControl()//摄像机控制
{
if (axes == RotationAxes.MouseXandY)
{
float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp(rotationY, minimunY, maximunY);
transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
else if (axes == RotationAxes.MouseX)//当控制为鼠标X轴时
{
transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);//当前围绕Y轴水平旋转
}
else//当鼠标控制为Y轴时
{
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;//得到鼠标旋转的范围
rotationY = Mathf.Clamp(rotationY, minimunY, maximunY);//Mathf.Clamp(范围,参数1,参数2)表示将参数1和参数2限制在范围之内,
//当返回值小于参数1时,结果就返回参数1,当返回值大于参数2时,结果就返回参数2,,当在参数1和参数2之间时,结果就返回范围的值
transform.localEulerAngles = new Vector3(-rotationY+90 , 0, 0);//得到当前本地坐标的旋转
}
}
3、在相机上添加MouseLook脚本,选择Mouse Y控制,在玩家模型上添加MouseLook脚本,选择Mouse X控制