首页 > 其他分享 >Unity类银河战士恶魔城学习总结(P169 Hit and Critical FX暴击和攻击的特效)

Unity类银河战士恶魔城学习总结(P169 Hit and Critical FX暴击和攻击的特效)

时间:2024-12-08 15:03:07浏览次数:7  
标签:特效 P169 Hit 暴击 color sr void private SerializeField

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

本章节添加了暴击的攻击特效

EntityFX.cs

添加部分!!!

功能分析

1. 主要功能
  • CreateHitFX 方法:
    • 根据攻击是否为暴击(_critical),选择不同的特效预制体。
    • 生成击中特效时,随机调整特效的旋转角度和生成位置,使得特效看起来更加自然和多样化。
    • 在生成一段时间后销毁特效,避免游戏中出现过多的无用对象占用内存。

2. 功能实现细节
暴击特效
  • 选择暴击特效
    • 如果是暴击(_critical == true),特效预制体切换为 criticalHitFx
  • 额外旋转调整
    • 暴击特效的 Z轴旋转角度范围缩小到 -45° 到 45°,使暴击的特效看起来更加精准。
    • 如果攻击者的朝向(facingDir)为 -1(朝左),则设置 Y轴旋转角度为 180°,使特效方向与角色朝向保持一致。
    • 最终旋转向量:hitFXRotation = new Vector3(0, yRotation, zRotation)
特效生成
  • 生成特效实例
    • 调用 Instantiate 在目标位置生成特效实例,位置为 _target.position + 随机偏移,使每次击中特效的位置稍有不同。
  • 设置旋转角度
    • 调整生成的特效的旋转,使特效展示出多样化的方向。
  • 销毁特效
    • 调用 Destroy 在 0.5 秒后销毁特效对象,避免长期占用内存。
    [Header("攻击特效")]//Hit FX
    [SerializeField] private GameObject hitFX;
    [SerializeField] private GameObject criticalHitFx;

    public void CreateHitFX(Transform _target,bool _critical)//攻击特效
    {

        float zRotation = Random.Range(-90, 90);
        float xPosition = Random.Range(-.5f, .5f);
        float yPosition = Random.Range(-.5f, .5f);

        Vector3 hitFXRotation = new Vector3(0,0,zRotation);//生成的旋转向量

        GameObject hitPrefab = hitFX;

        if(_critical)//如果暴击
        {
            hitPrefab = criticalHitFx;

            float yRotation = 0;
            zRotation = Random.Range(-45, 45);

            if (GetComponent<Entity>().facingDir == -1)//如果玩家朝向左边
                yRotation = 180;

            hitFXRotation = new Vector3(0 , yRotation,zRotation);

        }

        GameObject newHitFX = Instantiate( hitPrefab , _target.position + new Vector3(xPosition,yPosition), Quaternion.identity);//生成特效实例

        newHitFX.transform.Rotate(hitFXRotation);//设置旋转角度

        Destroy(newHitFX,.5f);

    }

完整代码

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

public class EntityFX : MonoBehaviour
{
    private SpriteRenderer sr;

    [Header("Flash FX")]
    [SerializeField] private float flashDuration;
    [SerializeField] private Material hitMat;
     private Material originalMat;


    [Header("异常状态颜色")]//Ailment colors
    [SerializeField] private Color[] chillColor;
    [SerializeField] private Color[] igniteColor;
    [SerializeField] private Color[] shockColor;

    [Header("异常状态粒子")]//Ailment particles
    [SerializeField] private ParticleSystem igniteFx;
    [SerializeField] private ParticleSystem chillFx;
    [SerializeField] private ParticleSystem shockFx;

    [Header("攻击特效")]//Hit FX
    [SerializeField] private GameObject hitFX;
    [SerializeField] private GameObject criticalHitFx;



    private void Start()
    {
        sr = GetComponentInChildren <SpriteRenderer>();//这行代码使用 GetComponentInChildren 方法查找并获取当前游戏对象或其子对象中的 SpriteRenderer 组件,并将其赋值给 sr 变量。
        originalMat = sr.material;
    }

