第一人称控制器(发射打击效果 开倍镜效果)

很久没有更新了,见天给大家来一个第一人称控制器外加倍镜效果 以及发射子弹(用射线实现)

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 可以联系我

发布了52 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/102879257