¡¡¤³¤Á¤é¤âÀè¤Û¤É¤Î¼ê½ç¤ÇºîÀ®¤·¤¿ OrbitingBulletGenerator ¤ò¥¹¥¯¥ê¥×¥È¤ò¸µ¤Ë½¤Àµ¤·¤Þ¤¹¡£
¤¿¤À¤·¡¢½¤Àµ²Õ½ê¤¬Â¿¤¤¤¿¤á¡¢¿·¤·¤¤¥¹¥¯¥ê¥×¥È¤òºîÀ®¤·Ä¾¤·¤¿Êý¤¬¤è¤¤¤Ç¤·¤ç¤¦¡£
¡¡MonoBehaviour ¥¯¥é¥¹¤Ç¤Ï¤Ê¤¯¡¢GeneratorBase ¥¯¥é¥¹¤ò·Ñ¾µ¤·¤Æ¤¤¤Þ¤¹¡£
¤½¤Î¤¿¤á¡¢¤³¤Î¥¯¥é¥¹¤Ë¤Ï¡¢GeneratorBase ¥¯¥é¥¹¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Îµ¡Ç½¤¬È÷¤ï¤Ã¤Æ¤¤¤Þ¤¹¡£
¡¡Àû²ó¤¹¤ëÃÆ(OrbitingBullet)¤Ë¤Ä¤¤¤Æ¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤Îµ¡Ç½¤òÍøÍѤ·¤Æ¡¢À¸À®¡¦É½¼¨¤ò¹Ô¤¤¤Þ¤¹¡£
¡¡¤¤¤Þ¤Þ¤Ç¤ÈƱ¤¸¤è¤¦¤ËÅê¼Í¤¹¤ëÃƤòÀ¸À®¤·¡¢½é´üÀßÄꤹ¤ëÌ¿Îá¤Èȯ¼Í¤¹¤ëÌ¿Îá¤ò¼Â¹Ô¤·¤Æ¤¤¤Þ¤¹¤¬¡¢
ȯ¼Í¤·½ª¤ï¤Ã¤¿Àû²ó¤¹¤ëÃƤò¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤ËÌ᤹¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£
OrbitingBulletGenerator_Pool.cs
<= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤¤Þ¤¹¡£
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
/// <summary>
/// ¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤È¥¯¥é¥¹·Ñ¾µ¤·¤¿¥¿¥¤¥×¤Î»ÈÍÑÎã
/// </summary>
public class OrbitingBulletGenerator_Pool : GeneratorBase¡¡¡¡//¡¡¢«¡¡GeneratorBase ¥¯¥é¥¹¤ò·Ñ¾µ¤·¤Þ¤¹
{
[SerializeField] private int debugNumberOfBullets = 3;
[SerializeField]
private List<BulletBase> bulletList = new();
private readonly float tweenTime = 0.3f;
//Êü¼Í»þ¤ÎÀßÄêÃÍ
[SerializeField] private ThrowingBullet_Pool throwingBulletPrefab;
private OrbitingBulletState currentOrbitingBulletState = OrbitingBulletState.Nothing;
public OrbitingBulletState CurrentOrbitingBulletState => currentOrbitingBulletState;
public override void GenerateBullet(Vector2 direction) { }
/// <summary>
/// ¥Ð¥ì¥Ã¥È¤ÎÀ¸À®¤ÈÇÛÃÖ¤¬¤Ç¤¤ë¤«¥¥ã¥¹¥È¤·¤Æ³Îǧ
/// </summary>
/// <param name="direction"></param>
/// <param name="numberOfBullets"></param>
/// <typeparam name="T"></typeparam>
public override void GenerateBullet<T>(Vector2 direction, T numberOfBullets) {
Debug.Log("³«»Ï");
// int ¤Ë¥¥ã¥¹¥È¤Ç¤¤ë¤«³Îǧ
if (numberOfBullets is int intNumberOfBullets) {
// ¥Ð¥ì¥Ã¥È¤ÎÀ¸À®¤ÈÇÛÃÖ
GenerateBullets(direction, intNumberOfBullets);
Debug.Log("À¸À®³«»Ï");
}
}
/// <summary>
/// ¥Ð¥ì¥Ã¥È¤ÎÀ¸À®¤ÈÇÛÃÖ
/// </summary>
/// <param name="direction"></param>
/// <param name="numberOfBullets"></param>
private void GenerateBullets(Vector2 direction, int numberOfBullets) {
// ¥Ç¥Ð¥Ã¥°ÍÑ
numberOfBullets = numberOfBullets == 0 ? debugNumberOfBullets : numberOfBullets;
currentOrbitingBulletState = OrbitingBulletState.Turning;
// ÃƤοô¤Ë´ð¤Å¤¤¤Æ¡¢³ÆÃƤÎȯ¼Í³ÑÅÙ¤ò·×»»
float offsetAngle = 360f / numberOfBullets;
// ÃƤοô¤À¤±¥ë¡¼¥×
for (int i = 0; i < numberOfBullets; i++) {
// º£²óȯ¼Í¤¹¤ëÃƤγÑÅÙ¤ò·×»»
float angle = i * offsetAngle;
// ȯ¼Í³ÑÅÙ¤ò¥Ù¥¯¥È¥ë¤ËÊÑ´¹¤·¤Æ¡¢ÃƤοʹÔÊý¸þ¤ò·×»»(Quaternion * Vector3 ¤Î·×»»)
Vector3 offsetDirection = Quaternion.Euler(0, 0, angle) * direction;
Debug.Log($"ÃƤοʹÔÊý¸þ¤È°ÌÃÖ : {offsetDirection}");
// ÃƤòÀ¸À®¤¹¤ë
// ¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤«¤é¼è¤ê½Ð¤¹¡£Ìµ¤±¤ì¤ÐÀ¸À®¤¹¤ë
BulletBase bullet = GetBullet(transform.position, Quaternion.identity);
// ÃƤȥץ쥤¥ä¡¼¤Î¿Æ»Ò´Ø·¸¤Î¹½ÃÛ
bullet.transform.SetParent(charaController.transform);
// DOTween ¤Î½èÍý
{
// ¸½ºß¤Î¥µ¥¤¥º¤ò°ì»þÊݸ¤·¤Æ¤«¤é¡¢¥µ¥¤¥º¤ò¤¹¤Ù¤Æ 0 ¤Ë¤·¤Æ¼ê΢·õ¤ò¸«¤¨¤Ê¤¤¾õÂ֤ˤ¹¤ë
float scale = bullet.transform.localScale.x;
bullet.transform.localScale = Vector3.zero;
// ¥µ¥¤¥º¤ò¸µ¤ËÌ᤹¤³¤È¤Ç¡¢¼ê΢·õ¤ò¥µ¥¤¥º¥¢¥Ã¥×¤µ¤»¤Æ½ù¡¹¤Ëɽ¼¨¤¹¤ë
Sequence sequence = DOTween.Sequence();
sequence.Append(bullet.transform.DOScale(Vector3.one * scale, tweenTime)
.SetEase(Ease.OutBack));
// ÇÛÃÖ°ÌÃ֤ޤǰÜÆ°¡£DOTween ¤ÇÇÛÃÖ¤¹¤ë¾ì¹ç¡¢ºÂɸ°ÜÆ°¤ÏÀ¸À®»þ¤Ç¤Ï¤Ê¤¯ DOTween ¤Ç¤ª¤³¤Ê¤¦
sequence.Join(bullet.transform
.DOLocalMove(bullet.transform.localPosition + offsetDirection, tweenTime)
.SetEase(Ease.InQuart));
}
// ÃƤÎÀßÄê(¸øž²óž³«»Ï)
bullet.SetUp(charaController);
bulletList.Add(bullet);
}
}
/// <summary>
/// ¥×¥ì¥¤¥ä¡¼¤Î¸þ¤¤¤Æ¤¤¤ëÊý¸þ¤ËÃƤòÊü¼Í
/// </summary>
/// <param name="direction"></param>
public void GenerateThrowingBullet(Vector2 direction) {
currentOrbitingBulletState = OrbitingBulletState.Thorwing;
// Ê£¿ô¤ÎÃƤò´ÉÍý¤¹¤ë¤¿¤á¤Î¥³¥ó¥Æ¥ÊÌò¤Î¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®
ThrowingBullet_Pool throwingBullet = Instantiate(throwingBulletPrefab, transform.position, Quaternion.identity);
// ³ÆÃƤò¥³¥ó¥Æ¥Ê¤Î»Ò¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤·¤Æ¤«¤é¡¢¥³¥ó¥Æ¥Ê¤òȯ¼Í
throwingBullet.SetUp(bulletList);
throwingBullet.Shoot(direction * bulletSpeed, duration);
Debug.Log(direction * bulletSpeed);
// ¼¡¤ÎÃƤÎÀ¸À®½àÈ÷
StartCoroutine(ResetOrbitingBullets());
}
/// <summary>
/// ÃƤòÊü¼Í¤·¤¿¸å¤Î½èÍý
/// OrbitingBulletState.Nothing ¤Ë¤¹¤ë¤³¤È¤Ç¡¢CharaController ¦¤ÇºÆÅÙ¡¢¼ê΢·õ¤ÎÀ¸À®½èÍý¤ò¼Â¹Ô¤µ¤»¤ë
/// </summary>
/// <returns></returns>
private IEnumerator ResetOrbitingBullets() {
yield return new WaitForSeconds(duration + 0.2f);
// ÃƤϳƼ«¤Ç Release ¤·¤Æ¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤ËÌᤷ¤Æ¤¤¤ë¤Î¤Ç¡¢ÃƤò´ÉÍý¤·¤Æ¤¤¤¿ List ¤Î¤ß¥¯¥ê¥¢¤¹¤ë
bulletList.Clear();
currentOrbitingBulletState = OrbitingBulletState.Nothing;
}
}
¡¡ÃƤòÀ¸À®¤¹¤ë½èÍý¤¬¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤Îµ¡Ç½¤òÍøÍѤ¹¤ëÊýË¡¤Ë¥ê¥Õ¥¡¥¯¥¿¥ê¥ó¥°¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
// ÃƤòÀ¸À®¤¹¤ë
// ¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤«¤é¼è¤ê½Ð¤¹¡£Ìµ¤±¤ì¤ÐÀ¸À®¤¹¤ë
BulletBase bullet = GetBullet(transform.position, Quaternion.identity);
¡¡¤³¤Î½èÍý¤ÎÁ°¸å(DOTween ¤òÍøÍѤ¹¤ëÉôʬ¤Ê¤É)¤ÏÊѹ¹¤¢¤ê¤Þ¤»¤ó¡£
¡¡¤Þ¤¿°ÊÁ°¤ÏÀû²ó¤¹¤ëÃƤòÇË´þ¤·¤Æ¤¤¤¿Éôʬ¤Ë¤Ä¤¤¤Æ¤Ï¡¢Åê¼ÍÍѤΥ¹¥¯¥ê¥×¥ÈÆâ¤Ç¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤ËÌ᤹½èÍý¤ò¹Ô¤Ã¤Æ¤¤¤ë¤¿¤á¡¢
Âå¤ï¤ê¤Ë List ¤ÎÃæ¿È¤òºï½ü¤¹¤ë¤À¤±¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£