    public void MakeTransprent(bool _transparent)//攻击命中时候的透明特效
    {
        if (_transparent)
            sr.color = Color.clear;
        else
            sr.color = Color.white;
    }


    private IEnumerator FlashFX()//定义了一个私有的协程 FlashFX,用于在一段时间内改变 SpriteRenderer 的材质,然后恢复原始材质。
    {
        sr.material = hitMat;
        Color currentColor = sr.color;//保存最开始的颜色,闪光之后变回去

        sr.color = Color.white;
        yield return new WaitForSeconds(flashDuration);

        sr.color = currentColor;
        sr.material = originalMat;

    }

    //P59,骷髅战士的血条闪烁
    private void RedColorBlink()
    {
        if(sr.color !=Color.white)
            sr.color = Color.white;
        else
        {
            sr.color = Color.red;
        }
    }

    private void CancelColorChange()
    {
        CancelInvoke();//调用 CancelInvoke 方法取消所有与当前游戏对象关联的 Invoke 调用。
        sr.color = Color.white;

        igniteFx.Stop();
        chillFx.Stop();
        shockFx.Stop();
    }


    //10月30日
    //三个状态的携程
    public void ShockFxFor(float _seconds)
    {
        shockFx.Play();

        InvokeRepeating("ShockColorFx", 0, .3f);
        Invoke("CancelColorChange", _seconds);
    }



    public void IgniteFxFor(float _seconds)
    {
        igniteFx.Play();

        InvokeRepeating("IgniteColorFx", 0, .3f);
        Invoke("CancelColorChange", _seconds);
    }


    public void ChillFxFor(float _seconds)
    {
        chillFx.Play();

        InvokeRepeating("ChillColorFx", 0, .3f);
        Invoke("CancelColorChange", _seconds);
    }



    private void ShockColorFx()
    {
        if (sr.color != shockColor[0])
            sr.color = shockColor[0];
        else
        {
            sr.color = shockColor[1];
        }
    }


    private void IgniteColorFx()//燃烧状态颜色
    {
        if (sr.color != igniteColor[0])
            sr.color = igniteColor[0];
        else
        {
            sr.color = igniteColor[1];
        }
    }

    private void ChillColorFx()//燃烧状态颜色
    {
        if (sr.color != chillColor[0])
            sr.color = chillColor[0];
        else
        {
            sr.color = chillColor[1];
        }
    }


    public void CreateHitFX(Transform _target,bool _critical)//攻击特效
    {

        float zRotation = Random.Range(-90, 90);
        float xPosition = Random.Range(-.5f, .5f);
        float yPosition = Random.Range(-.5f, .5f);

        Vector3 hitFXRotation = new Vector3(0,0,zRotation);

        GameObject hitPrefab = hitFX;

        if(_critical)
        {
            hitPrefab = criticalHitFx;

            float yRotation = 0;
            zRotation = Random.Range(-45, 45);

            if (GetComponent<Entity>().facingDir == -1)//如果玩家朝向左边
                yRotation = 180;

            hitFXRotation = new Vector3(0 , yRotation,zRotation);

        }

        GameObject newHitFX = Instantiate( hitPrefab , _target.position + new Vector3(xPosition,yPosition), Quaternion.identity);

        newHitFX.transform.Rotate(hitFXRotation);

        Destroy(newHitFX,.5f);

    }
}
   

CharacterStats.cs

修改部分!!!

创建攻击的特效

bool criticalStrike = false;

fx.CreateHitFX(_targetStats.transform,criticalStrike);//创建击中特效
    public virtual void DoDamage(CharacterStats _targetStats)//只是一次物理攻击
    {
        bool criticalStrike = false;

        if (TargetCanAvoidAttack(_targetStats))
            return;

        _targetStats.GetComponent<Entity>().SetupKnockbackDir(transform);//设置击退方向

        int totalDamage = damage.GetValue() + strength.GetValue();

        if (Cancrit())
        {
            
            totalDamage = CalculateCriticalDamage(totalDamage);
            
            criticalStrike = true;
        }

        fx.CreateHitFX(_targetStats.transform,criticalStrike);//创建击中特效

        totalDamage = CheckTargetArmor(_targetStats, totalDamage);
        _targetStats.TakeDamage(totalDamage);//把造成的给到继承CharacterStats的类


        DoMagicDamage(_targetStats);//如果普通攻击不想要魔法伤害移除

    }

