プレイヤーの攻撃を実装します。(団結)

この例では、シューティングゲームの攻撃効果は他の攻撃とは異なる場合がありますが、それらはほぼ同じであり、設定効果やコードに多少の違いがある可能性があります。


まず、銃の光、銃口からの煙、銃の明るさ、銃の音などのパーティクル エフェクトを設定する必要があります。特定の要件は、特定の効果に従って実現されます。一般的なシーンの設定は準備ができていますが、準備ができていない場合は自分でデバッグできます。右クリックでエフェクト コンポーネントを作成するパーティクル システムがあり、これを通じてエフェクトを設定できます。

 そして、対応するコンポーネントを実装します。

 そして、プレイヤーが攻撃のターゲットを識別できるようにするために、通常、敵に独自のレイヤーを追加することで、プレイヤーは敵を倒し、攻撃して血液を失うことができます。敵の血液量 <= 0 の場合、敵は死んでいることを意味しますそして破壊する必要があります。

 エフェクトを実現するためのスクリプトを作成します。通常、プレイヤーは光線検出を使用して敵に遭遇したかどうかを判断します。通常、敵はトリガーで感知され、その範囲内を攻撃し、範囲外には攻撃をしません。

 コード:

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);
        }
    }
}


イメージの実装: 

 

 上記の方法は特別なものではありませんが、この部分は少し難しく、プレイヤーの攻撃の実装ロジックを理解するのに時間がかかりますが、エラーがあればそれを検出して修正し、修正によって修正することで満足のいく効果が得られます。

 上記のコードの順序が異なると、操作時にエラーが発生する可能性があります。プロジェクトが正常に動作するために、必要に応じて完全に使用する必要があります。間違えた場合は効果が得られるかよく確認して調整してください。もっと良い方法がある場合は、以下にメッセージを残してください。見てくれてありがとう!


-------------------------------------------------- ---------終了-------------------------------------- ------------------------ 

おすすめ

転載: blog.csdn.net/weixin_57813136/article/details/132131463