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

¡ß
¡¡Unity ¤Ç¥ê¥¢¥¯¥Æ¥£¥Ö¥×¥í¥°¥é¥ß¥ó¥°¤ò¹Ô¤¦ºÝ¡¢½¾Íè¤Ï UniRx ¤¬¼çή¤Ç¤·¤¿¤¬¡¢¸½ºß¤Ï¸å·Ñ¥é¥¤¥Ö¥é¥ê¤Ç¤¢¤ë R3 ¤òÍøÍѤ¹¤ë¥±¡¼¥¹¤¬Áý¤¨¤Æ¤­¤Æ¤¤¤Þ¤¹¡£

¡¡¤³¤Îµ­»ö¤Ç¤Ï¡¢R3 ¤Î´ðËÜŪ¤ÊƳÆþ¤«¤é¡¢ReactiveProperty(¥ê¥¢¥¯¥Æ¥£¥Ö¥×¥í¥Ñ¥Æ¥£) ¤Î»È¤¤Êý¡¢¥·¥ê¥¢¥é¥¤¥ºÂбþ¡¢¤½¤·¤Æ¥²¡¼¥à¤Ç¤Î¼ÂÁ©Åª¤Ê³èÍÑÎã¤Þ¤Ç²òÀ⤷¤Þ¤¹¡£
ÆÃ¤Ë R3 ¤Ç¤Ï°·¤¨¤ëÆâÍÆ¤¬Ë­É٤Ǥ¹¤¬¡¢ºÇ½é¤Ï ReactiveProperty ¤«¤éÆþ¤Ã¤Æ¡¢¤½¤Î¸å¡¢Íý²ò¤ò¿¼¤á¤Ê¤¬¤é¾¤Îµ¡Ç½¤ò¼ÂÁõ¤·¤Æ¤¤¤¯¤È¤ï¤«¤ê¤ä¤¹¤¤¤Ç¤¹¡£



R3 ¤ÎƳÆþ


¡¡R3 ¤Ï NuGet ¥Ù¡¼¥¹¤Î¥é¥¤¥Ö¥é¥ê¤Ç¤¹¡£Unity ¤Ç¤Ï°Ê²¼¤ÎÊýË¡¤ÇƳÆþ¤Ç¤­¤Þ¤¹¡£

¡¡¤³¤ÎÊÕ¤ê¤Î¼ê½ç¤Ë¤Ä¤¤¤Æ¤Ï¡¢²¼µ­¤Îµ­»ö¤ò»²¹Í¤Ë¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£


»²¹Í¥µ¥¤¥È
Qiita @toRisouP ÍÍ
¡ÚUnity¥æ¡¼¥¶¡¼¸þ¤±¡Û R3ÆþÌç Æ³ÆþÊÔ
https://qiita.com/toRisouP/items/25ab6dbf5efbbc13e...
¥µ¥µ¥ß¥Æ¥Ã¥¯ ÍÍ
¡ÚUnity¡Û¸Ä¿ÍŪ¤Ë¤è¤¯»È¤¦¥Ñ¥Ã¥±¡¼¥¸¤ÎƳÆþÊýË¡¤Þ¤È¤á¡ÚR3/UniTask/VContainer/DOTween¡Û
https://www.sasami-tech.com/unity-package-installa...


ÊýË¡­¡¡§NuGet for Unity


¡¡ProjectSettings ¤Î PackageManager ¤«¤é NuGet for Unity ¤òƳÆþ¤·¡¢¡ÖR3¡×¤Ç¸¡º÷¤·¤Æ¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£


ÊýË¡­¢¡§GitHub ¤«¤éƳÆþ


¡¡R3 ¤Î¸ø¼°¥ê¥Ý¥¸¥È¥ê¤ò Package Manager ·Ðͳ¤ÇÄɲä·¤Þ¤¹¡£

¡¡https://github.com/Cysharp/R3.git


ReactiveProperty(¥ê¥¢¥¯¥Æ¥£¥Ö¥×¥í¥Ñ¥Æ¥£) ¤È¤Ï¡©


¡¡ReactiveProperty(¥ê¥¢¥¯¥Æ¥£¥Ö¥×¥í¥Ñ¥Æ¥£) ¤Ï¡¢¡ÖÃͤÎÊѹ¹¤ò´Æ»ë¤Ç¤­¤ëÊÑ¿ô¡×¤Ç¤¹¡£

