Unity¤Ë´ØÏ¢¤¹¤ëµ­»ö¤Ç¤¹

¡¡Ì¤ÊÔ½¸

¡¡³Æ¥¹¥¯¥ê¥×¥È



View



using System;
using System.Collections.Generic; // IObservable ¤ò»È¤¦¤¿¤á¤ËɬÍ×
using System.Linq;
using System.Text;  // StringBuilder ¤ò»È¤¦¤¿¤á¤ËɬÍ×
using UnityEngine;
using UnityEngine.UI;
using UniRx;

public class NumberGameView : MonoBehaviour
{
    [SerializeField] private Text[] txtSelectNumbers;
    [SerializeField] private Text txtExplanation;
    [SerializeField] private Text txtCount;
    [SerializeField] private Text txtCountMax;
    
    [SerializeField] private Button callButton;
    public Button CallButton => callButton;  // ¥×¥í¥Ñ¥Æ¥£

    [SerializeField] private NumberButton numberButtonPrefab;
    [SerializeField] private Transform numberButtonTran;
    private int buttonCount = 10;

    [SerializeField] private List<Button> numberButtonList = new();
    [SerializeField] private Button deleteButton;

    // OnClickAsObservable()¤Î¹ØÆɽèÍý¤ò»Ü¤·¤¿¥Ü¥¿¥ó¤Î¥×¥í¥Ñ¥Æ¥£
    public IObservable<Unit> OnCallButtonClickAsObservable => callButton.OnClickAsObservable();
    public IObservable<Unit> OnDeleteButtonClickAsObservable => deleteButton.OnClickAsObservable();

    // OnNumberButtonClickAsObservable¥×¥í¥Ñ¥Æ¥£¤Ï¡¢numberButtonsÇÛÎó¤Î³Æ¥Ü¥¿¥ó¤ËÂФ·¤ÆOnClickAsObservable()¤ò¹ØÆɤ·¡¢¥¯¥ê¥Ã¥¯¤µ¤ì¤¿¥Ü¥¿¥ó¤ÎÍ×ÁÇÈÖ¹æ¤ò¥¹¥È¥ê¡¼¥à¤Ëή¤¹IObservable<int>¤òºîÀ®¤·¤Æ¤¤¤ë
    // numberButtonList.Select()¤Ï¡¢³Æ¥Ü¥¿¥ó¤È¤½¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò°ú¿ô¤È¤·¤Æ¡¢¥Ü¥¿¥ó¤¬¥¯¥ê¥Ã¥¯¤µ¤ì¤¿¤È¤­¤Ë¥¤¥ó¥Ç¥Ã¥¯¥¹¤òή¤¹IObservable<int>¤òÊÖ¤¹
    // ¤³¤ì¤Ë¤è¤ê¡¢numberButtonsÇÛÎó¤Î³Æ¥Ü¥¿¥ó¤¬¼«Ê¬¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤òµ­Ï¿¤·¡¢¥¯¥ê¥Ã¥¯¤µ¤ì¤¿¤È¤­¤Ë¤½¤ì¤ò¥¹¥È¥ê¡¼¥à¤Ëή¤¹¤³¤È¤¬¤Ç¤­¤ë
    // ¤Þ¤¿¡¢ºÇ¸å¤Ë¤¢¤ëMerge()¤Ï¡¢numberButtonList.Select()¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤¿Ê£¿ô¤ÎIObservable<int>¥¹¥È¥ê¡¼¥à¤ò1¤Ä¤ÎIObservable<int>¥¹¥È¥ê¡¼¥à¤ËÅý¹ç¤·¤Æ¤¤¤ë
    // ¤³¤ì¤Ë¤è¤ê¡¢OnNumberButtonClickAsObservable¥×¥í¥Ñ¥Æ¥£¤Ï¡¢¤É¤Î¥Ü¥¿¥ó¤¬¥¯¥ê¥Ã¥¯¤µ¤ì¤¿¤«¤Ë´Ø·¸¤Ê¤¯¡¢¥¯¥ê¥Ã¥¯¤µ¤ì¤¿¥Ü¥¿¥ó¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤òή¤¹Ã±°ì¤ÎIObservable<int>¥¹¥È¥ê¡¼¥à¤È¤·¤Æ°·¤¦¤³¤È¤¬¤Ç¤­¤ë
    public IObservable<int> OnNumberButtonClickAsObservable => numberButtonList.Select((button, index) => button.OnClickAsObservable().Select(_ => index)).Merge();


    void Start() {
        GenerateNumberButtons();    
    }

