¡¡£³¤Ä¤Î¥¯¥é¥¹¤òºîÀ®¤·¤Æ¡¢½èÍý¤ò¹½ÃÛ¤·¤Þ¤¹¡£
¡¡ºÇ½é¤Î¥¯¥é¥¹¤Ï MonoBehaviour ¥¯¥é¥¹¤ò·Ñ¾µ¤·¤Æ¤¤¤Ê¤¤¥¯¥é¥¹¤Ç¤¹¤Î¤Ç¡¢
Ê̤Υ¯¥é¥¹¤Ë¤Æ new ¤·¤Æ¥¤¥ó¥¹¥¿¥ó¥¹¤òºîÀ®¤·¤ÆÍøÍѤ·¤Þ¤¹¡£¤½¤Î¤¿¤á¥³¥ó¥¹¥È¥é¥¯¥¿¥á¥½¥Ã¥É¤âÍÑ°Õ¤·¤Æ¤¤¤Þ¤¹¡£
¡¡¤³¤³¤Ç¤Ï ReactiveCollection ¤Ç¥«¡¼¥É¤ò´ÉÍý¤·¤Æ¤¤¤Þ¤¹¤¬¡¢ReactiveCollection ¼«ÂΤιØÆɽèÍý¤Ï¤·¤Æ¤¤¤Ê¤¤¤¿¤á¡¢Ä̾ï¤Î List<int> ¤Ç¤â´ÉÍý¤Ç¤¤Þ¤¹¡£
<= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤¤Þ¤¹¡£
using UnityEngine;
using UniRx;
public class CardDeck
{
private ReactiveCollection<int> cards = new ();¡¡¡¡¡¡// ReactiveProperty ¤Î¤è¤¦¤ËÍøÍѤǤ¤ë List
¡¡¡¡// ¥³¥ó¥¹¥È¥é¥¯¥¿
public CardDeck(int cardCount)
{
// ¥«¡¼¥É¤Î¥Ç¥Ã¥¤ò½é´ü²½¤¹¤ë
for (int i = 0; i < cardCount; i++)
{
cards.Add(i + 1);
}
}
public void DrawCard(ReactiveProperty<int> cardResult)
{
if (cards.Count > 0)
{
// ¥«¡¼¥É¤ò¥é¥ó¥À¥à¤ËÁª¤Ó¡¢¼è¤ê½Ð¤¹
int index = Random.Range(0, cards.Count);
int card = cards[index];
¡¡¡¡¡¡¡¡¡¡¡¡// ¼è¤ê½Ð¤·¤¿¥«¡¼¥É¤Ï¥Ç¥Ã¥¤«¤éÈ´¤¯
cards.RemoveAt(index);
// ¥«¡¼¥É¤Î·ë²Ì¤òÀßÄꤹ¤ë
cardResult.Value = card;
}
else
{
Debug.Log("¥«¡¼¥É¤¬»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó");
}
}
}
¡¡²¼µ¤Î£²¤Ä¤Î¥¯¥é¥¹¤Ï MonoBehaviour ¥¯¥é¥¹¤ò·Ñ¾µ¤·¤Æ¤¤¤ë¤¿¤á¡¢¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥¢¥¿¥Ã¥Á¤·¤ÆÍøÍѤ·¤Þ¤¹¡£
<= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤¤Þ¤¹¡£
using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class CardDealerInput : MonoBehaviour
{
public Button drawButton;
public ReactiveProperty<int> cardResult = new ();
[SerializeField]
private int cardCount = 52;
private CardDeck deck;
private void Start()
{
deck = new CardDeck(cardCount);
drawButton.OnClickAsObservable()
¡¡¡¡¡¡¡¡¡¡¡¡.Subscribe(_ =>
¡¡¡¡{
¡¡¡¡// ¥«¡¼¥É¤ò°ú¤¯
¡¡¡¡deck.DrawCard(cardResult);
¡¡¡¡})
¡¡¡¡¡¡¡¡¡¡¡¡.AddTo(this);
}
}
<= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤¤Þ¤¹¡£
using UnityEngine;
using UniRx;
public class CardDealerObserver : MonoBehaviour
{
private CardDealerInput cardDealerInput;
private void Start()
{
if(!TryGetComponent(out cardDealerInput)) {
Debug.Log("CardDealerInput ¤ò¼èÆÀ½ÐÍè¤Þ¤»¤ó");
return;
}
// ¥«¡¼¥É¤Î·ë²Ì¤ò´Æ»ë¤¹¤ë
cardDealerInput.cardResult.Subscribe(x => Debug.Log($"°ú¤¤¤¿¥«¡¼¥É¡§{x}")).AddTo(this);
}
}
¡¡Subscribe ¤·¤¿½èÍý¤¬
£±¹Ô¤Î¾ì¹ç¡¢Â¾¤Î¥é¥à¥À¼°¤Î½ñ¼°¤ÈƱ¤¸¤è¤¦¤Ë¥Ö¥í¥Ã¥¯É½µ { } ¤ò¾Êά¤·¤Æµ½Ò¤Ç¤¤Þ¤¹¡£
¡¡CardDealer¥¯¥é¥¹¤òʬ³ä¤·¡¢CardDealerInput¥¯¥é¥¹¤ÈCardDealerObserver¥¯¥é¥¹¤òºîÀ®¤·¤Þ¤·¤¿¡£
¡¡CardDealerInput¥¯¥é¥¹¤Ï¥«¡¼¥É¤ò°ú¤¯¤¿¤á¤Î¥¯¥é¥¹¤Ç¤¢¤ê¡¢¥«¡¼¥É¤Î¥Ç¥Ã¥¤ÈcardResultÊÑ¿ô¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£
¡¡CardDealerObserver¥¯¥é¥¹¤Ï¥«¡¼¥É¤Î·ë²Ì¤ò´Æ»ë¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¤Ç¤¢¤ê¡¢CardDealerInput¥¯¥é¥¹¤¬ÍÑ°Õ¤·¤¿cardResultÊÑ¿ô¤ò´Æ»ë¤·¤Æ¤¤¤Þ¤¹¡£
¡¡CardDeck¥¯¥é¥¹¤Ï¥«¡¼¥É¤Î¥Ç¥Ã¥¤ò´ÉÍý¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¤Ç¤¢¤ê¡¢CardDealerInput¥¯¥é¥¹¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£
¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü
¡¡¥Ý¥¤¥ó¥È¤Ï CardDeck ¥¯¥é¥¹¤Î DrawCard ¥á¥½¥Ã¥É¤Î°ú¿ô¤Ç¤¹¡£
¤³¤Á¤é¤Ë¤Ï ReactiveProperty ¤¬ÅϤµ¤ì¤Æ¤¤¤Þ¤¹¡£Ä̾ï¤Î¥á¥½¥Ã¥É¤Î°ú¿ô¤ÏÃÍÅϤ·¤Ç¤¹¡£
¤è¤Ã¤Æ¼Â¹Ô¸µ¤Ç¤¢¤ëÃͤȤÏÊ̤ÎÃͤȤ·¤ÆÅϤäƤ¤Þ¤¹¤¬¡¢ReactiveProperty ¤Ï»²¾È·¿¤Ç¤¹¡£
»²¾È·¿¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î»²¾È¤òÊÝ»ý¤¹¤ë·¿¤Ç¤¢¤ê¡¢ÊÑ¿ô¼«ÂΤ¬ÃͤòÊÝ»ý¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢Ãͤ¬³ÊǼ¤µ¤ì¤Æ¤¤¤ë¥á¥â¥êÎΰè¤Ø¤Î»²¾È¤òÊÝ»ý¤·¤Þ¤¹¡£
¤è¤Ã¤Æ°ú¿ô¤Ë¤â¡¢¸µ¤Î cardResult ÊÑ¿ô¤Ø¤Î»²¾È¤¬ÊÝ»ý¤µ¤ì¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢¹¹¿·¤¹¤ë¤³¤È¤Ç¡¢cardResult ¤ÎÃͤ¬¹¹¿·¤µ¤ì¤Þ¤¹¡£
¡¡¤³¤Î¤³¤È¤«¤é¡¢ReactiveProperty ¤ò¥á¥½¥Ã¥É¤Î°ú¿ô¤Ç¼õ¤±¼è¤Ã¤¿¾ì¹ç¡¢Ê̤Υ¯¥é¥¹¤«¤é¤Ç¤â»²¾È¸µ¤Ç¤¢¤ë ReactiveProperty ¤ÎÃͤ¬¹¹¿·¤Ç¤¤Þ¤¹¡£
¤³¤ì¤Ï¥¤¥ó¥¹¥¿¥ó¥¹¤Î»²¾È¤ò¥á¥½¥Ã¥É¤Î°ú¿ô¤ËÅϤ·¤Æ¤¤¤ë¤Î¤Ç¡¢¤½¤ì¤Ë¤è¤ê¡¢¥á¥½¥Ã¥É¤Î°ú¿ô¤Ç¤Ï»²¾ÈÅϤ·¤Ç¤Ï¤Ê¤¤¾õÂ֤Ǽõ¤±¼è¤Ã¤Æ¤¤¤Æ¤â¡¢»²¾ÈÀè¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤¬¹¹¿·¤µ¤ì¤ë¤¿¤á¤Ç¤¹¡£
¡¡ReactiveProperty ¤Ï Subject ¸Æ¤Ð¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ò»ý¤Ã¤Æ¤ª¤ê¡¢¤³¤Î¥ª¥Ö¥¸¥§¥¯¥È¤òÄ̤¸¤ÆÃͤÎÊѹ¹¤äÄÌÃΤ¬¹Ô¤ï¤ì¤Þ¤¹¡£
¤·¤¿¤¬¤Ã¤Æ¡¢¤³¤Î¤è¤¦¤Ë°ú¿ô·Ðͳ¤Ç¤¢¤Ã¤Æ¤â»²¾ÈÀè¤Î¥ª¥Ö¥¸¥§¥¯¥È¤òÊѹ¹¤¹¤ì¤Ð¡¢ÃͤÎÊѹ¹¤äÄÌÃΤ¬¼«Æ°Åª¤Ë¹Ô¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
¼Â¹Ô·ë²Ì