【Unity2D】实现Unity中Player受伤以及闪烁特效

学习目标:

参考视频:秦无邪OvO的个人空间_哔哩哔哩_Bilibili

上一篇文章:【Unity2D】简单实现相机跟随Player功能以及攻击敌人时相机抖动_dangoxiba的博客-CSDN博客学习目标:简单实现相机跟随Player功能参考视频:秦无邪OvO的个人空间_哔哩哔哩_Bilibili秦无邪OvO,独立游戏开发者/美术/编曲;秦无邪OvO的主页、动态、视频、专栏、频道、收藏、订阅等。哔哩哔哩Bilibili,你感兴趣的视频都在B站。https://space.bilibili.com/335835274?from=search&seid=2940030192624790742&spm_id_from=333.337.0.0我的上一篇文章:【Unity2D】实现敌人https://blog.csdn.net/dangoxiba/article/details/122704761


学习内容:

实现Unity中Player受伤以及闪烁特效,实现的方法很简单,首先要了解一个SpriteRenderer,这个就是会给该游戏对象添加图片的Sprite精灵关掉后:


代码展示:

在Player中添加一个新脚本叫PlayerHealth,然后给它设置参数以及碰撞方法

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

public class PlayerHealth : MonoBehaviour
{
    public int health;
    public float blinkTime;
    public int blinks;

    private Renderer myRender;
    void Start()
    {
        myRender = GetComponent<Renderer>();
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void DamagePlayer(int damage)
    {
        health -= damage;
        if(health <= 0)
        {
            Destroy(gameObject);
        }
        BlinkPlayer(blinks,blinkTime);
    }
    void BlinkPlayer(int numBlinks,float seconds)
    {
        StartCoroutine(DoBlinks(numBlinks, seconds));
    }
    IEnumerator DoBlinks(int numBlinks, float seconds)
    {
        for (int i = 0; i < numBlinks * 2; i++)
        {
            myRender.enabled = !myRender.enabled;
            yield return new WaitForSeconds(seconds);
        }
        myRender.enabled = true;
    }
}
然后再Enemy脚本中设置碰撞方法

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

public abstract class Enemy : MonoBehaviour
{
    public int health;
    public int damage;
    public float changeTime;

    public GameObject bloodEffect;
    public PlayerHealth playerHealth;

    private SpriteRenderer sr;
    private Color originColor;
    public void Start()
    {
        playerHealth = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerHealth>();
        sr = GetComponent<SpriteRenderer>();
        originColor = sr.color;
    }

    
    public void Update()
    {
        if(health <= 0)
        {
            Destroy(gameObject);
        }
    }
    public void TakeDamage(int damage)
    {
        health -= damage;
        FlashColor(changeTime);
        Instantiate(bloodEffect, 
            new Vector3(transform.position.x , transform.position.y + 0.5f, transform.position.z),
            Quaternion.identity);
        GameController.cameraShake.Shake();
    }

    void FlashColor(float time)
    {
        //分别对应着R,G,B,透明度
        sr.color = new Color(255, 255, 0, 255);
        Invoke("ResetColor", time);
    }

    void ResetColor()
    {
        sr.color = originColor;
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        if(other.gameObject.CompareTag("Player") &&
            other.GetType().ToString() == "UnityEngine.CapsuleCollider2D")
        {
            if(playerHealth != null)
            {
                playerHealth.DamagePlayer(damage);
            }
        }
    }
}
 

学习产出:

先设置好参数。

 闪烁成功,当health变为0时人物也会消失。

 void BlinkPlayer(int numBlinks,float seconds)
    {
        StartCoroutine(DoBlinks(numBlinks, seconds));
    }
    IEnumerator DoBlinks(int numBlinks, float seconds)
    {
        for (int i = 0; i < numBlinks * 2; i++)
        {
            myRender.enabled = !myRender.enabled;
            yield return new WaitForSeconds(seconds);
        }
        myRender.enabled = true;

 这段通过协成延迟调用DoBlinks(int numBlinks, float seconds),然后再for循环中,每次循环时取消组件的Sprite Renderer让它变透明,再隔一段时间恢复,看起来就像闪烁。

private void OnTriggerEnter2D(Collider2D other)
    {
        if(other.gameObject.CompareTag("Player") &&
            other.GetType().ToString() == "UnityEngine.CapsuleCollider2D")

判断是否是玩家:标签是Player,并且发生碰撞的是组件CapsuleCollider2D,并且非空对象

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值