ARPG_被弾時の点滅

+ボタン押下でコードを確認できます!

 

コピペしても正しく動かない場合は
エディタでアタッチし忘れている可能性が高いです。

EnemyController
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//
public class EnemyController : MonoBehaviour
{
private Rigidbody2D rb;
private Animator enemyAnim;
[SerializeField]
private float moveSpeed, waitTime, walkTime;
private float waitCounter, moveCounter;
private Vector2 moveDir;
[SerializeField]
private BoxCollider2D area;
[SerializeField,Tooltip("プレイヤーを追いかける?")]
private bool chase;
private bool isChaseing;
[SerializeField]
private float chaseSpeed, rangeToChase;
private Transform target;
[SerializeField]
private float waitAfterHitting;
[SerializeField]
private int attackDamage;
[SerializeField]
private float maxHealth;
private float currentHealth;
private bool isKnockingBack;
[SerializeField]
private float knockBackTime, knockBackForce;
private float knockBackCounter;
private Vector2 knockDir;
[SerializeField]
private GameObject portion;
[SerializeField]
private float healthDropChance;
[SerializeField]
private GameObject blood;
[SerializeField]
private int exp;
[SerializeField]
private Image hpImage;
private Flash flash; //追加
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
enemyAnim = GetComponent<Animator>();
waitCounter = waitTime;
target = GameObject.FindGameObjectWithTag("Player").transform;
currentHealth = maxHealth;
UpdateHealthImage();
flash = GetComponent<Flash>();//コンポーネント取得
}
// Update is called once per frame
void Update()
{
if(isKnockingBack)
{
if(knockBackCounter > 0)
{
knockBackCounter -= Time.deltaTime;
rb.velocity = knockDir * knockBackForce;
}
else
{
rb.velocity = Vector2.zero;
isKnockingBack = false;
}
return;
}
if(!isChaseing)
{
if (waitCounter > 0)
{
waitCounter -= Time.deltaTime;
rb.velocity = Vector2.zero;
if (waitCounter <= 0)
{
moveCounter = walkTime;
enemyAnim.SetBool("moving", true);
moveDir = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f));
moveDir.Normalize();
}
}
else
{
moveCounter -= Time.deltaTime;
rb.velocity = moveDir * moveSpeed;
if (moveCounter <= 0)
{
enemyAnim.SetBool("moving", false);
waitCounter = waitTime;
}
}
if(chase)
{
if(Vector3.Distance(transform.position,target.transform.position) < rangeToChase)
{
isChaseing = true;
}
}
}
else
{
if(waitCounter > 0)
{
waitCounter -= Time.deltaTime;
rb.velocity = Vector2.zero;
if(waitCounter <= 0)
{
enemyAnim.SetBool("moving", true);
}
}
else
{
moveDir = target.transform.position - transform.position;
moveDir.Normalize();
rb.velocity = moveDir * chaseSpeed;
}
if (Vector3.Distance(transform.position, target.transform.position) > rangeToChase)
{
isChaseing = false;
waitCounter = waitTime;
enemyAnim.SetBool("moving", false);
}
}
transform.position = new Vector3(Mathf.Clamp(transform.position.x,area.bounds.min.x + 1, area.bounds.max.x - 1),
Mathf.Clamp(transform.position.y, area.bounds.min.y + 1, area.bounds.max.y - 1),transform.position.z);
}
private void OnCollisionEnter2D(Collision2D collision)
{
if(collision.gameObject.tag == "Player")
{
if(isChaseing)
{
PlayerController player = collision.gameObject.GetComponent<PlayerController>();
player.KnockBack(transform.position);
player.DamagePlayer(attackDamage);
waitCounter = waitAfterHitting;
enemyAnim.SetBool("moving", false);
}
}
}
public void KnockBack(Vector3 position)
{
isKnockingBack = true;
knockBackCounter = knockBackTime;
knockDir = transform.position - position;
knockDir.Normalize();
enemyAnim.SetBool("moving", false);
}
public void TakeDamage(int damage,Vector3 position)
{
currentHealth -= damage;
UpdateHealthImage();
flash.PlayFeedback();//点滅関数を呼ぶ
if (currentHealth <= 0)
{
Instantiate(blood, transform.position, transform.rotation);
GameManager.instance.AddExp(exp);
if(Random.Range(0,100) < healthDropChance && portion != null)
{
Instantiate(portion, transform.position, transform.rotation);
}
Destroy(gameObject);
}
KnockBack(position);
}
private void UpdateHealthImage()
{
hpImage.fillAmount = currentHealth / maxHealth;
}
}
Flash
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Flash : MonoBehaviour
{
//画像のコンポーネント格納
private SpriteRenderer spriteRenderer;
//Animatorコンポーネント格納
private Animator animator;
//不可視時間
[SerializeField]
private float invisibleTime;
//可視時間
[SerializeField]
private float visibleTime;
private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
animator = GetComponent<Animator>();
}
public void PlayFeedback()
{
StartCoroutine("FlashCoroutine");
}
private IEnumerator FlashCoroutine()
{
for (int i = 0; i < 3; i++)
{
animator.enabled = false;
Color spriteColor = spriteRenderer.color;
spriteColor.a = 0;
spriteRenderer.color = spriteColor;
yield return new WaitForSeconds(invisibleTime);
animator.enabled = true;
spriteColor.a = 1;
spriteRenderer.color = spriteColor;
yield return new WaitForSeconds(visibleTime);
}
yield break;
}
}
view raw Flash.cs hosted with ❤ by GitHub
PlayerController
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField,Tooltip("移動スピード")]
private int moveSpeed;
[SerializeField]
private Animator playerAnim;
public Rigidbody2D rb;
[SerializeField]
private Animator weaponAnim;
[System.NonSerialized]
public int currentHealth;
public int maxHealth;
private bool isknockingback;
private Vector2 knockDir;
[SerializeField]
private float knockbackTime, knockbackForce;
private float knockbackCounter;
[SerializeField]
private float invincibilityTime;
private float invincibilityCounter;
public float totalStamina, recoverySpeed;
[System.NonSerialized]
public float currentStamina;
[SerializeField]
private float dashSpeed, dashLength,dashCost;
private float dashCounter, activeMoveSpeed;
private Flash flash; //
// Start is called before the first frame update
void Start()
{
currentHealth = maxHealth;
GameManager.instance.UpdateHealthUI();
activeMoveSpeed = moveSpeed;
currentStamina = totalStamina;
GameManager.instance.UpdateStaminaUI();
flash = GetComponent<Flash>();//
}
// Update is called once per frame
void Update()
{
if(GameManager.instance.statusPanel.activeInHierarchy)
{
return;
}
if(invincibilityCounter > 0)
{
invincibilityCounter -= Time.deltaTime;
}
if(isknockingback)
{
knockbackCounter -= Time.deltaTime;
rb.velocity = knockDir * knockbackForce;
if(knockbackCounter <= 0)
{
isknockingback = false;
}
else
{
return;
}
}
rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")).normalized * activeMoveSpeed;
if(rb.velocity != Vector2.zero)
{
if(Input.GetAxisRaw("Horizontal") != 0)
{
if(Input.GetAxisRaw("Horizontal") > 0)
{
playerAnim.SetFloat("X", 1f);
playerAnim.SetFloat("Y", 0);
weaponAnim.SetFloat("X", 1f);
weaponAnim.SetFloat("Y", 0);
}
else
{
playerAnim.SetFloat("X", -1f);
playerAnim.SetFloat("Y", 0);
weaponAnim.SetFloat("X", -1f);
weaponAnim.SetFloat("Y", 0);
}
}
else if(Input.GetAxisRaw("Vertical") > 0)
{
playerAnim.SetFloat("X", 0);
playerAnim.SetFloat("Y", 1);
weaponAnim.SetFloat("X", 0);
weaponAnim.SetFloat("Y", 1);
}
else
{
playerAnim.SetFloat("X", 0);
playerAnim.SetFloat("Y", -1);
weaponAnim.SetFloat("X", 0);
weaponAnim.SetFloat("Y", -1);
}
}
else
{
//アニメーションを切り替える
}
if(Input.GetMouseButtonDown(0))
{
weaponAnim.SetTrigger("Attack");
}
if(dashCounter <= 0)
{
if(Input.GetKeyDown(KeyCode.Space) && currentStamina > dashCost)
{
activeMoveSpeed = dashSpeed;
dashCounter = dashLength;
currentStamina -= dashCost;
GameManager.instance.UpdateStaminaUI();
}
}
else
{
dashCounter -= Time.deltaTime;
if(dashCounter <= 0)
{
activeMoveSpeed = moveSpeed;
}
}
currentStamina = Mathf.Clamp(currentStamina + recoverySpeed * Time.deltaTime, 0, totalStamina);
GameManager.instance.UpdateStaminaUI();
}
/// <summary>
/// 吹き飛ばし用の関数
/// </summary>
/// <param name="position"></param>
public void KnockBack(Vector3 position)
{
knockbackCounter = knockbackTime;
isknockingback = true;
knockDir = transform.position - position;
knockDir.Normalize();
}
public void DamagePlayer(int damage)
{
if(invincibilityCounter <= 0)
{
flash.PlayFeedback();//
currentHealth = Mathf.Clamp(currentHealth - damage,0,maxHealth);
invincibilityCounter = invincibilityTime;
SoundManager.instance.PlaySE(2);
if (currentHealth == 0)
{
gameObject.SetActive(false);
SoundManager.instance.PlaySE(0);
GameManager.instance.Load();
}
}
GameManager.instance.UpdateHealthUI();
}
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag == "portion" && maxHealth != currentHealth && collision.GetComponent<Items>().waitTime <= 0)
{
Items items = collision.GetComponent<Items>();
SoundManager.instance.PlaySE(1);
currentHealth = Mathf.Clamp(currentHealth + items.healthItemRecoveryValue, 0, maxHealth);
GameManager.instance.UpdateHealthUI();
Destroy(collision.gameObject);
}
}
}

他の講座クーポン【93%OFF】

関連記事

クーポン期限2023/01/24 Udemyでは定価24000円になっていますがこのクーポンページからの購入で1800円台で購入することが可能になっています! 30日以内な[…]

unity fps

 

Udemyよりお得に講座視聴可能なYouTubeメンバーシップ