¡¡¥¯¥é¥¹ÍѤΣ³¤Ä¤Î¥á¥ó¥ÐÊÑ¿ô¤òºï½ü¤·¡¢³Æ¥¯¥é¥¹¤Î¼èÆÀ½èÍý¤â£±²ó¤º¤Ä¤Ë¤·¤Þ¤¹¡£
¡¡¥¯¥é¥¹¤Î¾ðÊó¤Ï Dictionary Æâ¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¡Ö¤É¤ì¡×¤¬¡Ö¤É¤Î¡×Í×ÁǤȤ·¤Æ¸ºß¤·¤Æ¤¤¤ë¤«¤ÏÉÔÌÀ¤Ç¤¢¤ë¤¿¤á¡¢
¼Â¹ÔÌ¿Îá¤ò¤ª¤³¤Ê¤¦ºÝ¤Ë¥¯¥é¥¹¤ò»ØÄꤷ¤Æ½èÍý¤ò¹Ô¤¨¤ë¤è¤¦¤Ë¿·¤·¤¯ GetChara ¥á¥½¥Ã¥É¤òÄɲ䷤Ƥ¤¤Þ¤¹¡£
using System.Collections.Generic;¡¡¡¡//¡¡¢«¡¡Dictionary ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë»È¤¤¤Þ¤¹
using UnityEngine;
using System;¡¡¡¡//¡¡¢«¡¡Type ¤òÍøÍѤ¹¤ë¤¿¤á¤ËÄɲä·¤Þ¤¹
/// <summary>
/// ¥¥ã¥é¤Î´ÉÍý¥¯¥é¥¹
/// </summary>
[RequireComponent(typeof(CharaMove))]
[RequireComponent(typeof(CharaAnime))]
[RequireComponent(typeof(CharaAttack))]
public class CharaManager : MonoBehaviour
{
// private CharaMove charaMove;
// private CharaAnime charaAnime;
// private CharaAttack charaAttack;
private Vector2 direction; //¥¥ã¥é¤¬¸þ¤¤¤Æ¤¤¤ëÊý¸þ
public Vector2 Direction => direction; // get ¤Î¤ß¤Î¥×¥í¥Ñ¥Æ¥£
private Dictionary<Type, IChara> charaDictionary = new();
void Start() {
// ¥Ç¥Ð¥Ã¥°ÍÑ
//SetUpCharaManager();
}
/// <summary>
/// ³Æ¥¯¥é¥¹¤Î½é´üÀßÄê¡£³°Éô¥¯¥é¥¹¤«¤é¼Â¹Ô¤¹¤ëÁ°Äó
/// </summary>
public void SetUpCharaManager() {
// // Ä̾ï¤Î¾ì¹ç¡£GetComponents ¤È TryGetComponent ¤¬¤¢¤ë¤Î¤Ç¡¢Æ±¤¸¥¯¥é¥¹¤ò¼Â¼Á2²ó¼èÆÀ¤·¤Æ¤¤¤ë
// IChara[] charas = GetComponents<IChara>();
//
// // ³Æ»Ò¥¯¥é¥¹¤Î½é´üÀßÄê(¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ç¼èÆÀ¤·¤Æ¤¢¤ë¤Î¤Ç¡¢»Ò¥¯¥é¥¹¤¬°ã¤Ã¤Æ¤â foreach ¤Ç¤Þ¤È¤á¤Æ½èÍý¤Ç¤¤ë)
// foreach (var chara in charas) {
// chara.SetUpChara();
// }
//
// // ³Æ»Ò¥¯¥é¥¹¤Î¼èÆÀ
// TryGetComponent(out charaMove);
//
// TryGetComponent(out charaAnime);
//
//
// if(TryGetComponent(out charaAttack))
// {
// // ¹¶·â½àÈ÷
// charaAttack.PrepareAttackRepeatedly();
// }
// Dictionary ¤Î¾ì¹ç¡¢¾åµ¤Î£²½Å¼èÆÀ¤ÎÌäÂê¤ò²ò¾Ã¤Ç¤¤ë
IChara[] charas = GetComponents<IChara>();
// ³Æ¥¯¥é¥¹¤Î½é´üÀßÄê(¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ç¼èÆÀ¤·¤Æ¤¢¤ë¤Î¤Ç¡¢¥¯¥é¥¹¤¬°ã¤Ã¤Æ¤â foreach ¤Ç¤Þ¤È¤á¤Æ½èÍý¤Ç¤¤ë)
foreach (var chara in charas) {
charaDictionary[chara.GetType()] = chara;
chara.SetUpChara();
}
GetChara<CharaAttack>()?.PrepareAttackRepeatedly();
¡¡¡¡}
/// <summary>
/// Dictionary ¤Ë¤¢¤ë»ØÄꤷ¤¿¥¯¥é¥¹¤ò¼èÆÀ
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
private T GetChara<T>() where T : class, IChara // where ¤Ë class ¤ò»ØÄꤷ¤Ê¤¤¤È»²¾È·¿¤¬ÊݾڤǤ¤Ê¤¤¤Î¤Ç null ¤¬ÊÖ¤»¤Ê¤¤
{
if (charaDictionary.TryGetValue(typeof(T), out IChara chara))
{
return (T)chara;
}
return null; // Ìá¤êÃͤη¿¤Ï T? ¤Î¤è¤¦¤Ë null µöÍƤˤ·¤Ê¤¯¤Æ¤âÌäÂê¤Ê¤¤
}
void Update()
{
// null ¥Á¥§¥Ã¥¯
// if (charaMove == null || charaAnime == null) {
// return;
// }
// ¥¿¥Ã¥×ÆþÎÏ
if (Input.GetMouseButton(0)) {
// ¥¿¥Ã¥×¤·¤¿°ÌÃÖ¤«¤é¥ï¡¼¥ë¥ÉºÂɸ¼èÆÀ
Vector2 tapPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// °ÜÆ°¤È¥¢¥Ë¥áƱ´ü
//charaMove.Move(tapPos);
GetChara<CharaMove>()?.Move(tapPos);
// ¸þ¤¤Î¹¹¿·
UpdateDirection(tapPos);
// °ÜÆ°¸þ¤¤È¥¢¥Ë¥á¤Î¸þ¤¤ÎƱ´ü
//charaAnime.UpdateAnimation(direction);
GetChara<CharaAnime>()?.UpdateAnimation(direction);
}
¡¡¡¡¡¡¡¡// CharaAttack ¤Ë¹¶·âÍѤθþ¤¤Î¾ðÊó¤òÄó¶¡
// if (charaAttack != null) {
// charaAttack.UpdateAttackDirection(direction);
// }
GetChara<CharaAttack>()?.UpdateAttackDirection(direction);
// ¹¶·â¤Î°ì»þÄä»ß¤ÈºÆ³«
if (Input.GetMouseButtonDown(1))
{
// ¹¶·â¤Î°ì»þÄä»ß¡¦ºÆ³«¤òÀÚ¤êÂؤ¨¤ë
//charaAttack.ToggleAttack();
GetChara<CharaAttack>()?.ToggleAttack();
}
}
/// <summary>
/// ¸þ¤¤Î¹¹¿·
/// </summary>
/// <param name="newPos"></param>
private void UpdateDirection(Vector2 newPos)
{
direction = (newPos - (Vector2)transform.position).normalized;
}
}
¡¡½èÍý¤Î¼Â¹ÔÌ¿Î᤬¡¢ÊÑ¿ô·Ðͳ¤Ç¤Ï¤Ê¤¯¡¢List Æâ¤Î½êÄê¤Î¥¯¥é¥¹¤ò»ØÄꤷ¤Æ¼Â¹Ô¤¹¤ë·Á¼°¤ËÊѹ¹¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
GetChara<CharaAttack>()?.PrepareAttackRepeatedly();
¡¡¤³¤ÎÌ¿Îá¤Ë¤è¤ê¡¢²¼µ¤Î¥á¥½¥Ã¥É¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£
private T GetChara<T>() where T : class, IChara
{
if (charaDictionary.TryGetValue(typeof(T), out IChara chara))
{
return (T)chara;
}
return null;
}
¡¡¥¸¥§¥Í¥ê¥Ã¥¯¤Ç¤¢¤ë T ¤ÎÉôʬ¤Ë¤Ï¡¢¼Â¹ÔÌ¿Îá»þ¤Ë GetChara<T> ¤Ç»ØÄꤷ¤¿¥¯¥é¥¹¤¬Æþ¤ê¤Þ¤¹¤Î¤Ç¡¢
º£²ó¤Ç¤¢¤ì¤Ð¡¢T ¤Ï²¼µ¤Î¤è¤¦¤Ë¤¹¤Ù¤Æ CharaAttack ¤Ç½èÍý¤µ¤ì¤Þ¤¹¡£
¡ã¥¸¥§¥Í¥ê¥Ã¥¯¤Ç¤¢¤ë T Éôʬ¤òÃÖ¤´¹¤¨¤ë¡ä
private CharaAttack GetChara<CharaAttack>() where CharaAttack : class, IChara
{
if (charaDictionary.TryGetValue(typeof(CharaAttack), out IChara chara))
{
return (CharaAttack)chara;
}
return null;
}
¡¡¤Þ¤º T ¤ÎÃͤǤ¢¤ë CharaAttack ¥¯¥é¥¹¤¬¡¢where ¤Ë¤è¤Ã¤Æ¥¯¥é¥¹¤«¡¢IChara ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¤«¥Á¥§¥Ã¥¯¤µ¤ì¤Þ¤¹¡£
º£²ó¤Ï¤É¤Á¤é¤âÌäÂꤢ¤ê¤Þ¤»¤ó¤Î¤Ç¡¢Â³¤±¤Æ¥á¥½¥Ã¥ÉÆâ¤Î½èÍý¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£
¡¡Dictionary ¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë TryGetValue ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¡¢Dictionary Æ⤫¤é CharaAttack ¥¯¥é¥¹¤¬¼èÆÀ¤Ç¤¤ë¤«È½Äꤷ¤Þ¤¹¡£
¼èÆÀ¤Ç¤¤¿¾ì¹ç¤Ë¤Ï out ¥¡¼¥ï¡¼¥É¤Î±¦ÊÕ¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë chara ÊÑ¿ô¤Ë¾ðÊó¤¬ÂåÆþ¤µ¤ì¤Þ¤¹¡£
¤¿¤À¤·¤³¤Î¤È¤¼èÆÀ¤·¤¿ÃÍ¤Ï IChara ·¿¤Ç¤¢¤ë¤¿¤á¡¢return ¤Î¥¿¥¤¥ß¥ó¥°¤Ç CharaAttack ¥¯¥é¥¹¤Ë¥¥ã¥¹¥È¤·¤ÆÌᤷ¤Þ¤¹¡£
¡¡¤â¤·¤â Dictionary Æâ¤Ë CharaAttack ¥¯¥é¥¹¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¤Ë¤Ï null ¤òÌᤷ¤Þ¤¹¡£
GetChara<CharaAttack>()?.PrepareAttackRepeatedly();
¡¡¤³¤Î½èÍý¤Ç¤Ï¡¢¥á¥½¥Ã¥É¤ÎºÇ¸å¤Ë ? ±é»»»Ò¤¬¤¢¤ê¡¢
Ìá¤êÃͤ¬ null ¤Ç¤Ï¤Ê¤¤¤«¡¢³Îǧ¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹(null ¥Á¥§¥Ã¥¯)¡£
¤½¤·¤Æ¡¢null ¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ë¤Ï»ØÄꤷ¤¿¥¯¥é¥¹¤¬¼èÆÀ¤Ç¤¤¿¾ì¹ç¤Î¤ß¡¢¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£
¡¡Dictionary ¤Ë¤è¤Ã¤Æ¥¯¥é¥¹¤ò´ÉÍý¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢¤³¤ÎÊýË¡¤ò»È¤¦¤³¤È¤Ç¡¢¥¯¥é¥¹¤Î½ÅÊ£¼èÆÀ¤ä¥á¥ó¥ÐÊÑ¿ô¤ò¤Ê¤¯¤·¡¢
¤½¤·¤Æ¥¯¥é¥¹¤ò»È¤¦¥¿¥¤¥ß¥ó¥°¤Ç¥Á¥§¥Ã¥¯¤·¤Æ»È¤¦Êý¼°¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
¡¡Update ¥á¥½¥Ã¥ÉÆâ¤Ç¤Î null ¥Á¥§¥Ã¥¯¤â¤¹¤Ù¤Æ¾åµ¤Î ? ±é»»»Ò¤Ë¤è¤ë null ¥Á¥§¥Ã¥¯¤ËÃÖ¤´¹¤¨¤Æ¤¤¤Þ¤¹¡£
¤½¤Î¤¿¤á¡¢½èÍý¤¬´Ê·é¤Ëµ½Ò¤µ¤ì¤Æ¤¤¤Þ¤¹¡£