¡¡¹¶·â¤Ë´Ø¤¹¤ëµ¡Ç½¤òÌò³ä¤È¤·¤Æ»ý¤Ä¥¯¥é¥¹¤Ç¤¹¡£
CharaController ¥¯¥é¥¹¤Ë¤¢¤Ã¤¿¡¢¹¶·â¤Ë´Ø¤¹¤ë¥á¥ó¥ÐÊÑ¿ô¤È¥á¥½¥Ã¥É¤ò¤³¤Á¤é¤Ë°Ü¤·¤Æ¤¤¤Þ¤¹¡£
¤½¤ÎºÝ¤Ë¥á¥½¥Ã¥É̾¤òÊѹ¹¤·¤¿¤ê¡¢¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤òľÀܼ¹Ԥ·¤Ê¤¤¤¿¤á¤ËÃç²ðÌò¤Î¥á¥½¥Ã¥É¤òÄɲ䷤Ƥ¤¤Þ¤¹¡£
¡¡¥Ý¥¤¥ó¥È¤Ï¡¢¥×¥ì¥¤¥ä¡¼¤ÎºÇ¿·¤ÎÊý¸þ¤Î¾ðÊó¤ò CharaManager ¤«¤é»²¾È¤¹¤ë¤¿¤á¤Î
¥×¥í¥Ñ¥Æ¥£¤òÍÑ°Õ¤·¤Æ¤¤¤ëÉôʬ¤Ç¤¹¡£
C# ¤Î¥×¥í¥Ñ¥Æ¥£¤Ï¡¢ÃÍ·¿¤Ç¤¢¤Ã¤Æ¤â»²¾È·¿¤Ç¤¢¤Ã¤Æ¤â¡¢
³°Éô¤ÎÊÑ¿ô¤äÃͤòÊÝ»ý¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥²¥Ã¥¿¡¼¤ä¥»¥Ã¥¿¡¼¤Î¥á¥½¥Ã¥É¤òÄ̤¸¤Æ³°Éô¤È¤ÎÃͤΤä¤ê¼è¤ê¤ò¹Ô¤¤¤Þ¤¹¡£
¤½¤Î¤¿¤á¡¢
¥×¥í¥Ñ¥Æ¥£¤òÄ̤¸¤ÆÃͤòÀßÄꤹ¤ë¤È¡¢ÆâÉô¤Ç¤ÎÃͤΥ³¥Ô¡¼¤¬¹Ô¤ï¤ì¡¢¤½¤Î¸å¤â
³°ÉôÊÑ¿ô¤¬¹¹¿·¤µ¤ì¤ë¤È¥×¥í¥Ñ¥Æ¥£¤Î¥»¥Ã¥¿¡¼¤¬¸Æ¤Ó½Ð¤µ¤ì¤ÆÃͤ¬¹¹¿·¤µ¤ì¤Þ¤¹¡£
¤³¤Î»ÅÁȤߤˤè¤ê¡¢ºÇ¿·¤Î¾ðÊó¤ò¥×¥í¥Ñ¥Æ¥£¤òÄ̤¸¤Æ»²¾È¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡º£²ó¤Ç¤¢¤ì¤Ð¡¢CharaManager ¤Ë¤¢¤ë direction ÊÑ¿ô¤Ï Vector2 ·¿¤Ç¤¢¤ê¡¢ÃÍ·¿¤Ç¤¹¡£
¤½¤Î¾ðÊó¤ò»²¾È¤¹¤ë¤¿¤á¤ËÍÑ°Õ¤¹¤ë¥×¥í¥Ñ¥Æ¥£¤Î·¿¤â Vector3 ¤ÇÃÍ·¿¤Ç¤¹¤¬¡¢¥×¥í¥Ñ¥Æ¥£¤ò²ð¤·¤ÆÃͤòÀßÄꤹ¤ë»ö¤Ç¡¢ºÇ¿·¤Î»²¾È¤¬²Äǽ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
¡¡¤³¤Îµ¡Ç½¤Ë¤è¤ê¡¢CharaManager ¤Î¾ðÊó¤ò¸µ¤Ë
¼«Æ°Åª¤ËºÇ¿·¤Î¥×¥ì¥¤¥ä¡¼¤ÎÊý¸þ¤Î¾ðÊó¤ò¹¹¿·¤Ç¤¤ë»ÅÁȤߤòƳÆþ¤·¤Æ¤¤¤Þ¤¹¡£
¡¡¤Þ¤¿¿·¤·¤¤µ¡Ç½¤È¤·¤Æ¡¢¹¶·â¤ò°ì»þÄä»ß/ºÆ³«¤¹¤ë¤¿¤á¤Îµ¡Ç½¤òÄɲä·¤Þ¤¹¡£
<= ¥¯¥ê¥Ã¥¯¤·¤¿¤é³«¤¤Þ¤¹¡£
using System.Collections;
using UnityEngine;
/// <summary>
/// ¥¥ã¥é¤Î¹¶·âÍÑ¥¯¥é¥¹
/// </summary>
public class CharaAttack : MonoBehaviour, IChara
{
[SerializeField] private float attackInterval;
private BulletGenerator bulletGenerator;
private bool isAttack;
private Vector2 attackDirection;
// CharaManager ¤«¤éºÇ¿·¤Î¥×¥ì¥¤¥ä¡¼¤ÎÊý¸þ¤Î¾ðÊó¤ò»²¾È¤¹¤ë¤¿¤á¤Î¥×¥í¥Ñ¥Æ¥£
public Vector2 AttackDirection { set => attackDirection = value; }
/// <summary>
/// ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ç¶¯À©Åª¤Ë¼ÂÁõ¤µ¤ì¤ë¥á¥½¥Ã¥É
/// </summary>
public void SetUpChara(haraManager charaManager) {¡¡¡¡//¡¡¢«¡¡¡ù¡¡°ú¿ô¤òÄɲÃ
////* ½èÍý¤òÄɲà *////
if (charaManager) {
charaManager.Direction.Subscribe(value => AttackDirection = value);
}
////* ¤³¤³¤Þ¤Ç *////
TryGetComponent(out bulletGenerator);
Debug.Log("CharaAttack ÀßÄ괰λ");
}
/// <summary>
/// È¿Éü¹¶·â¤Î½àÈ÷
/// </summary>
public void PrepareAttackRepeatedly() {
isAttack = true;
if (bulletGenerator) {
StartCoroutine(PrepareAttack());
Debug.Log("¹¶·â½àÈ÷³«»Ï");
}
else {
Debug.Log("BulletGenerator ¤¬¼èÆÀ¤Ç¤¤Æ¤¤¤Ê¤¤¤¿¤á¡¢¹¶·â¤Ï¹Ô¤¤¤Þ¤»¤ó");
}
}
/// <summary>
/// È¿Éü¹¶·â
/// </summary>
/// <returns></returns>
private IEnumerator AttackRepeatedlyCoroutine()
{
while (true)
{
// while ¤ÎÆâÉô¤Ë bool ¤Ê¤É¤Îʬ´ô¤òºî¤ë¤È¡¢¹¶·â¤Î°ì»þÄä»ß¤äºÆ³«¤ËÂбþ¤Ç¤¤ë
if (!isAttack) {
yield return null;
continue;
}
yield return new WaitForSeconds(attackInterval);
Attack();
}
}
/// <summary>
/// ¹¶·â¤Î¼Â½èÍý
/// </summary>
private void Attack()
{
bulletGenerator.PrepareGenerateBullet(attackDirection);
Debug.Log("¹¶·â");
}
/// <summary>
/// È¿Éü¹¶·â¤Î°ì»þÄä»ß
/// </summary>
public void PauseAttack() {
isAttack = false;
}
/// <summary>
/// È¿Éü¹¶·â¤ÎºÆ³«
/// </summary>
public void ResumeAttack() {
isAttack = true;
}
/// <summary>
/// ¹¶·â¤Î¥ª¥ó¥ª¥Õ(°ì»þÄä»ß¡¦ºÆ³«)¤ÎÀÚ¤êÂؤ¨
/// </summary>
public void ToggleAttack() {
isAttack = !isAttack;
Debug.Log(isAttack ? "¹¶·âºÆ³«" : "¹¶·âÄä»ß");
}
}
¡¡CharaManager ¥¯¥é¥¹¤ËÄɲ乤ë ReactiveProperty ¤Ç¤¢¤ë Direction ÊÑ¿ô¤ò¹ØÆɤ·¡¢
Ãͤ¬¹¹¿·¤µ¤ì¤ë¤¿¤Ó¤Ë AttackDirection ¤ÎÃͤò¹¹¿·¤¹¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£
¡¡¤³¤Î½èÍý¤Ï CharaManager ¤ÇÍÑ°Õ¤¹¤ë¤³¤È¤â¤Ç¤¤Þ¤¹¤¬¡¢¤³¤Î CharaAttack ¥¯¥é¥¹¤ÏÊ£¿ô¤Î¹¶·â½èÍý¤ò¹Ô¤¦¾ì¹ç¤Ë¤ÏÍøÍѤ·¤Ê¤¤Í½Äê¤Ç¤¹¡£
¤½¤Î¤¿¤á¡¢CharaManager ¤Ë½èÍý¤ò½ñ¤¤¤Æ¤·¤Þ¤¦¤È¡¢CharaAttack ¥¯¥é¥¹¤òÍøÍѤ·¤Ê¤¤¾ì¹ç¤Ë¤ª¤¤¤ÆÉÔÊؤÊÅÀ¤¬À¸¤¸¤Þ¤¹¡£
(Î㤨¤Ð»È¤Ã¤Æ¤¤¤Ê¤¤ÊÑ¿ô¤ò¥³¥á¥ó¥È¥¢¥¦¥È¤Ê¤É¤¹¤ë¤È¡¢¤½¤ÎÊÑ¿ô¤ò»È¤Ã¤Æ¤¤¤ëÉôʬ¤Ç¥¨¥é¡¼¤¬À¸¤¸¤Þ¤¹¡£)
¡ã¤³¤Î¤è¤¦¤Ê¼ÂÁõ¤â¤Ç¤¤ë¤¬¡¢CharaManager ¤Ç¤Î¼ÂÁõ¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡ä
using UniRx;
using UnityEngine;
public class CharaAttack : MonoBehaviour, IChara
{
private Vector2 attackDirection;
// CharaManager ¤«¤é¤ÎÊý¸þ¾ðÊó¤ò¹ØÆɤ¹¤ë¥×¥í¥Ñ¥Æ¥£
public Vector2 AttackDirection => attackDirection;
}
public class CharaManager : MonoBehaviour
{
private CharaAttack charaAttack;
private ReactiveProperty<Vector2> Direction = new ();
private void Start()
{
if (TryGetComponent(out charaAttack))
{
// CharaAttack ¦¤Î¥×¥í¥Ñ¥Æ¥£¤òľÀܹ¹¿·
Direction.Subscribe(diruection => charaAttack.AttackDirection = direction);
}
}
// CharaManager ¤ÎÊý¸þ¾ðÊó¤ò¹¹¿·¤¹¤ë¥á¥½¥Ã¥É
public void UpdateDirection(Vector2 newDirection)
{
// Êý¸þ¾ðÊó¤òÀßÄê
Direction.Value = newDirection;
}
}
¡¡CharaAttack ¥¯¥é¥¹Æâ¤Î½èÍý¤ò CharaManager ¥¯¥é¥¹¤ÈÀÚ¤êÎ¥¤·¤ÆÆÈΩÀ¤òÊݤĤ¿¤á¡¢ CharaAttack ¥¯¥é¥¹Æâ¤Ç¤Î¹ØÆɽèÍý¤ò¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£