{"id":1853,"date":"2023-02-15T15:53:51","date_gmt":"2023-02-15T06:53:51","guid":{"rendered":"http:\/\/yoonhada.com\/?p=1853"},"modified":"2023-12-26T21:18:47","modified_gmt":"2023-12-26T12:18:47","slug":"rx%eb%a1%9c-%eb%a7%8c%eb%93%a0-%ec%b9%b4%ec%9a%b4%ed%8a%b8-%eb%8b%a4%ec%9a%b4-%ed%83%80%ec%9d%b4%eb%a8%b8","status":"publish","type":"post","link":"http:\/\/yoonhada.com\/?p=1853","title":{"rendered":"Rx\ub85c \ub9cc\ub4e0 \uce74\uc6b4\ud2b8 \ub2e4\uc6b4 \ud0c0\uc774\uba38"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"\ud658\uacbd\">\ud658\uacbd<a href=\"https:\/\/tech.lonpeach.com\/2019\/11\/02\/UniRx-Getting-Started-1\/#%ED%99%98%EA%B2%BD\"><\/a><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/yoonhada.com\/?p=1425\">UniRx \uc785\ubb38 \uc2dc\ub9ac\uc988 \ubaa9\ucc28\ub294 \uc774\ucabd<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc9c0\uc815\ud55c \ucd08\ub9cc\ud07c \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\ud558\ub294 \uc2a4\ud2b8\ub9bc<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/\/ &lt;summary>\n\/\/\/ countTime \ub9cc\ud07c \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\ud558\ub294 \uc2a4\ud2b8\ub9bc\n\/\/\/ &lt;\/summary>\n\/\/\/ &lt;param name=\"countTime\">&lt;\/param>\n\/\/\/ &lt;returns>&lt;\/returns>\nprivate IObservable&lt;int> CreateCountDownObservable(int countTime)\n{\n    return Observable\n        .Timer(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1)) \/\/ 0\ucd08 \uc774\ud6c4 1\ucd08 \uac04\uaca9\uc73c\ub85c \uc2e4\ud589\n        .Select(x => (int) (countTime - x)) \/\/ x\ub294 \uc2dc\uc791\ud558\uace0 \ub098\uc11c\uc758 \uc2dc\uac04(\ucd08)\n        .TakeWhile(x => x > 0); \/\/ 0\ucd08 \ucd08\uacfc \ub3d9\uc548 OnNext 0\uc774 \ub418\uba74 OnComplete\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Rx\ub85c \ucd08\ub97c \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\ud558\ub294 \uacbd\uc6b0 \uc704\uc640 \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(<a href=\"http:\/\/reactivex.io\/documentation\/operators\/create.html\" target=\"_blank\" rel=\"noreferrer noopener\">Generate<\/a>&nbsp;\ubc0f&nbsp;<a href=\"http:\/\/reactivex.io\/documentation\/ko\/operators\/and-then-when.html\" target=\"_blank\" rel=\"noreferrer noopener\">plan\/Pattern<\/a>\ub97c \uc0ac\uc6a9\ud574\ub3c4 \uc88b\uc9c0\ub9cc, UniRx\uc5d0\ub294 \uc774\ub7ec\ud55c \uae30\ub2a5\uc774 \uc544\uc9c1 \uad6c\ud604\ub418\uc9c0 \uc54a\uc558\ub2e4.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc, \uc774 CreateCountDownObservable\ub85c \ub9cc\ub4e0 \uc2a4\ud2b8\ub9bc\uc740&nbsp;<strong>Cold<\/strong>\ub77c\ub294 \uc810\uc5d0 \uc8fc\uc758\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(Subscribe\ud55c \ud0c0\uc774\ubc0d\ubd80\ud130 \uc2dc\uc791\ud558\uace0 \uce74\uc6b4\ud2b8\ub2e4\uc6b4\uc774 \uc2dc\uc791\ub418\ub294 \uc810, 1\uac1c\uc758 \ud0c0\uc774\uba38 \uc2a4\ud2b8\ub9bc\uc744 \uc5ec\ub7ec\ubc88 Subscribe\ud558\ub824\uba74 Hot \ubcc0\ud658\uc774 \ud544\uc694\ud558\ub2e4\ub294 \uc810 \ub4f1)<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"rx\uc5d0\uc11c-\ud0c0\uc774\uba38\ub97c-\ub9cc\ub4dc\ub294-\uc7a5\uc810\ub2e8\uc810\">Rx\uc5d0\uc11c \ud0c0\uc774\uba38\ub97c \ub9cc\ub4dc\ub294 \uc7a5\uc810\/\ub2e8\uc810<a href=\"https:\/\/tech.lonpeach.com\/2019\/09\/29\/UniRx-Count-Down-Timer\/#rx%EC%97%90%EC%84%9C-%ED%83%80%EC%9D%B4%EB%A8%B8%EB%A5%BC-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%9E%A5%EC%A0%90%EB%8B%A8%EC%A0%90\">\u200b<\/a><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Rx\uc5d0\uc11c \ud0c0\uc774\uba38\ub97c \ub9cc\ub4dc\ub294 \uac83\uacfc Unity \ud45c\uc900 \ucf54\ub8e8\ud2f4\uacfc InvokeRepeat\uc5d0\uc11c \ud0c0\uc774\uba38\ub97c \ub9cc\ub4dc\ub294 \uac83\uc744 \ube44\uad50\ud558\uba74 Rx\ub85c \ub9cc\ub4dc\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\ub2e8\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc7a5\uc810<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc2a4\ud2b8\ub9bc \uc790\uccb4\uac00 \uc2dc\uac04\uc744 \uad00\ub9ac \ud574\uc900\ub2e4.<\/li>\n\n\n\n<li>\ud0c0\uc774\uba38\ub97c \uac10\uc2dc\ud558\ub294 \uce21\uc758 \ucc98\ub9ac\uac00 \uc27d\ub2e4.<\/li>\n\n\n\n<li>\ud0c0\uc774\uba38\ub97c \ubc14\ud0d5\uc73c\ub85c \ub2e4\ub978 \uc791\uc5c5\uc744 \uc2dc\uc791 \ud558\uae30 \uc27d\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8\uc810<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc5b4\ub290 \uc21c\uac04\uc5d0 \ud0c0\uc774\uba38\uc758 \uc2dc\uac04\uc744 \uc5bb\uc744 \uc218 \uc5c6\ub2e4 (\uc784\uc2dc \ubcc0\uc218\uc5d0 \uc800\uc7a5\ud560 \ud544\uc694\uac00 \uc788\ub2e4)<\/li>\n\n\n\n<li>\ud0c0\uc774\uba38\ub97c \uc911\ub2e8\ud558\uac70\ub098 \ub0a8\uc740 \uc2dc\uac04\uc744 \uace0\uccd0 \uc4f0\uae30\uac00 \uc5b4\ub835\ub2e4 (\ubd88\uac00\ub2a5\ud558\uc9c0\ub294 \uc54a\ub2e4)<\/li>\n\n\n\n<li>Rx \uc790\uccb4\uac00 \uc5b4\ub835\uace0 \uc774\ud574\ud558\uae30 \uc5b4\ub835\ub2e4 (Hot\/Cold\ub97c \uc54c\uc9c0 \ubabb\ud558\uba74 \uc624\ub3d9\uc791 \uac00\ub2a5\uc131\uc774 \uc788\ub2e4)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud0c0\uc774\uba38\ub97c Rx\uc5d0\uc11c \ub9cc\ub4dc\ub294 \uac00\uc7a5 \ud070 \uc7a5\uc810\uc740&nbsp;<strong>&#8220;\ud0c0\uc774\uba38\ub97c \uac10\uc2dc\ud558\ub294 \uce21\uc758 \ucc98\ub9ac\uac00 \uc27d\ub2e4&#8221;<\/strong>\uc640&nbsp;<strong>&#8220;\ud0c0\uc774\uba38\ub97c \ubc14\ud0d5\uc73c\ub85c \ub2e4\ub978 \uc791\uc5c5\uc744 \uc2dc\uc791\ud558\uae30 \uc27d\ub2e4&#8221;<\/strong>&nbsp;\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\uc608-rx-\ud0c0\uc774\uba38\uc758-\uac12\uc744-\uc0ac\uc6a9\ud558\uc5ec-\uc791\uc5c5\">\uc608) Rx \ud0c0\uc774\uba38\uc758 \uac12\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc791\uc5c5<a href=\"https:\/\/tech.lonpeach.com\/2019\/09\/29\/UniRx-Count-Down-Timer\/#%EC%98%88-rx-%ED%83%80%EC%9D%B4%EB%A8%B8%EC%9D%98-%EA%B0%92%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9E%91%EC%97%85\">\u200b<\/a><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4, \ubc29\uae08 \uc804\uc758 CountDownTimer\uc744 \uc774\uc6a9\ud558\uc5ec \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uad6c\ud604\ud558\ub824\uace0 \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uad6c\ud604 \ubaa9\ub85d<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Start() \uc2dc\uc810\uc5d0\uc11c 60\ucd08\ub97c \uce74\uc6b4\ud2b8 \ud55c\ub2e4.<\/li>\n\n\n\n<li>\ud0c0\uc774\uba38\uc758 \uc22b\uc790\ub97c UnityEngine.UI.Text\uc5d0 \uadf8\ub9b0\ub2e4.<\/li>\n\n\n\n<li>\uce74\uc6b4\ud2b8\uac00 10\ucd08 \uc774\ud558\uac00 \ub418\uba74 \uc704\uc758 Unity.UI.Text\uc758 \uae00\uc790\uc758 \uc0c9\uc0c1\uc744 \ubd89\uc740 \uc0c9\uc73c\ub85c \ubcc0\ud558\uac8c \ud55c\ub2e4.<\/li>\n\n\n\n<li>\uce74\uc6b4\ud2b8\uac00 10\ucd08 \uc774\ud558\uac00 \ub418\uba74 \uce74\uc6b4\ud2b8\ub9c8\ub2e4 \ud6a8\uacfc\uc74c\uc744 \uc6b8\ub9b0\ub2e4.<\/li>\n\n\n\n<li>\uacc4\uc0b0\uc774 \ub05d\ub098\uba74 Unity.UI.Text\uc758 \ubb38\uc790\ub97c \uc9c0\uc6b4\ub2e4.<\/li>\n\n\n\n<li>\uacc4\uc0b0\uc774 \ub05d\ub098\uba74 \ud6a8\uacfc\uc74c\uc744 \uc6b8\ub9b0\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">RxCountDownTimer.cs<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/\/ &lt;summary>\n\/\/\/ \uce74\uc6b4\ud2b8 \uad6c\uc131 \uc694\uc18c\n\/\/\/ &lt;\/summary>\npublic class RxCountDownTimer : MonoBehaviour\n{\n    \/\/\/ &lt;summary>\n    \/\/\/ \uce74\uc6b4\ud2b8 \ub2e4\uc6b4 \uc2a4\ud2b8\ub9bc\n    \/\/\/ \uc774 Observable\uc744 \uac01 \ud074\ub798\uc2a4\uac00 Subscribe \ud55c\ub2e4.\n    \/\/\/ &lt;\/summary>\n    public IObservable&lt;int> CountDownObservable => _countDownObservable.AsObservable();\n    \n    private IConnectableObservable&lt;int> _countDownObservable;\n\n    \/\/ 60\ucd08 \uce74\uc6b4\ud2b8 \uc2a4\ud2b8\ub9bc\uc744 \uc0dd\uc131\n    \/\/ Publish\ub85c Hot \ubcc0\ud658\n    private void Awake() => \n        _countDownObservable = CreateCountDownObservable(60).Publish();\n\n    \/\/ start\uc2dc \uce74\uc6b4\ud2b8 \uc2dc\uc791\n    private void Start() =>\n        _countDownObservable.Connect();\n\n    \/\/\/ &lt;summary>\n    \/\/\/ countTime \ub9cc\ud07c \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\ud558\ub294 \uc2a4\ud2b8\ub9bc\n    \/\/\/ &lt;\/summary>\n    \/\/\/ &lt;param name=\"countTime\">&lt;\/param>\n    \/\/\/ &lt;returns>&lt;\/returns>\n    private IObservable&lt;int> CreateCountDownObservable(int countTime) =>\n        Observable\n            .Timer(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1))\n            .Select(x => (int) (countTime - x))\n            .TakeWhile(x => x > 0);\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">CountDownTextComponent.cs<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/\/ &lt;summary>\n\/\/\/ \ud0c0\uc774\uba38\uc758 \uc2dc\uac04\uc744 \uae30\ucd08\ub85c Text\ub97c \uc5c5\ub370\uc774\ud2b8 \ud560 \ucef4\ud3ec\ub10c\ud2b8\n\/\/\/ &lt;\/summary>\npublic class CountDownTextComponent : MonoBehaviour\n{\n    \/\/\/ &lt;summary>\n    \/\/\/ UnityEditor\uc5d0\uc11c \ud560\ub2f9 \ud55c\ub2e4.\n    \/\/\/ &lt;\/summary>\n    [SerializeField] private RxCountDownTimer _rxCountDownTimer;\n\n    \/\/\/ &lt;summary>\n    \/\/\/ uGUI\uc758 Text\n    \/\/\/ &lt;\/summary>\n    private Text _text;\n\n    private void Start()\n    {\n        _text = GetComponent&lt;Text>();\n        \n        \/\/ \ud0c0\uc774\uba38\uc758 \ub0a8\uc740 \uc2dc\uac04\uc744 \ud45c\uc2dc\ud55c\ub2e4.\n        _rxCountDownTimer\n            .CountDownObservable\n            .Subscribe(time =>\n            {\n                \/\/ onNext\uc5d0\uc11c \uc2dc\uac04\uc744 \ud45c\uc2dc\ud55c\ub2e4.\n                _text.text = $\"\ub0a8\uc740 \uc2dc\uac04 : {time}\";\n            }, () =>\n            {\n                \/\/ onComplete\uc5d0\uc11c \ubb38\uc790\ub97c \uc9c0\uc6b4\ub2e4.\n                _text.text = string.Empty;\n            }).AddTo(gameObject);\n        \n        \/\/ \ud0c0\uc774\uba38\uac00 10\ucd08 \uc774\ud558\ub85c \ub418\ub294 \ud0c0\uc774\ubc0d\uc5d0 \uc0c9\uc744 \ubd89\uc740 \uc0c9\uc73c\ub85c \ud55c\ub2e4.\n        _rxCountDownTimer\n            .CountDownObservable\n            .First(timer => timer &lt;= 10)\n            .Subscribe(_ => _text.color = Color.red);\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">CountDownSoundComponent.cs<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[RequireComponent(typeof(AudioSource))]\npublic class CountDownSoundComponent : MonoBehaviour\n{\n    \/\/ \ud6a8\uacfc\uc74c\n    [SerializeField] private AudioClip _seCountDownTick;\n    [SerializeField] private AudioClip _seCountDownEnd;\n    \n    private AudioSource _audioSource;\n\n    \/\/\/ &lt;summary>\n    \/\/\/ UnityEditor\uc5d0\uc11c \ud560\ub2f9 \ud55c\ub2e4.\n    \/\/\/ &lt;\/summary>\n    [SerializeField] private RxCountDownTimer _rxCountDownTimer;\n\n    private void Start()\n    {\n        _audioSource = GetComponent&lt;AudioSource>();\n        \n        \/\/ \uce74\uc6b4\ud2b8\uac00 10\ucd08 \uc774\ud558\uac00 \ub418\uba74 \ud6a8\uacfc\uc74c\uc744 1\ucd08\ub9c8\ub2e4 \uc6b8\ub9ac\uac8c \ud55c\ub2e4.\n        _rxCountDownTimer\n            .CountDownObservable\n            .Where(time => time &lt;= 10)\n            .Subscribe(_ => _audioSource.PlayOneShot(_seCountDownTick));\n        \n        \/\/ \uacc4\uc0b0\uc774 \uc644\ub8cc\ub41c \uc2dc\uc810\uc5d0\uc11c \ud6a8\uacfc\uc74c\uc744 \uc6b8\ub9b0\ub2e4.\n        _rxCountDownTimer\n            .CountDownObservable\n            .Subscribe(_ => { ; }, () => _audioSource.PlayOneShot((_seCountDownEnd)));\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">RxCountDownTimer\uc5d0\uc11c \uce74\uc6b4\ud2b8 \ub2e4\uc6b4 \uc2a4\ud2b8\ub9bc\uc744 \ub9cc\ub4e4\uace0 \uadf8\uac83\uc744 CountDownTextComponent\uc640 CountDownSoundComponent\uc5d0\uc11c \ubaa8\ub2c8\ud130\ub9c1\ud558\uc5ec \uac12\uc758 \ubcc0\ud654\uc640 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ub97c \uc2e4\uc2dc\ud558\uac8c \uad6c\ud604\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rx\ub97c \uc0ac\uc6a9\ud558\uba74 &#8220;\ud0c0\uc774\uba38\uc758 \ud604\uc7ac \uc2dc\uac04\uc774 \ud750\ub978\ub2e4&#8221;\ub294 \uc774\ubca4\ud2b8\uc640 \uac19\uc740 (\ub77c\uae30 \ubcf4\ub2e4\ub294 \uadf8 \uc774\uc0c1)\uac83\uc744 \ubcf4\ub2e4 \uc801\uc740 \ucf54\ub4dc\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\uac8c \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>&#8220;\uac12\uc758 \ubcc0\ud654\ub97c \uac10\uc2dc\ud558\uace0 \ucc98\ub9ac\ud55c\ub2e4&#8221;, &#8220;\ubcc0\ud654\ud558\ub294 \uac12\uc774 (\ubcf5\uc7a1\ud55c) \uc870\uac74\uc744 \ucda9\uc871\ud588\uc744 \ub54c \ucc98\ub9ac\ud55c\ub2e4&#8221;<\/strong>&nbsp;\ub77c\ub294 \ubd80\ubd84\uc5d0\uc11c\ub294 Rx\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc720\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\uc608-\ud0c0\uc774\uba38\ub97c-\ubc14\ud0d5\uc73c\ub85c-\ubcf5\uc7a1\ud55c-\ucc98\ub9ac\ub97c-\ud55c\ub2e4\">\uc608) \ud0c0\uc774\uba38\ub97c \ubc14\ud0d5\uc73c\ub85c \ubcf5\uc7a1\ud55c \ucc98\ub9ac\ub97c \ud55c\ub2e4.<a href=\"https:\/\/tech.lonpeach.com\/2019\/09\/29\/UniRx-Count-Down-Timer\/#%EC%98%88-%ED%83%80%EC%9D%B4%EB%A8%B8%EB%A5%BC-%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C-%EB%B3%B5%EC%9E%A1%ED%95%9C-%EC%B2%98%EB%A6%AC%EB%A5%BC-%ED%95%9C%EB%8B%A4\">\u200b<\/a><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc29\uae08 \uc804\uc758 60\ucd08 \ud0c0\uc774\uba38\uc758 \ub3d9\uc791\uc744 \ubc14\uafb8\uc5b4 \ubd05\uc2dc\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubcc0\uacbd\ud560 \ubaa9\ub85d<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Start()\uc2dc 3\ucd08\uac04 \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\uc744 \ud55c\ub2e4.<\/li>\n\n\n\n<li>3\ucd08 \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\uc774 \ub05d\ub098\uace0 \ub098\uc11c 60\ucd08 \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\uc744 \uc2dc\uc791\ud55c\ub2e4.<\/li>\n\n\n\n<li>60\ucd08 \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\uc774 \ub05d\ub098\uace0 \ub09c \ud6c4 5\ucd08 \uc815\ub3c4 \uae30\ub2e4\ub9b0 \ud6c4 \ub2e4\ub978 \uc52c\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;\uac8c\uc784 \uc2dc\uc791 \uc804 3\ucd08 \uce74\uc6b4\ud2b8 \ub2e4\uc6b4&#8221; \u2192 &#8220;\uac8c\uc784 \uc2dc\uc791 60\ucd08 \uce74\uc6b4\ud2b8 \ub2e4\uc6b4&#8221; \u2192 &#8220;5\ucd08 \ub3d9\uc548 \uacb0\uacfc \ud45c\uc2dc\ud6c4 \uac8c\uc784 \uc885\ub8cc&#8221; \uc21c\uc11c\ub77c\uace0 \uc0dd\uac01\ud574 \uc8fc\uc2ed\uc2dc\uc624.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub97c Rx\uc5d0\uc11c \uc4f0\uba74 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class GameTimerManager : MonoBehaviour\n{\n    \/\/\/ &lt;summary>\n    \/\/\/ \uacbd\uae30 \uc2dc\uc791 \uc804 \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\n    \/\/\/ &lt;\/summary>\n    public IObservable&lt;int> GameStartCountDownObservable { get; private set; }\n    \n    \/\/\/ &lt;summary>\n    \/\/\/ \uacbd\uae30 \uc911 \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\n    \/\/\/ &lt;\/summary>\n    public IObservable&lt;int> BattleCountDownObservable { get; private set; }\n\n    private void Start()\n    {\n        \/\/ \uacbd\uae30 \uc804 3\ucd08 \ud0c0\uc774\uba38\n        \/\/ 3\ucd08 \ud0c0\uc774\uba38\uc758 \uc2a4\ud2b8\ub9bc\uc744 Publish\ub85c Hot\uc73c\ub85c \ubcc0\ud658 (\uc544\uc9c1 Connect\ub294 \ud558\uc9c0 \uc54a\ub294\ub2e4)\n        var startConnectableObservable = CreateCountDownObservable(3).Publish();\n        \/\/ \uc678\ubd80\uc5d0 \uacf5\uac1c\ud558\uae30 \uc704\ud574 Observable\ub85c \uc800\uc7a5\n        GameStartCountDownObservable = startConnectableObservable;\n        \n        \/\/ \uacbd\uae30 \uc911 60\ucd08 \ud0c0\uc774\uba38\n        \/\/ 60\ucd08 \ud0c0\uc774\uba38\uc758 \uc2a4\ud2b8\ub9bc\uc744 Publish\ub85c Hot\uc73c\ub85c \ubcc0\ud658 (\uc544\uc9c1 Connect\ub294 \ud558\uc9c0 \uc54a\ub294\ub2e4)\n        var battleConnectableObservable = CreateCountDownObservable(60).Publish();\n        \/\/ \uc678\ubd80\uc5d0 \uacf5\uac1c\ud558\uae30 \uc704\ud574 Observable\ub85c \uc800\uc7a5\n        BattleCountDownObservable = battleConnectableObservable;\n        \n        \/\/ 3\ucd08 \ud0c0\uc774\uba38\uc758 OnComplete\uc5d0\uc11c 60\ucd08 \ud0c0\uc774\uba38\ub97c Connect\ud55c\ub2e4 (60\ucd08 \ud0c0\uc774\uba38 \uc2dc\uc791)\n        GameStartCountDownObservable\n            .Subscribe(_ => { ; }, () => battleConnectableObservable.Connect());\n        \n        \/\/ 60\ucd08 \ud0c0\uc774\uba38 \ub4a4\uc5d0 Concat\uc73c\ub85c 5\ucd08 \ud0c0\uc774\uba38\ub97c \uc5f0\uacb0\ud558\uace0 OnComplete\uc5d0\uc11c Scene\ub97c \uc804\ud658\ud55c\ub2e4.\n        BattleCountDownObservable\n            .Concat(CreateCountDownObservable(5))\n            .Subscribe(_ => { ; }, () =>\n            {\n                SceneManager.LoadScene(\"NextScene\");\n            }).AddTo(gameObject);\n        \n        \/\/ 3\ucd08 \ud0c0\uc774\uba38 \uc2dc\uc791\n        startConnectableObservable.Connect();\n    }\n    \n    \/\/\/ &lt;summary>\n    \/\/\/ countTime \ub9cc\ud07c \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\ud558\ub294 \uc2a4\ud2b8\ub9bc\n    \/\/\/ &lt;\/summary>\n    \/\/\/ &lt;param name=\"countTime\">&lt;\/param>\n    \/\/\/ &lt;returns>&lt;\/returns>\n    private IObservable&lt;int> CreateCountDownObservable(int countTime) =>\n        Observable\n            .Timer(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1))\n            .Select(x => (int) (countTime - x))\n            .TakeWhile(x => x > 0);\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc870\uae08 \ubcf5\uc7a1 \ud560\uc9c0\ub3c4 \ubaa8\ub985\ub2c8\ub2e4\ub9cc, \uc774 \ucf54\ub4dc\ub9cc\uc73c\ub85c \uad6c\ud604\uc774 \uc644\ub8cc\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0c1\ud0dc\ub97c \uad00\ub9ac\ud558\ub294 \ud544\ub4dc \ubcc0\uc218\ub294 \ubd88 \ud544\uc694 \ud558\uace0, \uc2a4\ud2b8\ub9bc\uc758 \ud569\uc131\ub9cc\uc73c\ub85c \uad6c\ud604\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\uc815\ub9ac\">\uc815\ub9ac<a href=\"https:\/\/tech.lonpeach.com\/2019\/09\/29\/UniRx-Count-Down-Timer\/#%EC%A0%95%EB%A6%AC\">\u200b<\/a><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rx\ub97c \uc774\uc6a9\ud558\uba74 \ud0c0\uc774\uba38\ub97c \ubcf4\ub2e4 \uc801\uc740 \ucf54\ub4dc\ub85c \uad6c\ud604\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\uc2a4\ud2b8\ub9bc \uc790\uc2e0\uc774 \uc2dc\uac04\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \uc784\uc2dc \uc800\uc7a5 \ubcc0\uc218\uac00 \ubd88\ud544\uc694 \ud558\ub2e4. (\uadf8\ub7ec\ub098 \uc784\uc758\uc758 \ud504\ub808\uc784\uc5d0\uc11c\uc758 \uc2dc\uac04 \ucde8\ub4dd\uc740 \ud560 \uc218 \uc5c6\uac8c \ub41c\ub2e4)<\/li>\n\n\n\n<li>\ud0c0\uc774\uba38\uc758 \ubcf5\uc7a1\ud55c \uad6c\ud604\uc740 Rx\uc758 \ud569\uc131 \uba54\uc11c\ub4dc\ub85c \uad6c\ud604 \ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>UI \uac31\uc2e0 \ub4f1\uc5d0 Rx \uc2a4\ud2b8\ub9bc\uc744 \ud3b8\ub9ac\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. (Model\uc5d0\uc11c View\ub85c \ud1b5\uc9c0)<\/li>\n\n\n\n<li>Rx\uc758 Hot\/Cold\uc758 \uac1c\ub150\uc744 \uc54c\uace0 \uc788\uc9c0 \uc54a\uc73c\uba74 \uc624\ub3d9\uc791 \uac00\ub2a5\uc131\uc774 \uc788\ub2e4.<\/li>\n\n\n\n<li>Rx \uc790\uccb4\uac00 \uc5b4\ub835\ub2e4.<\/li>\n\n\n\n<li>UniRx\uac00 \ub354 \uc720\ud589 \ud588\uc73c\uba74 \uc88b\uaca0\ub2e4.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\ud658\uacbd UniRx \uc785\ubb38 \uc2dc\ub9ac\uc988 \ubaa9\ucc28\ub294 \uc774\ucabd \uc9c0\uc815\ud55c \ucd08\ub9cc\ud07c \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\ud558\ub294 \uc2a4\ud2b8\ub9bc Rx\ub85c \ucd08\ub97c \uce74\uc6b4\ud2b8 \ub2e4\uc6b4\ud558\ub294 \uacbd\uc6b0 \uc704\uc640 \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. (Generate&nbsp;\ubc0f&nbsp;plan\/Pattern\ub97c \uc0ac\uc6a9\ud574\ub3c4 \uc88b\uc9c0\ub9cc, UniRx\uc5d0\ub294 \uc774\ub7ec\ud55c \uae30\ub2a5\uc774 \uc544\uc9c1 \uad6c\ud604\ub418\uc9c0 \uc54a\uc558\ub2e4.) \ub2e4\ub9cc, \uc774 CreateCountDownObservable\ub85c \ub9cc\ub4e0 \uc2a4\ud2b8\ub9bc\uc740&nbsp;Cold\ub77c\ub294 \uc810\uc5d0 \uc8fc\uc758\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. (Subscribe\ud55c \ud0c0\uc774\ubc0d\ubd80\ud130 \uc2dc\uc791\ud558\uace0 \uce74\uc6b4\ud2b8\ub2e4\uc6b4\uc774 \uc2dc\uc791\ub418\ub294 \uc810, 1\uac1c\uc758 \ud0c0\uc774\uba38 \uc2a4\ud2b8\ub9bc\uc744 \uc5ec\ub7ec\ubc88 Subscribe\ud558\ub824\uba74 Hot \ubcc0\ud658\uc774 \ud544\uc694\ud558\ub2e4\ub294 \uc810 &hellip;<br \/><a href=\"http:\/\/yoonhada.com\/?p=1853\" class=\"more-link pen_button pen_element_default pen_icon_arrow_double\"><span class=\"screen-reader-text\">Rx\ub85c \ub9cc\ub4e0 \uce74\uc6b4\ud2b8 \ub2e4\uc6b4 \ud0c0\uc774\uba38<\/span> \ub354\ubcf4\uae30<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[84,80],"tags":[59,42],"class_list":["post-1853","post","type-post","status-publish","format-standard","hentry","category-architecture","category-project","tag-unirx","tag-unity"],"_links":{"self":[{"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/posts\/1853","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/yoonhada.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1853"}],"version-history":[{"count":5,"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/posts\/1853\/revisions"}],"predecessor-version":[{"id":1933,"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/posts\/1853\/revisions\/1933"}],"wp:attachment":[{"href":"http:\/\/yoonhada.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yoonhada.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1853"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yoonhada.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}