unity3d实现第一人称射击游戏之CS反恐精英(四)(子弹模块,音效特效)

实现思想

由于子弹的速度非常快,直接让子弹像现实中那样移动很容易发生’穿模‘现象,所以我们用unity中的射线来实现,当用户点击鼠标左键的时候,播放开枪动画,火花特效,开火音效,枪口发射一条射线,检测到碰撞器后再根据物体上的位置添加特效贴图。如果是敌人就根据位置去减血(因为网络模块还没有做,这一块后面来实现)

整理下流程图 ,黑色现在不实现

unity3d实现第一人称射击游戏之CS反恐精英(四)(子弹模块,音效特效)_第1张图片

下面开始具体实现

再gun下面添加脚本 Shoot

unity3d实现第一人称射击游戏之CS反恐精英(四)(子弹模块,音效特效)_第2张图片

编辑脚本

 void Update()
    {
       if( Input.GetButtonDown("Fire1")){
            //开枪动画

            //火花特效

            //发射射线

            //判断是否击中

            //判断是否击中敌人

            //子弹弹痕贴图
        }

    }

Input.GetButtonDown("Fire1")是unity自带的鼠标左键事件

第一步 开枪动画

unity3d实现第一人称射击游戏之CS反恐精英(四)(子弹模块,音效特效)_第3张图片

先创建动画控制器,双击打开

其中灰色的是导入枪模型自带的开火动画,但是默认是三连发的,黄色的是自己录制的枪闲置的动画,什么也不做

unity3d实现第一人称射击游戏之CS反恐精英(四)(子弹模块,音效特效)_第4张图片

添加bool参数Shoot控制开枪状态(不懂动画的同学请百度下吧)

然后去编辑脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// 
///
///
public class Shoot : MonoBehaviour
{
    //动画控制器
    private Animator animator;
    [SerializeField]
    //弹痕
    private GameObject bulletTextcute;
    [SerializeField]
    //枪口
    private Transform FirePoint;
    //开枪动画时间
    private float timer;
    //开枪音效
    [SerializeField]
    private AudioSource ShootAudio;
    //开枪火花例子特效
    [SerializeField]
    private GameObject firePointParticle;
    // Start is called before the first frame update
    void Start()
    {
        animator = transform.Find("Model").GetComponent();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //设置开枪间隔时间是0.1秒
            if (Time.time - timer > 0.1)
            {
                //开枪音效
                ShootAudio.Play();
                //开枪动画
                animator.SetBool("Shoot", true);
                timer = Time.time;
                //火花特效
                GameObject filego=  GameObject.Instantiate(firePointParticle, FirePoint);
                filego.GetComponent().Play();
                //发射射线
                RaycastHit hit;
                //判断是否击中
                if (Physics.Raycast(FirePoint.position, -FirePoint.right, out hit, 200))
                {
                    //子弹弹痕贴图
                    GameObject go = GameObject.Instantiate(bulletTextcute, hit.point + 0.01f * hit.normal, Quaternion.Euler(Vector3.zero));
                    //注视旋转
                    go.transform.LookAt(hit.point + hit.normal);
                }
            }
            else {
                animator.SetBool("Shoot", false);
            }
        }
        else
        {
            animator.SetBool("Shoot", false);
        }
    }

}

关于音效和弹痕贴图都是百度下载并且再ps上扣图的,有一需要注意再弹痕贴图材质的 Rendering Mode 不能选择 Opaque否则图就白扣了,坑了我半个小时。

上面代码我只讲解下弹痕贴图生成的位置,我们需要弹痕贴在墙上,通过射线结果hit可以获取射中的世界坐标和相对于击中点的法线坐标,所以实例化弹痕贴图旋转的时候需要注意是point+nomal,网上还有另外一种修改墙壁的图片像素去实现的,感兴趣的同学可以自己了解下。

需要补充的是  在弹痕贴图和火花特效 我都是放在了预制件中拖拽到变量里面的,并且两个都需要挂载定时删除的脚本,弹痕贴图是2秒消除,火花是0.1秒消除,火花特效在导入枪的时候附加的有,并且开枪动画也有,下面看下截图

unity3d实现第一人称射击游戏之CS反恐精英(四)(子弹模块,音效特效)_第5张图片

最后我把弹痕的扣图上传上来,

unity3d实现第一人称射击游戏之CS反恐精英(四)(子弹模块,音效特效)_第6张图片

 

这篇文章可能讲解的并不像前几篇那么细,希望读者自己 去学习下动画系统,声音,粒子系统这些比较死的东西,这些学习资料很多,然后需要你自己去拼凑起来,不要担心自己拼凑的对不对是不是这样拼凑的,只要你能实现功能就OK。

你可能感兴趣的:(c#,unity实现游戏)