    public void GenerateNumberButtons() {
        for (int i = 0; i < buttonCount; i++) {
            int index = i;
            NumberButton numberButton = Instantiate(numberButtonPrefab, numberButtonTran, false);
            numberButton.SetUpNumberButton(index);
            numberButtonList.Add(numberButton.BtnNumber);
        }
    }
    

    /// <summary>
    /// ¥Ü¥¿¥ó¤òÈó³èÀ­²½
    /// </summary>
    /// <param name="number"></param>
    public void DisableNumberButton(int number)
    {
        numberButtonList[number].interactable = false;
    }

    /// <summary>
    /// ¥Ü¥¿¥ó¤ò³èÀ­²½
    /// </summary>
    /// <param name="number"></param>
    public void EnableNumberButton(int number)
    {
        numberButtonList[number].interactable = true;
    }


    public void InitialView() {
        callButton.interactable = false;

        SwitchAllButtons(true);

        txtExplanation.text = "";
    }
    
    
    /// <summary>
    /// Á´¿ô»ú¥Ü¥¿¥ó¤Î¾õÂÖ¤ÎÀÚ¤êÂؤ¨
    /// </summary>
    /// <param name="isSwitch"></param>
    public void SwitchAllButtons(bool isSwitch) {

        for (int i = 0; i < numberButtonList.Count; i++) {
            numberButtonList[i].interactable = isSwitch;
        }
    }
    
    
    
    
        /// <summary>
    /// ÆþÎϤ·¤¿¿ô»ú¤ò²èÌ̤Ëɽ¼¨
    /// </summary>
    /// <param name="inputNumberList"></param>
    public void UpdateInputDisplay(ReactiveCollection<int> inputNumberList) {
        //Debug.Log(inputNumberList.Count);
        for (int i = 0; i < txtSelectNumbers.Length; i++) {
            txtSelectNumbers[i].text = i < inputNumberList.Count ? inputNumberList[i].ToString() : "";
        }
    }

    /// <summary>
    /// ÆþÎϤ·¤¿²óÅú¤Î²èÌÌɽ¼¨¹¹¿·
    /// </summary>
    /// <param name="ansCount"></param>
    /// <param name="inputNumbers"></param>
    /// <param name="hit"></param>
    /// <param name="blow"></param>
    public void UpdateExplanation(int ansCount, ReactiveCollection<int> inputNumbers, int hit, int blow) {
        
        // string.Join ¤ò»È¤¦¤³¤È¤Ç¡¢Âè2°ú¿ô¤ÎÇÛÎó¤« List ¤ÎÍ×ÁǤò£±¤Ä¤º¤Ä¼è¤ê½Ð¤·¡¢Âè1°ú¿ô¤Îʸ»ú¤ò´Ö¤Ë²Ã¤¨¤ë
        // ¥«¥ó¥Þ¤ò»ØÄꤹ¤ì¤Ð¥«¥ó¥Þ¶èÀÚ¤ê¤Îʸ»úÎó¤Ë¤Ê¤ê¡¢º£²ó¤Î¤è¤¦¤Ë¶õÇò¤òÆþ¤ì¤ì¤ÐÍ×ÁÇƱ»Î¤¬¤Ä¤Ê¤¬¤ë
        var inputNumbersStr = string.Join("", inputNumbers);
        
        // ʸ»úÎóÊä´°
        var result = $"²óÅú {ansCount}²óÌÜ¡§{inputNumbersStr}¡§ {hit} HIT {blow} BLOW ";
        
        // StringBuiler ¥¯¥é¥¹¤ò¥¤¥ó¥¹¥¿¥ó¥¹¤·¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Ë txtExplanation.text ¤òÅϤ·¤Æ½é´ü²½
        var stringBuilder = new StringBuilder(txtExplanation.text);
        
        // AppendLine ¥á¥½¥Ã¥É¤ò»È¤¤¡¢result ¤òstringBuilder ¤ÎºÇ¸å¤Î¹Ô¤Ë²Ã¤¨¤ë
        // ÌÀ¼¨Åª¤Ê²þ¹ÔÌ¿Î᤬¤Ê¤¯¤Æ¤â¡¢¼«Æ°Åª¤Ë²þ¹Ô¤·¤¿¾å¤ÇºÇ¸å¤Î¹Ô¤ËÄɲ䵤ì¤ë
        stringBuilder.AppendLine(result);
        
        // ʸ»úÎó¤ËÊÑ´¹¤·¤Æ²èÌÌɽ¼¨¤ò¹¹¿·
        // StringBuilder ¤ò»ÈÍѤ¹¤ëÍýͳ¤Ï¡¢Ê¸»úÎó¤ÎÏ¢·ëÁàºî¤¬·«¤êÊÖ¤µ¤ì¤ë¾ì¹ç¤Ë¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¸þ¾å¤¹¤ë¤¿¤á
        // ʸ»úÎó¤Ï¥¤¥ß¥å¡¼¥¿¥Ö¥ë¡ÊÉÔÊѡˤʤΤǡ¢+= ¤ò»È¤Ã¤Æʸ»úÎó¤òÏ¢·ë¤¹¤ë¤¿¤Ó¤Ë¿·¤·¤¤Ê¸»úÎó¤¬À¸À®¤µ¤ì¤ë
        // ¤³¤ì¤¬Â¿¤¯¤ÎÏ¢·ëÁàºî¤Ç¹Ô¤ï¤ì¤ë¤È¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬Äã²¼¤¹¤ë¤³¤È¤¬¤¢¤ë
        // StringBuilder ¤ò»È¤¦¤³¤È¤Ç¡¢¤³¤ÎÌäÂê¤ò²óÈò¤·¡¢¸úΨŪ¤Ëʸ»úÎó¤ÎÏ¢·ë¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë
        txtExplanation.text = stringBuilder.ToString();
    }