¡¡Ä̾ï¤ÎÊÑ¿ô¤È°ã¤¤¡¢¡ÖÃͤ¬ÊѤï¤Ã¤¿½Ö´Ö¡×¤Ë¥¤¥Ù¥ó¥È¤Î¤è¤¦¤ËÄÌÃΤò¼õ¤±¼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

´ðËÜŪ¤Ê»È¤¤Êý


using R3;

ReactiveProperty<int> hp = new ReactiveProperty<int>(100);

// ÃÍÊѹ¹¤Î´Æ»ë
hp.Subscribe(value =>
{
    Debug.Log($"HP¤¬Êѹ¹¤µ¤ì¤Þ¤·¤¿: {value}");
});

// ÃÍÊѹ¹
hp.Value = 80;
¡¡
¡¡¤³¤Î½èÍý¤Î¥Ý¥¤¥ó¥È¤Ï¡¢
¡¦Value ¤òÊѹ¹¤¹¤ë¤È¼«Æ°¤ÇÄÌÃΤµ¤ì¤ë
¡¦Subscribe ¤Î½èÍý¤òµ­½Ò¤¹¤ë¤³¤È¤Ç¡¢¾åµ­¤ÎÄÌÃΤÇÊѹ¹¤ò´Æ»ë¤Ç¤­¤ë
¡¦ÆÃ¤Ë UI ¹¹¿·¤ä¾õÂÖ´ÉÍý¤ÈÁêÀ­¤¬Îɤ¤

¡¡¤³¤ÎÎã¤Ç¤¢¤ì¤Ð¡¢Hp ÊÑ¿ô¤ÎÃͤ¬ÊѲ½¤¹¤ë¤¿¤Ó¤Ë¡¢Debug.Log ¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¤Î¤Ç¡¢
¤³¤ÎÉôʬ¤ò²èÌ̹¹¿·½èÍý¤ËÊѹ¹¤¹¤ì¤Ð¡¢Hp ¤ÎÃͤ¬ÊѤï¤ë¤È¼«Æ°Åª¤Ë UI ¤¬¹¹¿·¤µ¤ì¤ë»ÅÁȤߤòºîÀ®¤Ç¤­¤Þ¤¹¡£

¡¡¤½¤Î¤¿¤á¡¢Ä̾ï¤Ç¤¢¤ì¤Ð¡¢¡Ö­¡ÊÑ¿ôÊѹ¹ ¢ª ­¢UI¹¹¿·¡×¤È¡¢£²¤Ä¤Î½èÍý¤ò½ñ¤¯É¬Íפ¬¤¢¤ë½ê¤ò
¡Ö­¡ÊÑ¿ôÊѹ¹ ¢ª ¼«Æ°Åª¤Ë UI¹¹¿·¡×¤È¤Ê¤ê¡¢½èÍý¤¬£±¤Ä¤Ç¤è¤¤·Á¤Ë¤Ê¤ê¤Þ¤¹¡£


ReactiveProperty ¤Î¼ç¤Êµ¡Ç½

­¡ ÃÍÊѹ¹¤ÎÄÌÃÎ


ReactiveProperty<int> hp = new ReactiveProperty<int>(100);

hp.Subscribe(x => Debug.Log(x));

Ãͤ¬ÊѤï¤ë¤¿¤Ó¤Ë¸Æ¤Ð¤ì¤Þ¤¹¡£


­¢ ½é´üÃͤ⨻þÄÌÃÎ


¡¡Subscribe ¤·¤¿½Ö´Ö¤Ë¸½ºß¤ÎÃͤ¬Î®¤ì¤ë¤Î¤âÆÃħ¤Ç¤¹¡£


­£ Where / Select ¤Ê¤É¤Î¥ª¥Ú¥ì¡¼¥¿¤Ë¤è¤ëLINQŪÁàºî


¡¡R3 ¤Ë¤Ï UniRx ƱÍÍ¡¢¥ª¥Ú¥ì¡¼¥¿¤¬ÍѰդµ¤ì¤Æ¤ª¤ê¡¢¥á¥½¥Ã¥É¥Á¥§¡¼¥ó¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢LINQ ¤Î¤è¤¦¤Ê½ñ¤­¿´ÃϤǽèÍý¤ò¼ÂÁõ¤Ç¤­¤Þ¤¹¡£