标签:特效,P169,Hit,暴击,color,sr,void,private,SerializeField
From: https://blog.csdn.net/suzh1qian/article/details/144267051

相关文章

  • 举例说说你对white-space属性的理解
    white-space属性控制如何处理元素中的空白字符,包括空格、制表符和换行符。它在前端开发中用于控制文本的渲染方式,特别是在处理多行文本或需要保留空格格式时非常有用。以下是一些white-space属性值的示例及其效果:normal(默认值):连续的空白字符会被合并成一个空格,换行符......
  • E86 换根DP CF1324F Maximum White Subtree
    视频链接:E86换根DPCF1324FMaximumWhiteSubtree_哔哩哔哩_bilibili  MaximumWhiteSubtree-洛谷|计算机科学教育新生态//换根DPO(n)#include<bits/stdc++.h>usingnamespacestd;constintN=200005;vector<int>e[N];intn,a[N],f[N];voiddfs(int......
  • ISSAC GYM解决RuntimeError: nvrtc: error: invalid value for --gpu-architecture (-
    起因一开始我什么都没干,就突然报了这么一个错误:我震惊了,因为我以为又是cuda沙雕了,没想到网上一查,真是如此分析一些网上博客的解决方法都说其实是因为pytorch的版本问题,然后重新安装之类的blablabla我也照做了,但是,却并没有解决问题:就在我非常狂躁之时,我发现我的输出竟然还......
  • [hit-oslab] 实验7-地址映射-实验记录
    取巧正解step1.找到段表(LDT)地址step2.查到ds真实值step3.虚拟地址转物理地址step4.找页框号refBochs常用调试命令b[addr] //加断点于[addr]c //继续运行ctrl+c //暂停运行n //单步运行回车 //继续上次的命令r //查看......
  • Hardware/Software Co-Exploration of Neural Architectures——神经架构的硬件/软件
    在一些研究工作中,探索实践与硬件平台端协同探索的方式来指导神经网络模型的结构设计优化,本文是对《Hardware/SoftwareCo-ExplorationofNeuralArchitectures》论文的阅读学习整体的论文阅读笔记,感兴趣的话可以参考下,如果想要进一步了解工作内容详情,建议移步阅读原英文论文,地......
  • 第六届土木建筑与城市工程国际学术会议(ICCAUE 2024) 2024 6th International Conferenc
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus三、大会介绍第六届土木建筑与城市工程国际学术会议(ICCAUE2024)将于2024年......
  • Vchitect 2.0:上海 AI 实验室推出的视频生成利器
    目录引言一、Vchitect2.0模型概述二、Vchitect2.0的技术特点1.超分辨率功能2.帧插入功能3.基于文本和图像的生成能力三、Vchitect2.0的应用场景四、Vchitect2.0测评报告五、生成视频样例六、本地部署推理1.环境准备2.安装依赖3.模型推理结语引言随......
  • 【HITCON-Training】Lab 12 - SecretGarden
    学习于2024-10-0122:00:17星期二心得感想:这次真的把我整笑了,现在是10/2的晚上23点,我都不敢想象自己弄了多久(整整两天国庆的下午......
  • [机器视觉][轻量化网络]GhostFormer: Efficiently amalgamated CNNtransformer archit
    目的与成果:     本文旨在提出一个轻量化的模型,在减少模型参数量的同时,保持一定的精度,  实验表明,该模型在PascalVOC数据集上的计算成本不到YOLOv7的一半,仅损失约3%mAP@0.5,在MSCOCO数据集上的损失为9.7%mAP@0.5,与GhostNet相比提高了0.95。本文的主要思想: ......
  • CEG2136: Computer Architecture I
    CEG2136:ComputerArchitectureILAB4           BASICCOMPUTERORGANIZATION1. ObjectivesIn this laboratory, students will analyse the structure of a basic computer, will devise, design, implement,simulateinQuartusa......