    /// <summary>
    /// ¸½ºß¤Þ¤Ç¤Î²óÅú¿ô¤ÈºÇÂç²óÅú¿ô¤Î²èÌÌɽ¼¨¹¹¿·
    /// </summary>
    /// <param name="ansCount"></param>
    /// <param name="maxCount"></param>
    public void UpdateAnswerCount(int ansCount, int maxCount) {
        txtCount.text = ansCount.ToString();
        txtCountMax.text = maxCount.ToString();
    }
}



Model


using System;
using System.Collections.Generic;
using System.Linq;
using UniRx;

[Serializable]
public class NumberGameModel
{
    public ReactiveCollection<int> InputNumberList = new(); 

    //public List<int> InputNumbers { get; private set; }
    public List<int> CorrectNumbers { get; private set; }
    
    public ReactiveProperty<int> AnsCount = new ();
    public int MaxCount { get; private set; }
    
    public ReactiveProperty<NumberGameState> CurrentNumberGameState { get; } = new ();

    // ÆþÎϤµ¤ì¤¿¿ô»ú¤Î¿ô¤ò´Æ»ë¤¹¤ë¥×¥í¥Ñ¥Æ¥£¤òÄɲÃ
    //public ReactiveProperty<int> InputNumbersCount { get; private set; } = new ReactiveProperty<int>(0);
    
    
    /// <summary>
    /// ¥³¥ó¥¹¥È¥é¥¯¥¿
    /// </summary>
    /// <param name="maxCount"></param>
    public NumberGameModel(int maxCount) {
        CurrentNumberGameState.Value = NumberGameState.Play;

        //InputNumbers = new ();
        CorrectNumbers = GenerateCorrectNumbers(); // ¤³¤³¤ÇÀµ²ò¤Î¿ô»ú¤òÀßÄꤹ¤ë
        AnsCount.Value = 0;
        MaxCount = maxCount;
    }
    
    /// <summary>
    /// ReactiveCollection ¤ËÄɲá£
    /// Presenter ¤Ç¹ØÆɤ·¡¢Call ¥Ü¥¿¥ó¤Î¥ª¥ó¥ª¥Õ¤ò´Æ»ë
    /// </summary>
    /// <param name="number"></param>
    public void AddInputNumber(int number) {
        // InputNumbers.Add(number);
        //
        // // ¿ô»ú¤¬Äɲ䵤줿¤é¡¢ÆþÎϤµ¤ì¤¿¿ô»ú¤Î¿ô¤ò¹¹¿·
        // InputNumbersCount.Value = InputNumbers.Count;
        
        InputNumberList.Add(number);
    }

    /// <summary>
    /// ReactiveCollection ¤«¤éºï½ü¡£
    /// Presenter ¤Ç¹ØÆɤ·¡¢Call ¥Ü¥¿¥ó¤Î¥ª¥ó¥ª¥Õ¤ò´Æ»ë
    /// </summary>
    public void RemoveLastInputNumber() {
        // // ºÇ¸å¤ËÅÐÏ¿¤µ¤ì¤¿ÈÖ¹æ¤òºï½ü
        // InputNumbers.RemoveAt(InputNumbers.Count - 1);
        //
        // // ¿ô»ú¤¬ºï½ü¤µ¤ì¤¿¤é¡¢ÆþÎϤµ¤ì¤¿¿ô»ú¤Î¿ô¤ò¹¹¿·
        // InputNumbersCount.Value = InputNumbers.Count;
        
        // ºÇ¸å¤ËÅÐÏ¿¤µ¤ì¤¿ÈÖ¹æ¤òºï½ü
        InputNumberList.RemoveAt(InputNumberList.Count - 1);
    }

