¡¡À߷פ˴ð¤Å¤¤¤Æ¡¢¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤ÇÀßÄꤷ¤Æ¤¤¤¿¾ðÊó¤ò EnemyDataSO ¥¹¥¯¥ê¥×¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î EnemyData ¥¯¥é¥¹¤Î¾ðÊó¤ò»²¾È¤¹¤ë¤è¤¦¤ËÊѹ¹¤·¤Þ¤¹¡£
¡¡¤Þ¤º¤Ï EnemyData ¥¯¥é¥¹¤Î¾ðÊó¤ò°·¤¨¤ë¤è¤¦¤Ë¡¢EnemyData ·¿¤ÎÊÑ¿ô¤òÍÑ°Õ¤·¤Þ¤¹¡£¤³¤ÎÊÑ¿ô¤Ë¡¢
¥¨¥Í¥ß¡¼¤È¤·¤ÆɬÍפʤ¹¤Ù¤Æ¤Î¥Ç¡¼¥¿¤¬Æþ¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
hp¡¢¹¶·âÎÏ¡¢¤½¤·¤Æ¥¨¥Í¥ß¡¼¤Î²èÁü¤Î¾ðÊó¤Ê¤É¤¬Æþ¤Ã¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢¤³¤Î¥Ç¡¼¥¿¤òÍøÍѤ¹¤ë¤³¤È¤Ç¡Ö
¤É¤Î¤è¤¦¤Ê¥¨¥Í¥ß¡¼¤È¤·¤Æ¿¶¤ëÉñ¤¦¤«¡×·è¤Þ¤ê¤Þ¤¹¡£
¤³¤ÎÊÑ¿ô¤òÍøÍѤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢EnemyData ¥¯¥é¥¹¤Î¾ðÊó¤ò»²¾È¤·¤ÆÍøÍѽÐÍè¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡¤³¤Î EnemyData ¥¯¥é¥¹¤Î¾ðÊó¤Ï¡¢
³°Éô¤Î¥¹¥¯¥ê¥×¥È¤«¤é°ú¿ô¤Ç¼õ¤±¼è¤ë¤è¤¦¤ËÀ߷פ·¤Þ¤¹¡£
¤¤¤Þ¤Þ¤Ç SetUpEnemyController ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ³°Éô¤Î¾ðÊó¤ò¼õ¤±¼è¤Ã¤Æ¤¤¤¿¤Þ¤·¤¿¤¬¡¢
¤µ¤é¤Ë
EnemyData ·¿¤òÀë¸À¤òÄɲ䷤ơ¢¤³¤³¤Ç¥¨¥Í¥ß¡¼¤Î¥Ç¡¼¥¿¤ò¼õ¤±¼è¤ì¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£
¡¡¤³¤³¤ÇÂçÀڤʥݥ¤¥ó¥È¤¬¤¢¤ê¤Þ¤¹¡£
¡¡EnemyData ¥¯¥é¥¹¤Î¾ðÊó¤ò
·èÄꤹ¤ë¤Î¤Ï¡¢
EnemyController ¥¹¥¯¥ê¥×¥È¦¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
EnemyController ¥¹¥¯¥ê¥×¥È¤Ç¤Ï¡¢°ú¿ô¤È¤·¤ÆÆϤ¤¤¿ EnemyData ¥¯¥é¥¹¤Î¾ðÊó¤òÍøÍѤ·¤Æ¡¢
ÀßÄê¤ò¹Ô¤¦¤³¤È¤Ç¡¢
¥¨¥Í¥ß¡¼¤Î¥Ç¡¼¥¿¤òÈ¿±Ç¤·¤Æ¥¨¥Í¥ß¡¼¤ËÌò³ä¤òÍ¿¤¨¤ë¤³¤È¤¬»Å»ö¤Ç¤¹¡£
¡¡À¸À®¤µ¤ì¤¿¥¨¥Í¥ß¡¼¤Î¥¯¥í¡¼¥ó¤ËÂФ·¤Æ¡¢¥¨¥Í¥ß¡¼¤Î¥Ç¡¼¥¿¤ò·èÄꤷ¡¢¡Ö¤³¤Î¾ðÊó¤ò»È¤Ã¤Æ¥¨¥Í¥ß¡¼¤ËÌò³ä¤òÍ¿¤¨¤Æ¿¶¤ëÉñ¤¤¤òÊѤ¨¤Æ¤¯¤À¤µ¤¤¡×¤ÈÌ¿Îá¤ò½Ð¤¹¤Î¤Ï
EnemyGenerator ¥¹¥¯¥ê¥×¥È¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡¤³¤ÎÌò³äʬô¤Î¹Í¤¨Êý¤Ë¤Ä¤¤¤Æ¤â¤·¤Ã¤«¤ê¤È³Ø½¬¤·¤ÆÍý²ò¤ò¿¼¤á¤Æ¤¯¤À¤µ¤¤¡£
¡¡°ú¿ô¤òÄ̤¸¤Æ¤¦¤±¤È¤Ã¤¿ EnemyData ¤Î¾ðÊó¤ò³èÍѤ¹¤ë¤è¤¦¤Ë½èÍý¤òÄɲ乤뤳¤È¤Ç¡¢
EnemyData ¥¯¥é¥¹¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ðÊó¤Ë¤Ä¤¤¤Æ¤Ï¡¢¤³¤Î¥¹¥¯¥ê¥×¥ÈÆâ¤Ç¸ÄÊ̤ËÀßÄê¤ò¹Ô¤¦É¬Íפ¬¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
¤è¤Ã¤Æ¡¢¹¶·âÎϤä°Üư®Å٤Ȥ¤¤Ã¤¿¾ðÊó¤ò EnemyData ·¿¤Î¾ðÊ󤫤鼫ưŪ¤Ë»²¾È¤¹¤ë½èÍý¤Îµ½Ò¤¬É¬Íפˤʤê¤Þ¤¹¡£
¡¡EnemyData ¥¯¥é¥¹Æâ¤ÎÊÑ¿ô¤Ï¤¹¤Ù¤Æ public ½¤¾þ»Ò¤Ë¤è¤Ã¤ÆÀë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
¤½¤Î¤¿¤á¡¢EnemyData ¥¯¥é¥¹¤Î¾ðÊó¤ò¼èÆÀ¤·¤Æ¤¤¤ëÊÑ¿ô¤Ï¡¢¤³¤ì¤é¤Î public ½¤¾þ»Ò¤ÎÊÑ¿ô¤Î¾ðÊó¤ò¤¹¤Ù¤ÆÍøÍѤǤ¤Þ¤¹¡£
Î㤨¤Ð¡¢EnemyType ¤ò»²¾È¤·¤¿¤¤¾ì¹ç¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
// EnemyData ¥¯¥é¥¹¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë EnemyType ¤Î¾ðÊ󤬡¢Boss ¤ÎÎóµó»Ò¤Ç¤¢¤ë¾ì¹ç
if(enemyData.enemyType == EnemyType.Boss) { }
¡¡°ÊÁ°¤Ë³Ø½¬¤·¤¿¤è¤¦¤Ë¡¢ÊÑ¿ô¤ËÂåÆþ¤µ¤ì¤Æ¤¤¤ë¾ðÊ󤫤é¤Ï¡¢public ½¤¾þ»Ò¤Î¾ðÊó¤ò¤µ¤é¤Ë¼èÆÀ¤·¤ÆÍøÍѤǤ¤Þ¤¹¡£
¥Ô¥ê¥ª¥É¤ò»È¤Ã¤¿½èÍý¤Ë¤Ä¤¤¤Æ¡¢¤³¤Îµ¡²ñ¤Ë¤·¤Ã¤«¤ê¤È³Ð¤¨¤Æ¤¤¤¤Þ¤·¤ç¤¦¡£
EnemyController.cs
¡¡<=¡¡¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤¤Þ¤¹
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using System.Linq;
public class EnemyController : MonoBehaviour
{
[SerializeField, Header("°ÜÆ°·ÐÏ©¤Î¾ðÊó")]
private PathData pathData;
[SerializeField, Header("°Üư®ÅÙ")]
private float moveSpeed;
[SerializeField, Header("ºÇÂçHP")]
private int maxHp;
[SerializeField]
private int hp;
private Tween tween;
private Vector3[] paths;
private Animator anim;¡¡¡¡¡¡¡¡¡¡¡¡ // Animator ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î¼èÆÀÍÑ
private GameManager gameManager;
public int attackPower;
////*¡¡¤³¤³¤«¤éÊÑ¿ô¤òÄɲá¡*////
public EnemyDataSO.EnemyData enemyData;
////*¡¡¤³¤³¤Þ¤Ç¡¡*////
////*¡¡¤³¤³¤«¤é¡ù¡¡Á¢¤òÄɲá¡*////
/// <summary>
/// Ũ¤ÎÀßÄê
/// </summary>
public void SetUpEnemyController(Vector3[] pathsData, GameManager gameManager, EnemyDataSO.EnemyData enemyData) { // <= ¡ù¡¡¡Âè3°ú¿ô¤òÄɲÃ
//¡ù¢¡¡£´¤Ä¤Î½èÍý¤òÄɲá£
// °ú¿ô¤ÇÆϤ¤¤¿ EnemyData ¤Î¾ðÊó¤òÂåÆþ¤·¤ÆÍøÍѤǤ¤ë¾õÂ֤ˤ¹¤ë
this.enemyData = enemyData;¡¡
¡¡¡¡¡¡¡¡// ³Æ¿ôÃͤò EnemyData ¤Î¾ðÊó¤ÎÃͤ˽ñ¤´¹¤¨¤ë
moveSpeed = this.enemyData.moveSpeed;
attackPower = this.enemyData.attackPower;
maxHp = this.enemyData.hp;
////*¡¡¤³¤³¤Þ¤Ç¡¡*////
this.gameManager = gameManager;¡¡
hp = maxHp;
¡¡¡¡¡¡¡¡// Animator ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¼èÆÀ¤·¤Æ anim ÊÑ¿ô¤ËÂåÆþ
TryGetComponent(out anim);
// °ÜÆ°¤¹¤ëÃÏÅÀ¤ò¼èÆÀ
paths = pathsData;
// ³ÆÃÏÅÀ¤Ë¸þ¤±¤Æ°ÜÆ°¡£º£¸å¤³¤Î½èÍý¤òÀ©¸æ¤¹¤ë¤¿¤á¡¢Tween ·¿¤ÎÊÑ¿ô¤Ë DOPath ¥á¥½¥Ã¥É¤Î½èÍý¤òÂåÆþ¤·¤Æ¤ª¤¯
tween = transform.DOPath(paths, 1000 / moveSpeed).SetEase(Ease.Linear).OnWaypointChange(ChangeAnimeDirection);
// °ÜÆ°¤ò°ì»þÄä»ß
PauseMove();
}
/// <summary>
/// Ũ¤Î¿Ê¹ÔÊý¸þ¤ò¼èÆÀ¤·¤Æ¡¢°ÜÆ°¥¢¥Ë¥á¤ÈƱ´ü
/// </summary>
private void ChangeAnimeDirection(int index) {
¡¡¡¡¡¡¡¡// ¼¡¤Î°ÜÆ°Àè¤ÎÃÏÅÀ¤¬¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤³¤Ç½èÍý¤ò½ªÎ»¤¹¤ë
if (index >= paths.Length) {
return;
}
// ÌÜɸ¤Î°ÌÃ֤ȸ½ºß¤Î°ÌÃ֤Ȥε÷Î¥¤ÈÊý¸þ¤ò¼èÆÀ¤·¡¢Àµµ¬²½½èÍý¤ò¹Ô¤¤¡¢Ã±°Ì¥Ù¥¯¥È¥ë¤È¤¹¤ë(Êý¸þ¤Î¾ðÊó¤Ï»ý¤Á¤Ä¤Ä¡¢µ÷Î¥¤Ë¤è¤ë®ÅÙº¹¤ò¤Ê¤¯¤·¤Æ°ìÄêÃͤˤ¹¤ë)
Vector3 direction = (transform.position - paths[index]).normalized;
¡¡¡¡¡¡¡¡// ¥¢¥Ë¥á¡¼¥·¥ç¥ó¤Î Palameter ¤ÎÃͤò¹¹¿·¤·¡¢°ÜÆ°¥¢¥Ë¥á¤Î BlendTree ¤òÀ©¸æ¤·¤Æ°ÜÆ°¤ÎÊý¸þ¤È°ÜÆ°¥¢¥Ë¥á¤òƱ´ü
anim.SetFloat("X", direction.x);
anim.SetFloat("Y", direction.y);
}
/// <summary>
/// ¥À¥á¡¼¥¸·×»»
/// </summary>
/// <param name="amount"></param>
public void CulcDamage(int amount) {
¡¡¡¡¡¡¡¡// Hp ¤ÎÃͤò¸º»»¤·¤¿·ë²ÌÃͤò¡¢ºÇÄãÃͤȺÇÂçÃͤÎÈÏ°ÏÆâ¤Ë¼ý¤Þ¤ë¤è¤¦¤Ë¤·¤Æ¹¹¿·
hp = Mathf.Clamp(hp -= amount, 0, maxHp);
Debug.Log("»Ä¤êHP : " + hp);
¡¡¡¡¡¡¡¡// Hp ¤¬ 0 °Ê²¼¤Ë¤Ê¤Ã¤¿¾ì¹ç
if (hp <= 0) {
// Ç˲õ½èÍý¤ò¼Â¹Ô¤¹¤ë¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹
DestroyEnemy();
}
// TODO ±é½ÐÍѤΥ¨¥Õ¥§¥¯¥ÈÀ¸À®
// ¥Ò¥Ã¥È¥¹¥È¥Ã¥×±é½Ð
StartCoroutine(WaitMove());
}
/// <summary>
/// ŨÇ˲õ½èÍý
/// </summary>
public void DestroyEnemy() {
¡¡¡¡¡¡¡¡// Kill ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¡¢tween ÊÑ¿ô¤ËÂåÆþ¤µ¤ì¤Æ¤¤¤ë½èÍý(DOPath ¤Î½èÍý)¤ò½ªÎ»¤¹¤ë
tween.Kill();
// TODO SE¤Î½èÍý
¡¡¡¡¡¡¡¡// TODO Ç˲õ»þ¤Î¥¨¥Õ¥§¥¯¥È¤ÎÀ¸À®¤ä´ØÏ¢¤¹¤ë½èÍý
// Ũ¤òÇ˲õ¤·¤¿¿ô¤ò¥«¥¦¥ó¥È¥¢¥Ã¥×¤¹¤ë
// ¤µ¤é¤Ë¤³¤Î¥á¥½¥Ã¥ÉÆâ¤Ç¡¢Å¨¤Î¾ðÊó¤ò´ÉÍý¤·¤Æ¤¤¤ë List ¤«¤é¤³¤ÎŨ¤Î¾ðÊó¤òºï½ü¤â¤·¤Æ¤â¤é¤¦¤¿¤á¤Ë¡¢EnemyController ¤Î¾ðÊó¤ò°ú¿ô¤ÇÅϤ·¤Æ¤¤¤ë
gameManager.CountUpDestoryEnemyCount(this);
¡¡¡¡¡¡¡¡// Ũ¥¥ã¥é¤ÎÇ˲õ
Destroy(gameObject);
}
/// <summary>
/// °ÜÆ°¤ò°ì»þÄä»ß
/// </summary>
public void PauseMove() {
tween.Pause();
}
/// <summary>
/// °ÜÆ°¤ò³«»Ï
/// </summary>
public void ResumeMove() {
tween.Play();
}
/// <summary>
/// ¥Ò¥Ã¥È¥¹¥È¥Ã¥×±é½Ð
/// </summary>
/// <returns></returns>
private IEnumerator WaitMove() {
tween.timeScale = 0.05f;
yield return new WaitForSeconds(0.5f);
tween.timeScale = 1.0f;
}
}
¡¡¥¹¥¯¥ê¥×¥È¤ò½¤Àµ¤·¤¿¤é¥»¡¼¥Ö¤ò¹Ô¤¤¤Þ¤¹¡£
¡¡Prefabs ¥Õ¥©¥ë¥À¤Ë¤¢¤ë Enemy ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤ò³Îǧ¤·¤Þ¤¹¡£
¿·¤·¤¯ public ½¤¾þ»Ò¤ÇÀë¸À¤·¤¿ EnemyData ÊÑ¿ô¤¬Äɲ䵤ì¤Æ¤¤¤Þ¤¹¡£
Enemy ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¡¡¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü
EnemyData ÊÑ¿ô¤Ï¤¹¤Ù¤Æ½é´üÃͤΤޤޤǹ½¤¤¤Þ¤»¤ó¡£
¥²¡¼¥à¤ò¼Â¹Ô¤·¤Æ¥¨¥Í¥ß¡¼¤¬À¸À®¤µ¤ì¤ë¤È¡¢¤³¤³¤Ë EnemyData ¤Î¾ðÊó¤¬ÂåÆþ¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡Debug ¤ò¹Ô¤¦ºÝ¤ËÌòΩ¤Á¤Þ¤¹¤Î¤Ç¡¢¤É¤Î½èÍý¤Ë¤è¤Ã¤Æ¡¢¤É¤ÎÃͤ¬ÊѲ½¤¹¤ë¤Î¤«¤òǰƬ¤ËÃÖ¤¤¤Æ¤ª¤¯¤³¤È¤¬½ÅÍפǤ¹¡£