角色控制器的添加:
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);//寻路者要找的目标
}
}