实现玩家攻击。(Unity)

因为这个例子是射击游戏可以和其他的攻击效果不一样,但大致一样,可能在设置效果和代码上有部分区别。


首先需要把粒子效果设置好,比如开枪的光线,枪口的冒烟,开枪的光度和开枪的声音等待。具体要求按具体效果来实现。一般场景中的设置好了,如果没有可以自己进行调试。在右键创建效果组件中有一个粒子系统,通过这个可以设置效果。

 并且要挂载对应的组件。

 并且要让玩家识别攻击的对象,一般通过给敌人添加一个独一无二的的图层,让玩家能够失败敌人并且进行攻击可以掉血,当敌人血量<=0时代表敌人死亡,需要进行销毁。

 创建脚本来实现效果,一般玩家是通过射线检测来判断有没有碰到敌人。而敌人一般是通过trigger触发器来检测,在范围内进行攻击,超出范围则不攻击。

 代码实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerShoot : MonoBehaviour
{
    // Start is called before the first frame update

    //玩家的攻击力
    public int atk = 20;
    //射击时间间隔
    float gunColdTime = 0.15f;
    //射击效果显示时间
    float gunDisplayTime = 0.2f;
    //射击音效
    AudioSource shootAudio;
    //射线
    Ray gunRay;
    RaycastHit gunHit;
    //粒子特效
    ParticleSystem gunParticleSystem;
    //枪源
    Light gunLight;
    //机枪光线
    LineRenderer gunLine;
    //射击对象
    LayerMask layerMask;
    //计时器
    float timer;

    void Start()
    {
        shootAudio = GetComponent<AudioSource>();
        gunParticleSystem=GetComponent<ParticleSystem>();
        gunLight=GetComponent<Light>();
        gunLine=GetComponent<LineRenderer>();
        layerMask = LayerMask.GetMask("shootTable");
    }

    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        //如果按下鼠标左键并且时间间隔大于冷却时间则进行攻击
        if (Input.GetKey(KeyCode.Mouse0) && timer>gunColdTime)
        {
            //射击
            shoot();
        }
        if (timer > gunColdTime * gunDisplayTime)
        {
            //开枪结束
            displayGun();
        }
    }
    //实现结束开枪
    void displayGun()
    {
        gunLight.enabled = false;
        gunLine.enabled = false;
    }
    //实现射击方法
    public void shoot()
    {
        timer = 0;
        //播放射击音效
        shootAudio.Play();
        //光源
        gunLight.enabled = true;
        //光枪
        gunLine.enabled = true;
        //射线的起始位置
        gunRay.origin = transform.position;
        //射线的方向
        gunRay.direction = transform.forward;
        //粒子特效
        gunParticleSystem.Stop(); //停止
        gunParticleSystem.Play(); //启动
        //枪的第一个点
        gunLine.SetPosition(0, transform.position);
        //判断是否射击到了场景里的游戏对象
        if(Physics.Raycast(gunRay, out gunHit, 100f, layerMask))
        {
            //判断是否达到敌人
            EnemyHP enemyHP = gunHit.collider.GetComponent<EnemyHP>();
            if (enemyHP != null)
            {
                enemyHP.Attacked(atk,gunHit.point);
            }
            gunLine.SetPosition(1, gunHit.point);
        }
        else
        {
            gunLine.SetPosition(1, gunRay.origin + gunRay.direction * 100f);
        }
    }
}


图片实现: 

 以上方法不唯一,此部分有点小难度需要花时间去理解玩家攻击的实现逻辑,如果有错误则进行检测并修改,通过修改进行改正达到满意的效果。

 上面代码顺序不一样,可能会导致运行出错,如需要得进行完整性使用,才能保证项目正常运行。如出错请认真检查并且通过调整看看是否能达到效果。如有更好的方法,请在下方留言!谢谢你的观看!!!


-----------------------------------------------------------END--------------------------------------------------------------- 

猜你喜欢

转载自blog.csdn.net/weixin_57813136/article/details/132131463