<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>非同期処理 on GARNET LOG</title><link>https://garnetcode.jp/tags/%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86/</link><description>Recent content in 非同期処理 on GARNET LOG</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sat, 24 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://garnetcode.jp/tags/%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>【Unity】async/await入門</title><link>https://garnetcode.jp/blog/2026/10/async_await/</link><pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate><guid>https://garnetcode.jp/blog/2026/10/async_await/</guid><description>&lt;h2 id="asyncawaitとは"&gt;async/awaitとは？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;async/await&lt;/code&gt;は、&lt;code&gt;C#&lt;/code&gt;で非同期処理を書くための構文です。&lt;/p&gt;
&lt;p&gt;時間のかかる処理を実行している間にメインの処理をブロックせず、完了を待ってから続きを実行できます。&lt;/p&gt;
&lt;p&gt;本来、非同期処理はコールバックやスレッド管理が必要で複雑になりがちですが、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;async/await&lt;/code&gt;を使うと、見た目は同期処理のように直列なコードで非同期の流れを記述できます。&lt;/p&gt;
&lt;div class="blogcard"&gt;
&lt;a href="https://learn.microsoft.com/ja-jp/dotnet/csharp/asynchronous-programming/" target="_blank" rel="noopener nofollow"&gt;
&lt;div class="blogcard-content"&gt;
&lt;span class="blogcard-label blogcard-label--external"&gt;&lt;i class="fas fa-arrow-up-right-from-square" aria-hidden="true"&gt;&lt;/i&gt;外部記事&lt;/span&gt;
&lt;div class="blogcard-title"&gt;非同期プログラミング - C#&lt;/div&gt;
&lt;div class="blogcard-site"&gt;learn.microsoft.com&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Unityでは従来、フレームを跨ぐ処理に&lt;code&gt;Coroutine&lt;/code&gt;を使うのが定番でしたが、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;C#&lt;/code&gt;本来の機能である&lt;code&gt;async/await&lt;/code&gt;も利用でき、&lt;code&gt;Unity 2023.1&lt;/code&gt;以降では&lt;code&gt;Awaitable&lt;/code&gt;という&lt;code&gt;Unity&lt;/code&gt;独自の型も追加されています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Awaitable&lt;/code&gt;は&lt;code&gt;Task&lt;/code&gt;より軽量で、Unityのフレーム単位の待機にも対応した型ですが、本記事ではまず標準の&lt;code&gt;async/await&lt;/code&gt;と&lt;code&gt;Task&lt;/code&gt;の基本に絞って解説します。&lt;/p&gt;</description></item><item><title>【Unity】コルーチン入門</title><link>https://garnetcode.jp/blog/2026/10/coroutine/</link><pubDate>Sat, 17 Oct 2026 00:00:00 +0000</pubDate><guid>https://garnetcode.jp/blog/2026/10/coroutine/</guid><description>&lt;h2 id="コルーチンとは"&gt;コルーチンとは？&lt;/h2&gt;
&lt;p&gt;Unityでゲームを作っていると、「3秒待ってから次の処理を実行したい」「フェードアウトを少しずつ進めたい」といった、時間に関わる処理を書きたくなる場面が出てきます。&lt;/p&gt;
&lt;p&gt;こうした処理を&lt;code&gt;Update&lt;/code&gt;だけで書こうとすると、経過時間を測るための変数を用意し、毎フレーム加算して、しきい値を超えたかどうかを判定して……と、コードがあっという間に膨らんでいきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; UnityEngine;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WaitWithUpdate&lt;/span&gt; : MonoBehaviour
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; _elapsedTime;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; _isWaiting = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; Update()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (_isWaiting)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 経過時間を加算する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _elapsedTime += Time.deltaTime;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 3秒経過したかチェックする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (_elapsedTime &amp;gt;= &lt;span style="color:#ae81ff"&gt;3f&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Debug.Log(&lt;span style="color:#e6db74"&gt;&amp;#34;3秒経過しました&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _isWaiting = &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;たった「3秒待ちたい」だけなのに、状態を管理するフラグや経過時間の変数が必要になってしまいます。&lt;/p&gt;
&lt;p&gt;こんなときに便利なのがコルーチン（&lt;code&gt;Coroutine&lt;/code&gt;）です。&lt;/p&gt;
&lt;p&gt;コルーチンを使うと、処理の途中で一時停止して、後で再開するような書き方ができます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Update&lt;/code&gt;に状態管理を持ち込まずに、自然な流れで「待つ」処理を書けるのが利点です。&lt;/p&gt;
&lt;div class="blogcard"&gt;
&lt;a href="https://docs.unity3d.com/6000.0/Documentation/Manual/Coroutines.html" target="_blank" rel="noopener nofollow"&gt;
&lt;div class="blogcard-content"&gt;
&lt;span class="blogcard-label blogcard-label--unitydocs"&gt;&lt;i class="fas fa-book" aria-hidden="true"&gt;&lt;/i&gt;Unity Docs&lt;/span&gt;
&lt;div class="blogcard-title"&gt;Write and run coroutines • Split tasks across frames with coroutines • 6000.0 • Unity Editor&lt;/div&gt;
&lt;div class="blogcard-site"&gt;docs.unity3d.com&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;先ほどの3秒待つ処理を、コルーチンで書き直してみると以下のようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System.Collections;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; UnityEngine;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WaitWithCoroutine&lt;/span&gt; : MonoBehaviour
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; Start()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// コルーチンを開始する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; StartCoroutine(WaitAndLog());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; IEnumerator WaitAndLog()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 3秒待つ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;yield&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; WaitForSeconds(&lt;span style="color:#ae81ff"&gt;3f&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Debug.Log(&lt;span style="color:#e6db74"&gt;&amp;#34;3秒経過しました&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;フラグも経過時間の変数もなくなり、コードを上から下へ追うだけで処理の流れが読み取れます。&lt;/p&gt;</description></item><item><title>【Unity】SceneManagerの使い方</title><link>https://garnetcode.jp/blog/2026/08/scene_manager/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://garnetcode.jp/blog/2026/08/scene_manager/</guid><description>&lt;h2 id="scenemanagerとは"&gt;SceneManagerとは？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;SceneManager&lt;/code&gt;は、Unityでシーンの読み込みやアンロードを行うためのクラスです。&lt;/p&gt;
&lt;p&gt;タイトル画面からゲーム本編へ移動したり、ステージごとにシーンを分けて切り替えたりと、ゲーム制作では必ず登場する仕組みですね。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;UnityEngine.SceneManagement&lt;/code&gt;名前空間に含まれており、&lt;code&gt;using UnityEngine.SceneManagement;&lt;/code&gt;を書けば利用できます。&lt;/p&gt;
&lt;div class="blogcard"&gt;
&lt;a href="https://docs.unity3d.com/ja/2022.3/ScriptReference/SceneManagement.SceneManager.html" target="_blank" rel="noopener nofollow"&gt;
&lt;div class="blogcard-content"&gt;
&lt;span class="blogcard-label blogcard-label--unitydocs"&gt;&lt;i class="fas fa-book" aria-hidden="true"&gt;&lt;/i&gt;Unity Docs&lt;/span&gt;
&lt;div class="blogcard-title"&gt;SceneManagement.SceneManager - Unity スクリプトリファレンス&lt;/div&gt;
&lt;div class="blogcard-site"&gt;docs.unity3d.com&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;そして、シーンを切り替えた時に消えてほしくないオブジェクト（BGMを鳴らす&lt;code&gt;AudioSource&lt;/code&gt;や、各種マネージャークラスなど）を持ち越すには&lt;code&gt;DontDestroyOnLoad&lt;/code&gt;を使います。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DontDestroyOnLoad&lt;/code&gt;は専用の記事で詳しく解説しているので、本記事では&lt;code&gt;SceneManager&lt;/code&gt;を中心に扱います。&lt;/p&gt;
&lt;div class="related-link"&gt;
&lt;div class="related-link-label"&gt;🔗 関連記事&lt;/div&gt;
&lt;div class="related-link-lead"&gt;&lt;code&gt;DontDestroyOnLoad&lt;/code&gt;でオブジェクトを永続化させるには。&lt;/div&gt;
&lt;div class="blogcard"&gt;
&lt;a href="https://garnetcode.jp/blog/2026/08/dont_destroy_on_load/" target="_blank" rel="noopener nofollow"&gt;
&lt;div class="blogcard-content"&gt;
&lt;span class="blogcard-label blogcard-label--internal"&gt;&lt;i class="fas fa-house" aria-hidden="true"&gt;&lt;/i&gt;内部記事&lt;/span&gt;
&lt;div class="blogcard-title"&gt;【Unity】DontDestroyOnLoadの使い方｜シーン遷移でオブジェクトを残す方法と重複防止 - GARNET LOG&lt;/div&gt;
&lt;div class="blogcard-site"&gt;GARNET LOG&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>【Unity】破棄済みオブジェクトでawaitが動き続ける問題の直し方｜destroyCancellationToken</title><link>https://garnetcode.jp/blog/2025/08/destroy_cancellation_token/</link><pubDate>Sat, 23 Aug 2025 00:00:00 +0000</pubDate><guid>https://garnetcode.jp/blog/2025/08/destroy_cancellation_token/</guid><description>&lt;h2 id="destroycancellationtokenとは"&gt;destroyCancellationTokenとは？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;destroyCancellationToken&lt;/code&gt;は&lt;code&gt;MonoBehaviour&lt;/code&gt;のプロパティで、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GameObject&lt;/code&gt;や&lt;code&gt;MonoBehaviour&lt;/code&gt;が破棄（&lt;code&gt;Destroy&lt;/code&gt;）されたタイミングでキャンセルされる&lt;code&gt;CancellationToken&lt;/code&gt;を取得できます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Unity2023.1&lt;/code&gt;以降で使用できます。&lt;/p&gt;
&lt;div class="blogcard"&gt;
&lt;a href="https://docs.unity3d.com/6000.0/Documentation/ScriptReference/MonoBehaviour-destroyCancellationToken.html" target="_blank" rel="noopener nofollow"&gt;
&lt;div class="blogcard-content"&gt;
&lt;span class="blogcard-label blogcard-label--unitydocs"&gt;&lt;i class="fas fa-book" aria-hidden="true"&gt;&lt;/i&gt;Unity Docs&lt;/span&gt;
&lt;div class="blogcard-title"&gt;destroyCancellationToken • MonoBehaviour • 6000.0 • Unity Editor&lt;/div&gt;
&lt;div class="blogcard-site"&gt;docs.unity3d.com&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;</description></item><item><title>【Unity】Addressables:GameObject</title><link>https://garnetcode.jp/blog/2025/07/addressables_gameobject/</link><pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate><guid>https://garnetcode.jp/blog/2025/07/addressables_gameobject/</guid><description>&lt;h2 id="addressablesとは"&gt;Addressablesとは？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Addressables&lt;/code&gt;は&lt;code&gt;Unity&lt;/code&gt;が提供する、ゲーム内のアセットを効率的に管理、ロードするためのシステムです。&lt;/p&gt;
&lt;div class="blogcard"&gt;
&lt;a href="https://docs.unity3d.com/ja/Packages/com.unity.addressables@1.20/manual/index.html" target="_blank" rel="noopener nofollow"&gt;
&lt;div class="blogcard-content"&gt;
&lt;span class="blogcard-label blogcard-label--unitydocs"&gt;&lt;i class="fas fa-book" aria-hidden="true"&gt;&lt;/i&gt;Unity Docs&lt;/span&gt;
&lt;div class="blogcard-title"&gt;https://docs.unity3d.com/ja/Packages/com.unity.addressables@1.20/manual/index.html&lt;/div&gt;
&lt;div class="blogcard-site"&gt;docs.unity3d.com&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;</description></item></channel></rss>