    public void IncrementAnsCount() {
        AnsCount.Value++;

        UnityEngine.Debug.Log(AnsCount.Value);
    }

    /// <summary>
    /// ¿ô¤¢¤Æ¥²¡¼¥à¤ÎÀµ²ò¤òºî¤ë
    /// </summary>
    private List<int> GenerateCorrectNumbers() {
        
        // ½é´üÃͤξðÊó¤ò¸µ¤Ë¡¢¿·¤·¤¤ List ºîÀ®
        List<int> availableNumbers = new (){ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            
        // // Àµ²òÍѤοô»ú³ÊǼÍѤÎÇÛÎó¤Î½é´ü²½
        // int[] correctNumbers = new int[3];
        //
        // // ¥é¥ó¥À¥à¤ÊÃͤò£³¤Ä¼èÆÀ¡£Remove ¤¹¤ë¤³¤È¤Ç½ÅÊ£¤¹¤ë¿ô»ú¤òÁªÂò¤·¤Ê¤¤¤è¤¦¤Ë¤¹¤ë
        // for (int i = 0; i < correctNumbers.Length; i++) {
        //     
        //     //int randomIndex = UnityEngine.Random.Range(0, availableNumbers.Count);
        //     // System ¤Î Random ¥¯¥é¥¹¤Î¾ì¹ç¡¢int ·¿¤ÎÍð¿ô¤Ï Next ¥á¥½¥Ã¥É¤ÇºîÀ®
        //     int randomIndex = new Random().Next(0, availableNumbers.Count);
        //     correctNumbers[i] = availableNumbers[randomIndex];
        //     availableNumbers.RemoveAt(randomIndex);
        // }

        // Random ¤Ï¤³¤³¤Ç£±¤Ä¤À¤±¥¤¥ó¥¹¥¿¥ó¥¹¤¹¤ë¡£OrderBy ¤ÎÃæ¤Ç new ¤¹¤ë¤ÈËè²ó¥¤¥ó¥¹¥¿¥ó¥¹¤µ¤ì¤Æ¸úΨ¤¬°­¤¤¤¿¤á
        var random = new Random();
        
        // OrderBy ¤òÍøÍѤ·¤Æ¡¢¥é¥ó¥À¥à¤Ë¼èÆÀ¤µ¤ì¤¿Ãͤò¼èÆÀ¤·¤¿½çÈÖ¤Ëʤ١¢Take ¤ÇÀèƬ¤Î£³¤Ä¤ò¼è¤ê½Ð¤¹
        var correctNumbers = availableNumbers.OrderBy(x => random.Next()).Take(3).ToList();
        
        Console.WriteLine($"Àµ²ò : { string.Join(", ", correctNumbers)}");
        UnityEngine.Debug.Log($"Àµ²ò : { string.Join(", ", correctNumbers)}");

        return correctNumbers;
    }

    public void ResetGame() {
        //InputNumbers.Clear();
        
        InputNumberList.Clear();
    }




    /// <summary>
    /// Model ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò£±¤Ä¤À¤±ºî¤ê¡¢¤½¤ì¤ò»È¤¤Â³¤±¤ë¾ì¹ç¤Ë¤Ï¤³¤Î½èÍý¤Ç½é´ü²½¤¹¤ë
    /// ¹ØÆɽèÍý¤ÏÆ°¤¤¤Æ¤¤¤ë¤Î¤ÇÉÔÍ×
    /// </summary>
    public void InitialModel() {
        CurrentNumberGameState.Value = NumberGameState.Play;
        CorrectNumbers = GenerateCorrectNumbers(); // ¤³¤³¤ÇÀµ²ò¤Î¿ô»ú¤òÀßÄꤹ¤ë
        AnsCount.Value = 0;
    }
}


Presenter



using System.Collections;
using UnityEngine;
using UniRx;
using System.Linq;

public class NumberGamePresenter : MonoBehaviour
{
    [SerializeField] private NumberGameView view;

    private NumberGameModel model;
    public NumberGameModel NumberGameModel => model;
    private GameLogic gameLogic;