hp
    .Where(x => x <= 0)  // hp ¤ÎÃͤ¬ 0 °Ê²¼¤Ë¤Ê¤Ã¤¿¤é
    .Subscribe(_ => Debug.Log("»àË´"));¡¡// ¥í¥°¤ò½Ð¤¹

¡¡¤³¤ÎÎã¤Ç¤¢¤ì¤Ð¡¢Where ¥ª¥Ú¥ì¡¼¥¿¤Ë¤è¤ê¡¢¾ò·ïÉÕ¤­¤Ç¥¤¥Ù¥ó¥È¤ò¼õ¤±¼è¤ì¤Þ¤¹¡£


­¤ ¾¤ÎReactiveProperty¤ÈÏ¢·È


¡¡CombineLatest ¥ª¥Ú¥ì¡¼¥¿¤ÏÊ£¿ô¤ÎIObservable¤ò¤Þ¤È¤á¤é¤ì¤ëµ¡Ç½¤ò»ý¤Á¤Þ¤¹¡£
¤³¤Á¤é¤òÍøÍѤ¹¤ë¤³¤È¤Ç¡¢Ê£¿ô¤Î ReactiveProperty ¤ò¤Þ¤È¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

ReactiveProperty<int> attack = new(10);
ReactiveProperty<int> buff = new(5);

var totalAttack = attack.CombineLatest(buff, (a, b) => a + b);

totalAttack.Subscribe(x => Debug.Log($"¹ç·×¹¶·âÎÏ: {x}"));


»²¹Í¥µ¥¤¥È
Qiita @toRisouP ÍÍ
R3 ¥ª¥Ú¥ì¡¼¥¿¡¼/¥Õ¥¡¥¯¥È¥ê¡¼¥á¥½¥Ã¥É ¤Þ¤È¤á
https://qiita.com/toRisouP/items/3d045aa248824571b...


ReactiveProperty ¤Î¥·¥ê¥¢¥é¥¤¥ºÊýË¡¡ÊR3ÈÇ¡Ë


¡¡R3 ¤Ç¤Ï¡¢ReactiveProperty ¤ò¤½¤Î¤Þ¤Þ»È¤¦¤È Inspector ¤Ëɽ¼¨¤µ¤ì¤Þ¤»¤ó¤¬¡¢
SerializableReactiveProperty ¤ò»È¤¦¤³¤È¤Ç´Êñ¤Ë¥·¥ê¥¢¥é¥¤¥ºÂбþ¤¬²Äǽ¤Ç¤¹¡£

SerializableReactiveProperty ¤Î´ðËÜ


using R3;
using UnityEngine;

public class Player : MonoBehaviour
{
    [SerializeField]
    public SerializableReactiveProperty<int> Hp = new(100);
}

¡¡¤³¤ì¤À¤±¤Ç¡ÖInspector ¤ÇÃͤòÊÔ½¸²Äǽ¡ÜÃÍÊѹ¹»þ¤Ë¼«Æ°ÄÌÃΡפ¬Î¾Î©¤Ç¤­¤Þ¤¹¡£


ÃͤμèÆÀ¤ÈÊѹ¹


// ¼èÆÀ
int hp = player.Hp.Value;

// Êѹ¹
player.Hp.Value = 50;

¡¡Ä̾ï¤Î ReactiveProperty ¤ÈƱ¤¸´¶³Ð¤Ç°·¤¨¤Þ¤¹¡£


Subscribe ¤â¤½¤Î¤Þ¤Þ»È¤¨¤ë


player.Hp.Subscribe(x =>
{
    Debug.Log($"HP: {x}");
});

¡¡¤³¤Á¤é¤âƱ¤¸¤Ç¤¹¡£


null ¥Á¥§¥Ã¥¯ÉÔÍ×


¡¡SerializableReactiveProperty ¤Ï¥¤¥ó¥¹¥¿¥ó¥¹¤È¤·¤ÆÊÝ»ý¤µ¤ì¤ë¤¿¤á¡¢

Hp.Subscribe(...)

¡¡¤½¤Î¤Þ¤Þ°ÂÁ´¤Ë¸Æ¤Ù¤Þ¤¹¡£


½é´üÃͤΰ·¤¤


public SerializableReactiveProperty<int> Hp = new(100);

¡¡¤³¤ÎÃͤ¬ Inspector ¤Ë¤âÈ¿±Ç¤µ¤ì¤Þ¤¹¡£


ScriptableObject ¤È¤âÁêÀ­¤¬Îɤ¤


