角色控制器的添加

1)添加一个空物体:将属性面板中的Tag修改为Player;

2)添加刚体组件:取消属性面板中的重力(Use Gravity)同时勾选使其不受物理的影响(Is Kinematic)只接受交互和变换组件的控制

3)添加角色控制器:在菜单栏中的Component>Physics>Character Controller

4)新建一个脚本代码,完成Player的移动代码,将人物绑定在摄像机上

将武器绑定在角色控制器上,即绑定在摄像机上,三者一起移动

1)选中摄像机>在属性面板中选中设置中的Reset(在transform属性中)对摄像机进行重置。

2)将transform>Clipping Planes中的near属性修改为0.1,这样摄像机可以看更近处的物体。

3)在unity官网上下载枪支素材,导入后,对其进行1)中的步骤,使枪支和摄像机位置保持一致。然后让摄像机成为枪支的子物体

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Player : MonoBehaviour {
public Transform m_transform;//首先定义一个变换组件
    CharacterController m_ch;
float m_movSpeed = 5.0f;//控制角色的移动速度
float m_gravity = 6.0f;//角色受到的重力
public int m_life = 5;//角色所拥有的寿命值
public float m_jumpSpeed = 10.0f;//角色的跳跃速度
private Vector3 m_movDirection = Vector3.zero;//定义角色的起始位置,从原点开始
    Transform m_camTransform;//将摄像机和人物联合起来
    Vector3 m_camRot;//摄像机旋转
float m_camHeight = 1.4f;//摄像机的高度等于主角高度
void Start ()//初始化相关数据
    {
        m_transform = this.transform;
        m_ch = this.GetComponent<CharacterController>();//初始化角色
        m_camTransform = Camera.main.transform;//定义摄像机的初始化位置
        Vector3 pos = m_transform.position;
        pos.y += m_camHeight;
        m_camTransform.position = pos;
        m_camTransform.rotation = m_transform.rotation;
        m_camRot = m_camTransform.eulerAngles;
//这三行代码是指摄像机的位置和角度等完全和角色控制器保持一致
        Screen.lockCursor = true;//锁定鼠标
    }
void Update ()
    {
if (m_life <= 0)
return;//如果人物的寿命值小于等于0时,进行控制语句
//在Update中调用下面的Control函数
        Control();
    }
void Control()
    {
float rh = Input.GetAxis("Mouse X");//控制鼠标水平方向上的滑动距离
float rv = Input.GetAxis("Mouse Y");//控制鼠标垂直方向上的滑动距离
        m_camRot.x -= rv;
        m_camRot.y += rh;
        m_camTransform.eulerAngles = m_camRot;//摄像机的旋转角度和角色控制器保持一致
        Vector3 camRot = m_camTransform.eulerAngles;
        camRot.x = 0; camRot.z = 0;
        m_transform.eulerAngles = camRot;
//上三行代码的意思是使摄像机的方向和角色控制器方向保持一致
        Vector3 pos = m_transform.position;
        pos.y += m_camHeight;
        m_camTransform.position = pos;//最终的控制代码
float xm = 0, ym = 0, zm = 0;
        ym -= m_gravity * Time.deltaTime;//既有长度又有方向的就称之为矢量
if(Input.GetKey(KeyCode.W))//使用WASD键来控制人物的移动
        {
            zm+=m_movSpeed * Time.deltaTime;//速度乘以帧数(即速度)就是人物移动的距离
        }
if (Input.GetKey(KeyCode.S))
        {
            zm-= m_movSpeed * Time.deltaTime;
        }
if (Input.GetKey(KeyCode.A))
        {
            xm-= m_movSpeed * Time.deltaTime;
        }
if (Input.GetKey(KeyCode.D))
        {
            xm+= m_movSpeed * Time.deltaTime;//同理
        }
else if(Input.GetKey(KeyCode.D ))
        {
            xm += m_movSpeed * Time.deltaTime;
        }
if(Input.GetKeyDown(KeyCode .Space))
        {
            m_movDirection.y = m_jumpSpeed;//单击空格键人物跳跃
        }
        m_movDirection.y -= m_gravity * Time.deltaTime;//当人物向上跳时,受到的重力是向下的
        m_ch.Move(m_transform.TransformDirection(new Vector3(xm, ym, zm)));
        m_ch.Move(m_movDirection * Time.deltaTime);
    }
}
给敌人添加寻路功能
1)保持敌人所能到达的地方的Static勾选(至少是Navigation Static)
2)对完整的场景进行烘焙,将不需要进行烘焙的内容取消点选static。
敌人的导入
1)在素材商城中搜索导入相关的将是素材(可以选择搜索Zombie)
2)为敌人添加烘焙和寻路组件(菜单栏>Component>Navigation>Nav Mesh Agent)
3)使用脚本对其进行控制:此时敌人是会直接行走到主角的出生点
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Enemy : MonoBehaviour
{
    Transform m_transform;//定义变换组件
    Player m_player;//
//public UnityEngine.AI.NavMeshAgent playerAgent;
    NavMeshAgent m_agent;//寻路组件的引用
float m_movSpeed = 50.0f;//敌人的移动速度
private void Start()//初始化
    {
        m_transform = this.transform;
        m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();//获取tag
        m_agent = GetComponent<NavMeshAgent>(); //获取寻路组件
        m_agent.speed = m_movSpeed;//确定步行器的寻路速度
        m_agent.SetDestination(m_player.m_transform.position);//寻路者要找的目标
    }
}