    private float waitTime = 3.0f; // ·ë²Ì¤ò½Ð¤¹»þ´Ö¤òÄ´À°¤¹¤ë
    [SerializeField] private int maxChallengeCount = 10;

    [SerializeField, Header("¿ô¤¢¤Æ¥²¡¼¥à À®²ÌȯɽÍÑPrefab")]
    private NumberGameResultPopUp numberGameResultPopUpPrefab;

    [SerializeField, Header("¿ô¤¢¤Æ¥²¡¼¥à ²óÅú·ë²ÌÍÑPrefab")]
    private NumberGameDetailPopUp numberGameDetailPopUpPrefab;

    private NumberGameDetailPopUp numberGameDetailPopUp;

    private Transform canvasTran;
    private CompositeDisposable disposableModels = new();

    
    // /// <summary>
    // /// ½é´ü²½
    // /// </summary>
    // /// <param name="disposables"></param>
    // /// <param name="canvasTran"></param>
    // public void InitializeGame(CompositeDisposable disposables, Transform canvasTran) {
    //
    //     this.canvasTran = canvasTran;
    
    //     view.GenerateNumberButtons();
    //
    //     // ³Æ¿ô»ú¥Ü¥¿¥ó¤Î¥¯¥ê¥Ã¥¯¥¤¥Ù¥ó¥È¤ò¹ØÆÉ¡£·ë¹ç¤·¤Æ¤¢¤ë¤Î¤Ç¡¢¸ÄÊ̤˹ØÆɤ·¤Ê¤¯¤Æ¤è¤¤
    //     view.OnNumberButtonClickAsObservable
    //         // ÁªÂò¤µ¤ì¤Æ¤¤¤ë¿ô¤¬3°Ê²¼ ¤«¤Ä ¤¹¤Ç¤ËÁªÂò¤µ¤ì¤Æ¤¤¤ë¿ô»ú¤Ç¤Ï¤Ê¤¤
    //         .Where(number => model.InputNumberList.Count < 3 && !model.InputNumberList.Contains(number))
    //         .Subscribe(number =>
    //         {
    //             // ÆþÎÏÃͤȤ·¤ÆÊÝ»ý¤·¡¢²èÌ̹¹¿·
    //             model.AddInputNumber(number);
    //
    //             view.UpdateInputDisplay(model.InputNumberList);
    //
    //             // ²¡¤µ¤ì¤¿¿ô»ú¤Î¥Ü¥¿¥ó¤Î¤ß¤ò̵¸ú¤Ë¤¹¤ë
    //             view.DisableNumberButton(number);
    //
    //             //Debug.Log(number);
    //         })
    //         .AddTo(disposables);
    //
    //     // ºï½ü¥Ü¥¿¥ó¤Î¥¯¥ê¥Ã¥¯¥¤¥Ù¥ó¥È¤ò¹ØÆÉ
    //     view.OnDeleteButtonClickAsObservable
    //         .Where(_ => model.InputNumberList.Count > 0)
    //         .Subscribe(_ =>
    //         {
    //             // List ¤ÎºÇ¸å¤ÎÍ×ÁǤò¼è¤ê½Ð¤¹(Linq)
    //             int deletedNumber = model.InputNumberList.Last();
    //             model.RemoveLastInputNumber();
    //
    //             // ºï½ü¤·¤¿¥Ü¥¿¥ó¤òÍ­¸ú¤Ë¤¹¤ë
    //             view.EnableNumberButton(deletedNumber);
    //
    //             view.UpdateInputDisplay(model.InputNumberList);
    //             //Debug.Log(deletedNumber);
    //         })
    //         .AddTo(disposables);
    //
    //     // Call ¥Ü¥¿¥ó¤Î¥¯¥ê¥Ã¥¯¥¤¥Ù¥ó¥È¤ò¹ØÆÉ
    //     // ¾å¤Î½èÍý¤Ç Call ¥Ü¥¿¥ó¤Î¥ª¥ó¡¦¥ª¥ÕÀÚ¤êÂؤ¨¤ò¤·¤Æ¤¤¤ë¤¿¤á¡¢¤³¤³¤Ç¤Ï Subscribe ¤Î¤ß¤Ç¤è¤¤
    //     view.OnCallButtonClickAsObservable
    //         .Subscribe(_ => ProcessInputNumbers())
    //         .AddTo(disposables);
    // }
    //
    // /// <summary>
    // /// ¥²¡¼¥à¤Î½é´ü²½
    // /// InitializeGame ¤È Dispose ¤Î¥Á¥§¥Ã¥¯¤Î¤¿¤á¤Ëʬ¤±¤Æ¤¤¤ë¤¬¡¢£±¤Ä¤Ë¤·¤Æ¤âÌäÂê¤Ê¤¤
    // /// </summary>
    // public void ExecuteGame() {
    //     // Model ¤È GameLogic ¤Î¥¤¥ó¥¹¥¿¥ó¥¹ºîÀ®¡£¤³¤³¤ÇºÇÂç»î¹Ô²ó¿ô¤òÀßÄê
    //     model = new NumberGameModel(maxChallengeCount);
    //     gameLogic = new GameLogic(model.CorrectNumbers);
    //
    //     // ¥Á¥ã¥ì¥ó¥¸²ó¿ô¤Î¹ØÆÉ
    //     model.AnsCount.Subscribe(count =>
    //     {
    //         // ²èÌ̤βóÅú²ó¿ôɽ¼¨¤ò¹¹¿·
    //         view.UpdateAnswerCount(count, model.MaxCount);
    //     }).AddTo(disposableModels);
    //
    //     // Call ¥Ü¥¿¥ó¤ÎÍ­¸ú¾õÂÖ(on/off)¤òÆþÎϤµ¤ì¤¿¿ô»ú¤Î¿ô¤Ë±þ¤¸¤ÆÊѹ¹
    //     // ReactiveCommand¤Î¼Â¹Ô²ÄÈݾõÂÖ¤òButton.interactable¥×¥í¥Ñ¥Æ¥£¤Ë¥Ð¥¤¥ó¥É¤·¤Æ
    //     // ReactiveCommand¤Î¾õÂ֤˱þ¤¸¤Æ¥Ü¥¿¥ó¤¬Í­¸ú²½¡¦Ìµ¸ú²½¤µ¤ì¤ë
    //     // ReactiveCommand¤Î¾õÂÖ¤Ï Select ¤Î¾ò·ï¤Îɾ²Á¤Ë¤è¤ê¡¢true ¤« false ¤Ë¤Ê¤ë
    //     // model.InputNumbersCount
    //     //     .Select(count => count == 3)  // ɾ²Á¸å¡¢true ¤Ë¤Ê¤Ã¤¿¤é¥¹¥È¥ê¡¼¥à¤ò int ¤«¤é bool ¤ËÊÑ´¹
    //     //     .ToReactiveCommand()  // bool·¿¤Î¥¹¥È¥ê¡¼¥à¤òReactiveCommand¤ËÊÑ´¹
    //     //     .BindTo(view.CallButton) // ¤½¤Î¸åBindTo¤ò»È¤Ã¤ÆView¥¯¥é¥¹¤ÎCallButton¥×¥í¥Ñ¥Æ¥£¤Ëɳ¤Å¤±
    //     //     .AddTo(this);
    //
    //     // ¾åµ­¤ÈƱ¤¸½èÍý¤À¤¬¡¢List ¤ò¹ØÆɤµ¤»¤ë¤³¤È¤Ç ReactiveProperty(InputNumbersCount ÊÑ¿ô) ¤ò£±¤Äºï½ü¤Ç¤­¤ë
    //     // Call ¥Ü¥¿¥ó¤ÎÍ­¸ú¾õÂÖ(on/off)¤òÆþÎϤµ¤ì¤¿¿ô»ú¤Î¿ô¤Ë±þ¤¸¤ÆÊѹ¹
    //     // ReactiveCommand¤Î¼Â¹Ô²ÄÈݾõÂÖ¤òButton.interactable¥×¥í¥Ñ¥Æ¥£¤Ë¥Ð¥¤¥ó¥É¤·¤Æ
    //     // ReactiveCommand¤Î¾õÂ֤˱þ¤¸¤Æ¥Ü¥¿¥ó¤¬Í­¸ú²½¡¦Ìµ¸ú²½¤µ¤ì¤ë
    //     // ReactiveCommand¤Î¾õÂÖ¤Ï Select ¤Î¾ò·ï¤Îɾ²Á¤Ë¤è¤ê¡¢true ¤« false ¤Ë¤Ê¤ë
    //     model.InputNumberList.ObserveCountChanged()
    //         .Select(count => count == 3) // ɾ²Á¸å¡¢true ¤Ë¤Ê¤Ã¤¿¤é¥¹¥È¥ê¡¼¥à¤ò int ¤«¤é bool ¤ËÊÑ´¹
    //         .ToReactiveCommand() // bool·¿¤Î¥¹¥È¥ê¡¼¥à¤òReactiveCommand¤ËÊÑ´¹
    //         .BindTo(view.CallButton) // ¤½¤Î¸åBindTo¤ò»È¤Ã¤ÆView¥¯¥é¥¹¤ÎCallButton¥×¥í¥Ñ¥Æ¥£¤Ëɳ¤Å¤±
    //         .AddTo(disposableModels);
    //
    //     // ReactiveCollection ¥¯¥ê¥¢»þ¤Î½èÍý¤¬É¬Íפʾì¹ç¤Ë¤ÏÄɲÃ
    //     model.InputNumberList.ObserveReset()
    //         .Subscribe(_ =>
    //         {
    //             view.UpdateInputDisplay(model.InputNumberList);
    //             view.SwitchAllButtons(true);
    //             //Debug.Log("Clear");
    //         })
    //         .AddTo(disposableModels);
    //
    //     // GameState ¤Î¹ØÆÉ
    //     model.CurrentNumberGameState
    //         .Where(state => state == NumberGameState.Win || state == NumberGameState.Lose)
    //         .Subscribe(state =>
    //         {
    //             // ¥²¡¼¥à¤Î¾¡ÇÔ¤òÈ¿±Ç¤·¤Æ¥ê¥¶¥ë¥Èɽ¼¨
    //             bool isSuccess = state == NumberGameState.Win;
    //             StartCoroutine(GenerateResult(isSuccess));
    //         })
    //         .AddTo(disposableModels);
    //
    //     //model.InitialModel();
    //     view.InitialView();
    //     //gameLogic.InitialGameLogic(model.CorrectNumbers);
    // }
    //
    // /// <summary>
    // /// ÆþÎÏÈÖ¹æ¤Îɾ²Á½èÍý
    // /// </summary>
    // private void ProcessInputNumbers() {
    //
    //     (int hit, int blow) result;
    //     model.IncrementAnsCount();
    //     result = gameLogic.CheckHitAndBlow(model.InputNumberList);
    //
    //     // 3HIT¸¡½Ð¤·¤¿¾ì¹ç
    //     if (result.hit == 3) {
    //         // ¥²¡¼¥à¥¯¥ê¥¢¡£²ò½üÀ®¸ù¥á¥Ã¥»¡¼¥¸¤òɽ¼¨
    //         model.CurrentNumberGameState.Value = NumberGameState.Win;
    //
    //         return;
    //     }
    //
    //     // ¥Á¥ã¥ì¥ó¥¸²ó¿ô¤Ë㤷¤¿¾ì¹ç
    //     else if (model.AnsCount.Value >= model.MaxCount) {
    //         // ¥²¡¼¥à¼ºÇÔ¡£²ò½ü¼ºÇÔ¥á¥Ã¥»¡¼¥¸¤òɽ¼¨
    //         model.CurrentNumberGameState.Value = NumberGameState.Lose;
    //
    //         return;
    //     }
    //
    //     // ÉÔÀµ²ò¤Î¾ì¹ç
    //     StartCoroutine(ShowInputDetailCoroutine(result.hit, result.blow));
    // }
    //
    // // ÉÔÀµ²ò¤Î¾ì¹ç¤Î½èÍý
    // private IEnumerator ShowInputDetailCoroutine(int hit, int blow) {
    //
    //     // NumberGameDetailPopUp ¤¬À¸À®¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç
    //     if (!numberGameDetailPopUp) {
    //         // ¥Ý¥Ã¥×¥¢¥Ã¥×À¸À®
    //         numberGameDetailPopUp = Instantiate(numberGameDetailPopUpPrefab, canvasTran, false);
    //     }
    //
    //     // ·ë²Ìɽ¼¨
    //     numberGameDetailPopUp.ShowResult(model.InputNumberList[0], model.InputNumberList[1], model.InputNumberList[2],
    //         hit, blow);
    //
    //     view.UpdateExplanation(model.AnsCount.Value, model.InputNumberList, hit, blow);
    //
    //     // ÂÔµ¡¤¹¤ë
    //     yield return new WaitForSeconds(waitTime);
    //
    //     // NumberGameDetailPopUp¤òÊĤ¸¤ë
    //     numberGameDetailPopUp.HidePopUp();
    //
    //     // ÆþÎϤµ¤ì¤¿¿ôÃͤò¥¯¥ê¥¢¤·¡¢É½¼¨¤ò¹¹¿·¤¹¤ë
    //     model.ResetGame();
    // }
    //
    // /// <summary>
    // /// ¥ê¥¶¥ë¥È¤ÎÀ¸À®
    // /// </summary>
    // /// <param name="isSuccess"></param>
    // /// <returns></returns>
    // private IEnumerator GenerateResult(bool isSuccess) {
    //
    //     // ¥ê¥¶¥ë¥È¥Ý¥Ã¥×¥¢¥Ã¥×¤òÀ¸À®
    //     NumberGameResultPopUp numberGameResultPopUp = Instantiate(numberGameResultPopUpPrefab, canvasTran, false);
    //
    //     // ¥ê¥¶¥ë¥Èɽ¼¨¡£¥²¡¼¥à·ë²Ì¤ò¼õ¤±¤ÆÆâÍƤòºîÀ®
    //     yield return StartCoroutine(numberGameResultPopUp.ShowPopUp(isSuccess));
    //
    //     // ¥²¡¼¥à½ªÎ»
    //     model.CurrentNumberGameState.Value = NumberGameState.GameUp;
    //
    //     // ÆþÎϤµ¤ì¤¿¿ôÃͤò¥¯¥ê¥¢¤·¡¢É½¼¨¤ò¹¹¿·¤¹¤ë
    //     model.ResetGame();
    //
    //     disposableModels.Dispose();
    //
    //     // ÅÐÏ¿¤·¤¿¹ØÆɽèÍý¤Ï¡¢Dispose ¤·¤Æ¤·¤Þ¤¦¤È¤º¤Ã¤È¹ØÆÉÄä»ß¤µ¤ì³¤±¤ë¤Î¤Ç¡¢¿·¤·¤¯¥¤¥ó¥¹¥¿¥ó¥¹¤òºî¤êľ¤¹
    //     // ¤è¤Ã¤Æ CompositeDisposable ¤Ï»È¤¤¤Þ¤ï¤»¤Ê¤¤¡£
    //     disposableModels = new();
    // }
}

¥³¥á¥ó¥È¤ò¤«¤¯


¡Öhttp://¡×¤ò´Þ¤àÅê¹Æ¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ÍøÍѵ¬Ìó¤ò¤´³Îǧ¤Î¤¦¤¨¤´µ­Æþ²¼¤µ¤¤

Menu



´ðÁÃ

µ»½Ñ/Ãμ±(¼ÂÁõÎã)

3D¥¢¥¯¥·¥ç¥ó¥²¡¼¥à

2D¤ª¤Ï¤¸¤­¥²¡¼¥à(ȯŸÊÔ)

2D¶¯À©²£¥¹¥¯¥í¡¼¥ë¥¢¥¯¥·¥ç¥ó(ȯŸÊÔ)

2D¥¿¥Ã¥×¥·¥å¡¼¥Æ¥£¥ó¥°(³ÈÄ¥ÊÔ)

¥ì¡¼¥¹¥²¡¼¥à(È´¿è)

2DÊüÃÖ¥²¡¼¥à(ȯŸÊÔ)

3D¥ì¡¼¥ë¥¬¥ó¥·¥å¡¼¥Æ¥£¥ó¥°(±þÍÑÊÔ)

3Dæ½Ð¥²¡¼¥à(È´¿è)

2D¥ê¥¢¥ë¥¿¥¤¥à¥¹¥È¥é¥Æ¥¸¡¼

3D¥¿¥Ã¥×¥¢¥¯¥·¥ç¥ó(NavMeshAgent »ÈÍÑ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥«¥¨¥ë¤Î°Ù¤Ë¡Á¡¢¥Ü¥³¥¹¥«¥¦¥©¡¼¥ºÉ÷)

VideoPlayer ¥¤¥Ù¥ó¥ÈϢư¤Î¼ÂÁõÎã

VideoPlayer ¥ê¥¹¥ÈÆ⤫¤é¥à¡¼¥Ó¡¼ºÆÀ¸¤Î¼ÂÁõÎã(ȯŸ)

AR ²èÁüÉÕ¤­¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®¤Î¼ÂÁõÎã

AR ¥ê¥¹¥ÈÆ⤫¤éÀ¸À®¤Î¼ÂÁõÎã(ȯŸ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥µ¥Ð¥¤¥Ð¡¼É÷)

private



¤³¤Î¥µ¥¤¥ÈÆâ¤ÎºîÉʤϥæ¥Ë¥Æ¥£¤Á¤ã¤ó¥é¥¤¥»¥ó¥¹¾ò¹à¤Î¸µ¤ËÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£

´ÉÍý¿Í/Éû´ÉÍý¿Í¤Î¤ßÊÔ½¸¤Ç¤­¤Þ¤¹