[CreateAssetMenu]
public class PlayerData : ScriptableObject
{
    public SerializableReactiveProperty<int> hp;
}

¡¡👉 ¥Ç¡¼¥¿¶îưÀ߷פȤâÁêÀ­¤¬¤è¤¤¤Ç¤¹¡£


¥²¡¼¥à¤Ç¤Î¼ÂÁõÎã

HP´ÉÍý ¡Ü UIϢư


public class Player : MonoBehaviour
{
    public ReactiveProperty<int> Hp = new(100);
}

public class HpView : MonoBehaviour
{
    [SerializeField] private Player player;
    [SerializeField] private Text hpText;

    void Start()
    {
        player.Hp.Subscribe(x =>
        {
            hpText.text = $"HP: {x}";
        });
    }
}

¡¡HpView ¥¯¥é¥¹¤Ç Player ¥¯¥é¥¹¤Î ReactiveProperty ¤ò¹ØÆÉ¤·¡¢Hp ¤ÎÊѲ½¤Ë¹ç¤ï¤»¤Æ¼«Æ°Åª¤Ë UI ɽ¼¨¤ò¹¹¿·¤µ¤»¤ëÊýË¡¤Ç¤¹¡£
ºÇ¤â°ìÈÌŪ¤Ç¤¢¤ê¡¢¤«¤ÄÍøÍѲÁÃͤι⤤½èÍý¤Î£±¤Ä¤Ë¤Ê¤ê¤Þ¤¹¡£


¥À¥á¡¼¥¸½èÍý ¡Ü À¸Â¸È½Äê


public void Damage(int value)
{
    Hp.Value -= value;
}

Player ¥¯¥é¥¹

Hp
    .Where(x => x <= 0)
    .Subscribe(_ =>
    {
        Debug.Log("¥×¥ì¥¤¥ä¡¼¤¬¤ä¤é¤ì¤¿");
    });


¼ÂÁ©Åª¤ÊÀ߷ץݥ¤¥ó¥È


¡¡Àè¤Û¤É¤Î¼ÂÁõ¤Ë¤ª¤±¤ë¡¢À߷ץݥ¤¥ó¥È¤ò¾å¤²¤Þ¤¹¡£

­¡ ¡Ö¾õÂ֡פȡÖɽ¼¨¡×¤òʬΥ¤¹¤ë


¡¡¡¦Player¡§¾õÂÖ´ÉÍý
¡¡¡¦View¡§É½¼¨¹¹¿·

¡¡👉 MVC / MVVM ¤Ë¶á¤¤¹½Â¤¤Ë¤Ê¤ë


­¢ ¥¤¥Ù¥ó¥È¤è¤ê¤â°ÂÁ´


// ½¾Íè
OnHpChanged?.Invoke();

// Reactive
Hp.Value = 50;

¡¡👉 ¸Æ¤Ó˺¤ì¤¬¤Ê¤¯¤Ê¤ë


­£ °Í¸´Ø·¸¤¬¸«¤¨¤ä¤¹¤¤


¡¡¥Ç¥ê¥²¡¼¥È¤Ê¤É¤ËÈæ¤Ù¤Æ¡¢¤É¤³¤Ç²¿¤¬´Æ»ë¤µ¤ì¤Æ¤¤¤ë¤«¤¬ÌÀ³Î¤Ë¤Ê¤ê¤Þ¤¹¡£


¤Þ¤È¤á


¡¡ReactiveProperty ¤ò»È¤¦¤³¤È¤Ç¡¢°Ê²¼¤Î¥á¥ê¥Ã¥È¤¬ÆÀ¤é¤ì¤Þ¤¹¡£

¾õÂÖÊѹ¹¤Î¼«Æ°ÄÌÃÎ
UI¤È¤ÎϢư¤Î´Êά²½
¥Ð¥°¤Î¸º¾¯

¡¡ÆÃ¤Ë¥²¡¼¥à³«È¯¤Ç¤Ï¡¢

HP / MP
¥¹¥Æ¡¼¥¿¥¹
UI¹¹¿·
¥Õ¥é¥°´ÉÍý

¡¡¤Ê¤É¡¢¤Û¤Ü¤¹¤Ù¤Æ¤Î¾õÂÖ´ÉÍý¤Ë±þÍѲÄǽ¤Ç¤¹¡£

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


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

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

Menu



´ðÁÃ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

private



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

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

¹­¹ðÊç½¸Ãæ