很久没有更新了,见天给大家来一个第一人称控制器外加倍镜效果 以及发射子弹(用射线实现)
1.搭建场景
我们首先下载一个手模,然后把它和我们要弄的摄像头的相对位置 以及子父物体关系弄好
比如摄像头是父物体 手模是子物体
然后我们运行游戏 发现手模会出现在摄像头渲染的范围内
上图为运行界面
2.第一人称的视角旋转以及移动
我们就开始它的第一个脚本(FirstCamera)
首先我们给摄像头添加一个Character Controller组件 这个组件是第一人称控制器比较简单和方便的方法
使用效果也比较好 所以我们使用这个
我先给出代码在进行解释
private CharacterController Chc;//角色控制器
private Vector3 Dir;//方向
private int speed;//速度
private Vector3 primitiveRot;
private void Start()
{
Cursor.visible = false;//鼠标图标消失
Cursor.lockState = CursorLockMode.Locked;//鼠标位于屏幕中心
Chc = GetComponent<CharacterController>();
primitiveRot = transform.eulerAngles;
}
private void Update()
{
Move();
Rotate();
Mirror();
if (AttackTimer >= 2)
{
ShootBullet();
}
else
{
AttackTimer += Time.deltaTime;
}
}
public void Move()//移动
{
if (Chc.isGrounded)//检测是否触底
{
Dir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
//获取键盘输入wasd键或方向键
Dir = transform.TransformDirection(Dir);
if (Input.GetKey(KeyCode.LeftShift))//按下左shift键 移速加快相当于跑
{
speed = 14;
}
else
{
speed = 7;
}
Dir = Dir * speed;
if (Input.GetKeyDown(KeyCode.Space))//跳
{
Dir.y = 7;
}
if(Input.GetKey(KeyCode .LeftShift )&&Input.GetKeyDown (KeyCode .Space))//蹲跳
{
Dir.y = 10;
}
}
Dir.y -= 20 * Time.deltaTime;
Chc.Move(Dir * Time.deltaTime);
}
public void Rotate()//旋转
{
float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");
primitiveRot.x -= y;
primitiveRot.y += x;
transform.eulerAngles = primitiveRot;
}
然后和上边变量都是private类型的 不用再unity中赋值
如果发生报错 就检查主摄像机是否添加Character Controller组件
上边用到了Character Controller组件的几个方法 如果有不懂的可以去unity官方API 查询或者去我的前几篇博客查询
3.实现倍镜效果
倍镜效果 我们可能觉得比较难搞,其实和简单 利用UI的操作
我们先下载好一个倍镜UI 的素材 然后给一个Image赋值 并且在游戏视角里把大小调好
很简单的 然后就开始我们的脚本的添加了 还是老规矩
下面给出的代码是添加在上边的代码 补充到上边的代码即可 不用另外写一个脚本
public Image Scope;//开镜效果UI(记得添加using索引不然会报错)
public bool isMirror = false;//是否开镜
private bool isWhell = false; //检测鼠标滑轮的滑动
private Camera FirstCameras;//主摄像机
public void Mirror()//开镜(在Update力添加此函数)
{
if (Input.GetMouseButtonDown(1))//鼠标右键
{
isMirror = !isMirror;
//这个语句是实现每次点击鼠标右键 此bool值返回一个与上次相反的bool值
if (isMirror)//开镜状态
{
Scope.enabled = true;
FirstCameras.fieldOfView = 30;//视野范围 该值与目标点距离成正比
isWhell = true;//开始滑动检测
FirstCameras.cullingMask = (1 << 5) + (1 << 8);//该语句是渲染有关知识可暂时忽略
//只渲染第五层和第八层(Layer)
}
else//不开镜状态
{
Scope.enabled = false;
FirstCameras.fieldOfView = 60;//视野范围 该值与目标点距离成正比
isWhell = false;//关闭滑动检测
FirstCameras.cullingMask = -1;
//全部渲染(Layer)
}
}
if(isWhell)//如果滑动鼠标滑轮 实现改变视野大小
//大家如果玩过侠盗猎车 和里边的狙击枪的效果相同
{
FirstCameras.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * 20;
FirstCameras.fieldOfView = Mathf.Clamp(FirstCameras.fieldOfView, 4, 60);
//该值是限制视角的无穷变大或变小 Mathf.Clamp(变量,最小值,最大值)
//如果大于最大值 返回最大值 反之返回最小值
}
}
上边的注释真的很详细了 大家应该可以看懂
现在已经可以运行一个几乎可以玩的游戏了 推荐大家在商店中下载一个有趣的地图
4.利用射线实现射击效果
在这我先说一下 没有添加粒子效果 所以开枪没有任何标志物
public void ShootBullet()//发射子弹
{
if (Input.GetMouseButtonDown(0))//按下鼠标左键
{
AttackTimer = 0;//用于控制发射子弹频率在上边可以看到交互
AuidoManager.Instance.PlaySound("发射子弹");
//anim.CrossFade("Shake", 0.1f);
Ray ray= FirstCameras.ScreenPointToRay(Input.mousePosition);//发射射线
RaycastHit hit;
if(Physics .Raycast (ray,out hit, 1000))
{
if (hit.collider.tag == "Emeny")//检测碰撞
{
Destroy(Cube.gameObject);
}
}
}
}
上边的知识如果又不懂的可以看我之前的博客
大致就这么多吧 基本实现了第一人称射击游戏的功能了
如果大家还要更加完美 添加粒子系统 音效等效果
最后祝大家工作顺利 学业有成
本人QQ:1149293885 可以联系我