質問するログイン新規登録
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

211閲覧

UniTaskのキャンセル

kazuma_tachiban

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2025/08/27 09:50

0

0

Unity6でゲームを作成しています。
UniTaskのキャンセルがわかりません。

オブジェクトに"CountDownScr"というスクリプトを付けました。
UniTaskを使い1秒毎にカウントダウンしていくのですが、右クリックをしたらオブジェクトは非表示になりカウントダウンをキャンセルしてほしいです。
そして左クリックしたらまたカウントダウンしてほしいです。
そして、右クリックしたら

OperationCanceledException: The operation was canceled.
Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask`1[TStateMachine].GetResult (System.Int16 token) (at ./Library/PackageCache/com.cysharp.unitask/Runtime/CompilerServices/StateMachineRunner.cs:218)

というエラーが出てしまいました。

using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;

public class CountDownScr : MonoBehaviour
{
CancellationTokenSource cts;

async void Start() { cts = new CancellationTokenSource(); await CountDown(cts.Token); } async UniTask CountDown(CancellationToken token) { print("3"); await UniTask.Delay(TimeSpan.FromSeconds(1), cancellationToken: token); print("2"); await UniTask.Delay(TimeSpan.FromSeconds(1), cancellationToken: token); print("1"); await UniTask.Delay(TimeSpan.FromSeconds(1), cancellationToken: token); print("0"); } void Update() { if (Input.GetMouseButtonDown(1)) { gameObject.SetActive(false); print("R"); cts.Cancel(); } if (Input.GetMouseButtonDown(0)) { Start(); print("L"); } }

}

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

キャンセルしたら、OperationCancelledException が発生するのは、そういう仕様です。
(更にいうと、例外が発生=エラー、とは限りません)

対策1

try/catch してください。

csharp

1 try { 2 await UniTask.Delay(TimeSpan.FromSeconds(1), cancellationToken: token); 3 } 4 catch (OperationCancelledException) { 5 } 6

対策2

SuppressCancellationThrow を呼んで、例外を抑制してください。

csharp

1 bool cancelled = await UniTask.Delay(TimeSpan.FromSeconds(1), cancellationToken: token) 2 .SuppressCancellationThrow();

投稿2025/08/27 14:55

編集2025/08/27 14:57
katsuko

総合スコア3607

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問