¡¡¤Þ¤º¤Ï¼«Ê¬¤Ç¥í¥¸¥Ã¥¯¤òÁȤó¤Ç¡¢¼ÂÁõ¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
¡¡
¡¡¥Õ¥í¡¼¥Èɽ¼¨¤òÀ¸À®¤¹¤ë¤¿¤á¤ËɬÍפȤʤë¾ðÊó¤ä½èÍý¤Ïº£¤Þ¤Ç³Ø½¬¤·¤Æ¤¤¿ÆâÍƤòÉü½¬¤¹¤ì¤Ð¼ÂÁõ¤Ç¤¤Þ¤¹¡£
À¸À®¤µ¤ì¤¿¥Õ¥í¡¼¥Èɽ¼¨¤Ë¤Ï²¿¤â¾ðÊ󤬤¢¤ê¤Þ¤»¤ó¤Î¤Ç¡¢FloatingMessage ¥¹¥¯¥ê¥×¥È¤ËÍÑ°Õ¤·¤Æ¤¢¤ë¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤Æ
¥Õ¥í¡¼¥Èɽ¼¨¤µ¤»¤¿¤¤Ãͤ䡢¼ïÎà¤ò°ú¿ô¤ÇÅϤ¹¤è¤¦¤Ë¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£
EnemyController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
using UnityEngine.Events;
[RequireComponent(typeof(CapsuleCollider2D))]
public class EnemyController : MonoBehaviour
[Header("¥¨¥Í¥ß¡¼¤Î¥Ç¡¼¥¿¾ðÊó")]
public EnemyDataSO.EnemyData enemyData; // SetUpEnemy ¥á¥½¥Ã¥É¤Ë¤Æ°ú¿ô¤È¤·¤Æ¼õ¤±¤È¤Ã¤¿¥¨¥Í¥ß¡¼¤Î¥Ç¡¼¥¿¤òÂåÆþ¤¹¤ë¡£¤³¤ì¤Ë¤è¤ê¡¢¿¶¤ëÉñ¤¤¤¬ÊѤï¤ë
[SerializeField]
private Image imgEnemy; // ¥¨¥Í¥ß¡¼¤Î²èÁü¤ÎÀßÄêÍÑ¡¡¡¡¡¡
[SerializeField]
private Slider slider;
[SerializeField]
private GameObject bulletEffectPrefab; // ¥Ò¥Ã¥È±é½ÐÍѤΥ¨¥Õ¥§¥¯¥È¤Î¥×¥ì¥Õ¥¡¥Ö¤ò¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤è¤ê¥¢¥µ¥¤¥ó¤·¤ÆÅÐÏ¿¤¹¤ë
[SerializeField]
private GameObject enemybulletPrefab; // EnemyBullet ¥×¥ì¥Õ¥¡¥Ö¡¦¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤è¤ê¥¢¥µ¥¤¥ó¤·¤ÆÅÐÏ¿¤¹¤ë
////* ¤³¤³¤«¤éÊÑ¿ô¤ÎÀë¸À¤òÄɲà *////
[SerializeField, Header("¥Õ¥í¡¼¥Èɽ¼¨¤ò¹Ô¤¦°ÌÃÖ¾ðÊó")]
private Transform floatingDamageTran;
[SerializeField]
private FloatingMessage floatingMessagePrefab; // FloatingMessageObj ¥×¥ì¥Õ¥¡¥Ö¡¦¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤è¤ê¥¢¥µ¥¤¥ó¤·¤ÆÅÐÏ¿¤¹¤ë
////* ¤³¤³¤Þ¤Ç *////
private int maxHp; // HP¤ÎºÇÂçÃͤòÂåÆþ¤¹¤ëÊÑ¿ô
private int hp; // ¥¨¥Í¥ß¡¼¤ÎHP¡£EnemyData ¤ÇHp¤ÎÃͤ¬¼èÆÀ¤Ç¤¤ë¤Î¤Ç¡¢¤½¤ì¤òÂåÆþ¤¹¤ë¡£public ¤Ë¤·¤Æ¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤ÇÀßÄꤹ¤ëɬÍפʤ·
private EnemyGenerator enemyGenerator; // EnemyGenerator ¤òÍøÍѤ¹¤ë¤¿¤á¤ÎÊÑ¿ô
private UnityAction<Transform, float> moveEvent; // UnityAction<Transform, float> ·¿¤Î moveEvent ÊÑ¿ô¤ÈÆɤࡣ¤³¤³¤Ë¥¨¥Í¥ß¡¼¤Î°ÜÆ°ÊýË¡¤Ë±þ¤¸¤¿°ÜÆ°ÍѤΥ᥽¥Ã¥É¤òÅÐÏ¿¤¹¤ë
/// <summary>
/// ¥¨¥Í¥ß¡¼¤ÎÀßÄê
/// </summary>
¡¡¡¡public void SetUpEnemy(EnemyDataSO.EnemyData enemyData) {
¡¡¡¡¡¡¡¡// °ú¿ô¤ÇÆϤ¤¤¿ EnemyData ¤òÂåÆþ¤¹¤ë
this.enemyData = enemyData;
// ¥Ü¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç
if (this.enemyData.enemyType != EnemyType.Boss) {
// ¥¨¥Í¥ß¡¼¤Î X ¼´(º¸±¦)¤Î°ÌÃÖ¤ò¡¢¥²¡¼¥à²èÌ̤˼ý¤Þ¤ëÈϰϤǥé¥ó¥À¥à¤Ê°ÌÃÖ¤ËÊѹ¹
transform.localPosition = new Vector3(transform.localPosition.x + Random.Range(-650, 650), transform.localPosition.y, 0);
} else {
// ¥Ü¥¹¤Î°ÌÃÖ¤ò½ù¡¹¤Ë²¼Êý¸þ¤ËÊѹ¹
transform.DOLocalMoveY(transform.localPosition.y - 500, 3.0f);
// ¥Ü¥¹¤Î¾ì¹ç¡¢¥µ¥¤¥º¤òÂ礤¯¤¹¤ë
transform.localScale = Vector3.one * 2.0f;
// Hp¥²¡¼¥¸¤Î°ÌÃÖ¤ò¹â¤¤°ÌÃ֤ˤ¹¤ë
slider.transform.localPosition = new Vector3(0, 150, 0);
}
// ²èÁü¤ò EnemyData ¤Î²èÁü¤Ë¤¹¤ë¡¡=>¡¡¤³¤³¤Ç¥¨¥Í¥ß¡¼¤´¤È¤Î²èÁü¤ËÊѹ¹¤¹¤ë
imgEnemy.sprite = this.enemyData.enemySprite;
// EnemyData ¤è¤ê Hp ¤ÎÃͤòºÇÂçÃͤȤ·¤ÆÂåÆþ
maxHp = this.enemyData.hp;
// hp ¤òÀßÄê
hp = maxHp;
¡¡¡¡¡¡¡¡// Hp¥²¡¼¥¸¤Îɽ¼¨¹¹¿·
¡¡¡¡¡¡¡¡DisplayHpGauge();
}
// ¿¯ÆþȽÄê
private void OnTriggerEnter2D(Collider2D col) {
¡¡¡¡¡¡¡¡// ¥Ð¥ì¥Ã¥È¤¬ÀÜ¿¨¤·¤¿¤é
if (col.gameObject.tag == "Bullet") {
¡¡
// ¥Ð¥ì¥Ã¥È¤ÎÇ˲õ½èÍý¤ò¸Æ¤Ó½Ð¤¹(¥á¥½¥Ã¥É̾¤ò½¤Àµ¤¹¤ì¤Ð¡¢°ì½ï¤Ë½¤Àµ¤µ¤ì¤ë)
¡¡¡¡¡¡¡¡¡¡¡¡DestroyBullet(col);
// ¿¯Æþ¤·¤Æ¤¤¿¥³¥é¥¤¥À¡¼¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë Bullet ¥¹¥¯¥ê¥×¥È¤¬¥¢¥¿¥Ã¥Á¤µ¤ì¤Æ¤¤¤¿¤é¼èÆÀ¤·¤Æ bullet ÊÑ¿ô¤ËÂåÆþ¤·¤Æ¡¢if ʸ¤ÎÃæ¤Î½èÍý¤ò¹Ô¤¦
if (col.gameObject.TryGetComponent(out Bullet bullet)) {
// HP¤Î¹¹¿·½èÍý¤È¥¨¥Í¥ß¡¼¤ÎÇ˲õ³Îǧ¤Î½èÍý¤ò¸Æ¤Ó½Ð¤¹
UpdateHp(bullet);¡¡
// ¥Ð¥ì¥Ã¥È¤Î¥Ò¥Ã¥È±é½ÐÍÑ¥¨¥Õ¥§¥¯¥È¤ÎÀ¸À®
GenerateBulletEffect(col.gameObject.transform);
}
}
}
/// <summary>
/// ¥Ð¥ì¥Ã¥È¤ÎÇ˲õ½èÍý
/// </summary>
private void DestroyBullet(Collider2D col)
{
// ¥Ð¥ì¥Ã¥È¤òÇ˲õ¤¹¤ë
Destroy(col.gameObject);
}
/// <summary>
/// Hp¤Î¹¹¿·½èÍý¤È¥¨¥Í¥ß¡¼¤ÎÇ˲õ³Îǧ½èÍý
/// </summary>
private void UpdateHp(Bullet bullet)
{
////* ¤³¤³¤«¤é½èÍý¤òÄɲà *////
¡¡¡¡¡¡¡¡// ¥Ð¥ì¥Ã¥È¤Î¹¶·âÎÏÃÍÍÑ¤Î¥Õ¥í¡¼¥Èɽ¼¨¤ÎÀ¸À®
CreateFloatingMessageToBulletPower(bullet.bulletPower);
////* ¤³¤³¤Þ¤Ç *////
// hp¤Î¸º»»½èÍý
hp -= bullet.bulletPower;
¡¡¡¡ // Hp ¤ÎÃͤξå¸Â¡¦²¼¸Â¤ò³Îǧ¤·¤ÆÈÏ°ÏÆâ¤ËÀ©¸Â
¡¡¡¡¡¡¡¡hp = Mathf.Clamp(hp, 0, maxHp);
// HP¥²¡¼¥¸¤Îɽ¼¨¹¹¿·
DisplayHpGauge();
if (hp <= 0) {
hp = 0;
// ¥Ü¥¹¤Î¾ì¹ç
if (enemyData.enemyType == EnemyType.Boss) {
// ¥Ü¥¹Æ¤È²ºÑ¤ß¤Î¾õÂ֤ˤ¹¤ë
enemyGenerator.SwitchBossDestroyed(true);
}
// Exp ¤ò TotalExp ¤Ë²Ã»»
GameData.instance.UpdateTotalExp(enemyData.exp);
// ºÇ¿·¤Î TotapExp ¤òÍøÍѤ·¤Æɽ¼¨¹¹¿·
enemyGenerator.PreparateDisplayTotalExp(enemyData.exp);
// ¤³¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤òÇ˲õ¤¹¤ë
Destroy(gameObject);
} else {
Debug.Log("»Ä¤ê Hp : " + hp);
}
}
/// <summary>
/// HP¥²¡¼¥¸¤Îɽ¼¨¹¹¿·
/// </summary>
private void DisplayHpGauge() {
¡¡¡¡¡¡¡¡// HP¥²¡¼¥¸¤ò¸½ºßÃͤ˹ç¤ï¤»¤ÆÀ©¸æ
slider.DOValue((float)hp / maxHp, 0.25f);
}
/// <summary>
/// Èï¥Ð¥ì¥Ã¥È»þ¤Î¥Ò¥Ã¥È±é½ÐÍѤΥ¨¥Õ¥§¥¯¥ÈÀ¸À®
/// </summary>
¡¡¡¡/// <param name="bulletTran"></param>
private void GenerateBulletEffect(Transform bulletTran) {
¡¡¡¡¡¡¡¡// ¥Ò¥Ã¥È±é½ÐÍѤΥ¨¥Õ¥§¥¯¥È¤ò¡¢¥Ð¥ì¥Ã¥È¤Î¤Ö¤Ä¤«¤Ã¤¿°ÌÃÖ¤ÇÀ¸À®
GameObject effect = Instantiate(bulletEffectPrefab, bulletTran, false);
// ¥¨¥Õ¥§¥¯¥È¤ò¥¨¥Í¥ß¡¼¤Î»Ò¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤¹¤ë
effect.transform.SetParent(transform);
Destroy(effect, 3.0f);
}
/// <summary>
/// ¥¨¥Í¥ß¡¼¤ÎÄɲÃÀßÄê
/// </summary>
/// <param name="enemyGenerator"></param>
public void AdditionalSetUpEnemy(EnemyGenerator enemyGenerator) {
// °ú¿ô¤ÇÆϤ¤¤¿¾ðÊó¤òÊÑ¿ô¤ËÂåÆþ¤·¤Æ¥¹¥¯¥ê¥×¥ÈÆâ¤ÇÍøÍѤǤ¤ë¾õÂ֤ˤ¹¤ë
this.enemyGenerator = enemyGenerator;
// MoveEventSO ¥¹¥¯¥ê¥×¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î GetMoveEvent ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¡¢Ìá¤êÃͤǰÜÆ°ÍѤΥ᥽¥Ã¥É¤ò¼õ¤±¼è¤ë¡£¤³¤³¤Ç°ÜÆ°ÊýË¡¤ò·èÄê
moveEvent = this.enemyGenerator.moveEventSO.GetMoveEvent(enemyData.moveType);
// Invoke ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢moveEvent ÊÑ¿ô¤ËÅÐÏ¿¤µ¤ì¤¿¥á¥½¥Ã¥É(º£²ó¤Ï°ÜÆ°ÍѤΥ᥽¥Ã¥É)¤ò¼Â¹Ô¤¹¤ë¡£UnityActon <Transform, float>·¿¤Ê¤Î¤Ç¡¢¼Â¹Ô¤Ë¤¢¤¿¤Ã¤Æ¡¢»ØÄꤵ¤ì¤¿·¿¤Î¾ðÊó¤ò»ØÄꤹ¤ë
moveEvent.Invoke(transform, enemyData.moveDuration);
// MoveType ¤¬ Straight ¤Î¥¨¥Í¥ß¡¼¡¢¤¢¤ë¤¤¤Ï Boss_Horizontal ¤Î¾ì¹ç
if (enemyData.moveType == MoveType.Straight || enemyData.moveType == MoveType.Boss_Horizontal) {
¡¡¡¡¡¡¡¡¡¡¡¡// ¥Ð¥ì¥Ã¥È¤Î¼«Æ°À¸À®½èÍý¤ò¼Â¹Ô¤¹¤ë
StartCoroutine(EnemyShot());
}
Debug.Log("ÄɲÃÀßÄ괰λ");
}
/// <summary>
/// ¥Ð¥ì¥Ã¥È¤Î¼«Æ°À¸À®
/// </summary>
/// <returns></returns>
private IEnumerator EnemyShot() {
// ¾ò·ï¤Ë true ¤ò»ØÄꤹ¤ë¤È̵À©¸Â¤Î¥ë¡¼¥×½èÍý¤Ë¤Ê¤ë
while (true) {
// ¥¨¥Í¥ß¡¼¤Î¥Ð¥ì¥Ã¥È¤Î¥¯¥í¡¼¥ó¤òÀ¸À®¤·¡¢Ìá¤êÃͤò bulletObj ÊÑ¿ô¤ËÂåÆþ
GameObject bulletObj = Instantiate(enemyBulletPrefab, transform);
¡¡¡¡¡¡¡¡¡¡¡¡// ¥¯¥í¡¼¥ó¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤«¤é Bullet ¥¹¥¯¥ê¥×¥È¤ò¼èÆÀ¤·¤Æ¡¢ShotBullet ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤¹¤ë
bulletObj.GetComponent<Bullet>().ShotBullet(enemyGenerator.PreparateGetPlayerDirection(transform.position));
// ¥Ü¥¹¤Î¾ì¹ç
if (enemyData.moveType == MoveType.Boss_Horizontal) {
// ¥Ð¥ì¥Ã¥È¤È¥¨¥Í¥ß¡¼¤Î¿Æ»Ò´Ø·¸¤ò²ò¾Ã¤·¡¢¥Ð¥ì¥Ã¥È¤Î¿Æ¤ò TemporaryObjectContainer ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ËÊѹ¹¤¹¤ë
bulletObj.transform.SetParent(TransformHelper.GetTemporaryObjectContainerTran());
}
¡¡¡¡¡¡¡¡¡¡¡¡// 5ÉôֽèÍý¤òÃæÃǤ¹¤ë(ÂÔµ¡¤¹¤ë)
yield return new WaitForSeconds(5.0f);
}
}
////* ¤³¤³¤«¤é¥á¥½¥Ã¥É¤òÄɲà *////
/// <summary>
/// ¥Ð¥ì¥Ã¥È¤Î¹¶·âÎÏÃÍʬ¤Î¥Õ¥í¡¼¥Èɽ¼¨¤ÎÀ¸À®
/// </summary>
/// <param name="bulletPower"></param>
private void CreateFloatingMessageToBulletPower(int bulletPower) {
// ¥Õ¥í¡¼¥Èɽ¼¨¤ÎÀ¸À®¡£À¸À®°ÌÃÖ¤Ï EnemySet ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥ÈÆâ¤Î FloatingMessageTran ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î°ÌÃÖ(»Ò¥ª¥Ö¥¸¥§¥¯¥È)
FloatingMessage floatingMessage = Instantiate(floatingMessagePrefab, floatingDamageTran, false);
// À¸À®¤·¤¿¥Õ¥í¡¼¥Èɽ¼¨¤ÎÀßÄêÍѥ᥽¥Ã¥É¤ò¼Â¹Ô¡£°ú¿ô¤È¤·¤Æ¡¢¥Ð¥ì¥Ã¥È¤Î¹¶·âÎÏÃÍ¤È¥Õ¥í¡¼¥Èɽ¼¨¤Î¼ïÎà¤ò»ØÄꤷ¤ÆÅϤ¹
floatingMessage.DisplayFloatingMessage(bulletPower, FloatingMessage.FloatingMessageType.EnemyDamage);
}
////* ¤³¤³¤Þ¤Ç *////
}
¡¡¥¹¥¯¥ê¥×¥È¤ò½¤Àµ¤·¤¿¤é¥»¡¼¥Ö¤·¤Þ¤¹¡£
¡¡Prefabs ¥Õ¥©¥ë¥ÀÆâ¤Ë¤¢¤ë EnemySet ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤è¤ê EnemyController ¥¹¥¯¥ê¥×¥È¤ò³Îǧ¤·¡¢
¿·¤·¤¯ SerializeField °À¤ÇÀë¸À¤·¤¿ÊÑ¿ô¤¬É½¼¨¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£
EnemySet ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¡¡¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü