タグ

ブックマーク / qiita.com/toRisouP (74)

  • UniRx.ToolKit.ObjectPool相当の機能を別の実装で代替する - Qiita

    何がしたいのか UniRxの開発が終了してしまったため、今後はUniRxではなくR3を使うことが推奨されます。 しかしUniRxからR3への移行は機械的にコードを置き換えていくだけでは駄目で、UniRxしか存在しない機能を他の何かで代替する必要があります。 今回は「UniRx.ToolKit.ObjectPool」とだいたい同じ挙動をするオブジェクトプールをR3またはUniTaskで再現してみた、という内容です。 使用ライブラリ R3 UniTask uPools ObjectPoolの再現 さっそくですが、同期版のオブジェクトプールUniRx.ToolKit.ObjectPoolをuPoolsをベースに再現してみました。 R3実装 まずは「UniRxをそのままR3に置き換えて使いたい」という需要のために、UniRx版のインタフェースをだいたいそのまま踏襲してR3で実装したものが次です。

    UniRx.ToolKit.ObjectPool相当の機能を別の実装で代替する - Qiita
  • Unity向けオブジェクトプールライブラリ「uPools」 - Qiita

    uPoolsとは uPoolsとはUnity向けのオブジェクトプールライブラリです。 汎用的なオブジェクトプールから非同期オブジェクトプールや、既存実装をほぼそのままオブジェクトプール化できる機能が搭載されています。 https://github.com/AnnulusGames/uPools/ ※ 記事では「UniTask」を使用しています。 サンプルコード https://github.com/TORISOUP/uPools_Samples 導入方法 導入方法はGitHubのREADMEを参考にしてください。 機能紹介 SharedGameObjectPool SharedGameObjectPoolはPrefabの生成と破棄をとても簡単にオブジェクトプール化する機能です。 PrefabのInstantiate()をSharedGameObjectPool.Rent()に置き換え、D

    Unity向けオブジェクトプールライブラリ「uPools」 - Qiita
  • 【C#】 拡張メソッドで型によるswitchやif判定をできるだけ消す - Qiita

    今回の話 以前、Visitorパターンで型によるswitchやif判定を消すという記事を書きました。前回のやり方に従えばVisitorパターンを使えばswitch文を消せて型安全にすることができました。 ただ、「じゃあ実際使いやすいのか?」というと正直なところ微妙でした。 そういうわけで今回は「妥協をしてできるだけ安全にしながら使い勝手を保つ」方法を紹介します。 前回のおさらい 問題としたコード Visitorパターンで型によるswitchやif判定を消すで紹介したコードのおさらいです。 何を重視していたかというと「型の網羅性を保証したい」でした。あるデータ構造群を他のデータ構造に変換するときなど、switchを使ったパータンマッチングで記述することができます。 using System; namespace Visitors.Samples { public static class C

    【C#】 拡張メソッドで型によるswitchやif判定をできるだけ消す - Qiita
    s_ryuuki
    s_ryuuki 2024/05/15
  • NuGetForUnityを使うときの注意点メモ - Qiita

    はじめに UnityでNugetパッケージを管理するツールとしてNuGetForUnityがあります。こちらを使ってパッケージ管理する際の注意点をメモしておきます。 メモ どう使うのか 基、READMEを読みましょう。 導入について 導入方法として公式に「OpenUPM」「UPM経由(Git指定)」「unitypackage」の3つが紹介されています。 お好きな方法で導入してください。 GitHubの説明ページ NuGetForUnityを使っている場合のバージョン管理方法 NuGetForUnityを使っているUnityプロジェクトをGit管理する場合は「Assets/Packages」(設定で他のディレクトリをパッケージ保存先にしている場合はそこを)をgitignoreに指定することを推奨します。 直接Nugetパッケージのdllを管理するのではなく、代わりに次の4ファイルをGit

    NuGetForUnityを使うときの注意点メモ - Qiita
  • 【Unity】R3のForEachAsyncが便利 - Qiita

    今回の内容 「R3」に登場するForEachAsyncが便利なので活用してみよう、という話です。 執筆時の環境 Unity - 2023.1.14f1 R3 - 1.0.4 UniTask - 2.5.3 ForEachAsyncが便利 ForEachAsyncを用いると「Observableを購読しつつ、Observableの完了をawaitできる」という挙動を実現できます。もうちょっとざっくりいえば「Subscribeしつつ、そのSubscribeが終わるのをawaitできるようにする機能」です。 using System.Collections.Generic; using Cysharp.Threading.Tasks; using R3; using UnityEngine; using UnityEngine.UI; public class ForEachSample : M

    【Unity】R3のForEachAsyncが便利 - Qiita
  • 【Unity開発者向け】R3でObservableをTaskに変換して扱う方法一覧 - Qiita

    今回の内容 「R3」がasync/awaitと組み合わせていろいろできてかなり面白いです。 今回はその中でも「ObservableをTaskに変換してawaitする」にフォーカスして機能を紹介します。 (ObservableをTaskに変換するという機能自体は実は家Rx(dotnet/reactive)にありました。それ相当の機能がR3によってUnityでも使えるようになったというお話) 執筆時の環境 Unity - 2023.1.14f1 R3 - 1.0.4 ObservableをTaskに変換してasync/awaitで待つ Observable(Rx/R3におけるメッセージストリームのこと)をTaskに変換し、async/awaitで待ち受けることができます。なおObservableから変換したTaskが完了する条件は原則として「OnCompletedメッセージが発行されたとき」

    【Unity開発者向け】R3でObservableをTaskに変換して扱う方法一覧 - Qiita
  • 【Unity】 R3とUniRxの比較まとめ - Qiita

    前提 「R3」とは、ReactiveExtensionsの最新の環境のC#に合わせて再構築したライブラリです。Unityでは「UniRx」というライブラリがありましたが、大雑把にいえば「UniRxを最新の環境にあわせてリメイク」したものという認識でよいでしょう。 詳しくは別記事でまとめてあります。 次世代Rx「R3」解説 またこの記事執筆時点での環境は次のとおりです。 Unity - 2023.1.14f1 R3 - 1.0.0 ObservableCollections - 2.0.1 NuGetForUnity - 4.0.2 今回の概要 「UniRx」と「R3」の機能の比較、R3での新機能や廃止された機能、UniRxからR3に置き換えるときの代替などについて紹介します。(細かい部分まですべては拾いきれないので、紹介漏れはご容赦ください。またUnity向けでない機能などは省略しています

    【Unity】 R3とUniRxの比較まとめ - Qiita
  • UniTaskでMonoBehaviourのイベントを扱う - Qiita

    今回の内容 UniTaskに搭載されているAsyncTriggerという機能について今回紹介します。 AsyncTriggerの概要 AsyncTriggerとはMonoBehaviourのイベントをUniTask/IUniTaskAsyncEnumerableに変換する機能です。UniRxでいうところのUpdateAsObservableやOnCollisionEnterAsObservableに似た機能です。 使い方 AsyncTriggerは使い方(呼び出し方)が複数あるのでそれぞれ解説します。 A. UniTaskAsyncEnumerableとして扱う(おすすめ) UniTaskAsyncEnumerableとしてイベントを扱うこともできます。 UniRxライクに使いたい場合はこの方法がおすすめです。 使い方としてはMonoBehaviour上でGetAsyncXxxTrigge

    UniTaskでMonoBehaviourのイベントを扱う - Qiita
  • 次世代Rx「R3」解説 - Qiita

    今回の内容 C#向けの新しいReactiveExtensions(Rx)ライブラリ「R3」について、従来のRxとの変更点を紹介します。 R3について リポジトリ R3 開発元はUniTaskやMagicOnionなどを公開しているCysharp社であり、メインの開発者はUniRxの作者でもあるneuecc氏です。 どんなライブラリか 「R3」はReactiveExtensions(Rx)を現代に合わせてより洗練した形に再定義/再実装した、C#用のライブラリです。 というのも、Rxは10年以上前に登場した概念であり、当時はまだ非同期処理に対するベストプラクティスが模索されていたタイミングでした。 そのためRxは「LINQをEventにも適用できる」という側面も持ちつつ「非同期処理にも用いることができる」という2つの側面をもった、少しややこしいライブラリとして登場しました。 そして2024年現

    次世代Rx「R3」解説 - Qiita
  • Visitorパターンで型によるswitchやif判定を消す - Qiita

    今回の話 「Visitorパターン」を使ってswitch文やif文での型分岐を置き換えてみよう、という話です。C#で書いてます。 (サンプルコードはだいぶ端折ってるのであまり突っつかないで下さい) switchやif文のどこが良くないのか 「型の判定によって処理を分岐する」という実装をswitchやifで作ってしまうと、後から構造を変更した際などに問題が起きる可能性があります。 (そもそもオープンクローズド原則違反になってしまう) たとえば「型をみてデータ構造を変換する」といった場合はこの問題を踏みやすいです。 例:データ構造を1:1変換する 「RPGのキャラクター(ジョブ)」という概念があったとしましょう。 これは基底クラスであり、派生先にいくつかのジョブがあってそれぞれで独自のパラメータを保持しています。 /// キャラクターの抽象クラス public abstract class C

    Visitorパターンで型によるswitchやif判定を消す - Qiita
  • 【Unity】複数の非同期処理を直列に実行する機構を作る - Qiita

    はじめに 非同期処理(async/await)を扱っていて、「非同期処理を扱いたいが並行で複数走らないように上手く制御したい」という場面があります。たとえば「リソースをダウンロードしたいが一気に通信せずに1つずつ順番にダウンロードしたい」みたいなシチュエーションです。 (URLリストをダウンロードするんだけど、まとめてダウンロードせずに順番にダウンロードしたい、みたいな) そのような「直列でタスクを実行する機構」を作るとしたときに、どんな作り方ができるのかを紹介します。 前提条件 UniTaskを使うことを想定しています 実装方法 Queueを使う まずは一番最初に思いつくであろう、Queue<T>を使って実装する方法です。 using System; using System.Collections.Generic; using System.Threading; using Cysha

    【Unity】複数の非同期処理を直列に実行する機構を作る - Qiita
  • Unity EditTestでasync/awaitが使いたい - Qiita

    はじめに UnityのEditTestでasync/awaitが使いたい!ということで使い方を調べました。 やり方 大きく分けて2つあります。 [UnityTest] + UniTask.ToCoroutineを使う UnityTestFramework 1.3.8以降を使う [UnityTest] + UniTask.ToCoroutineを使う方法 [UnityTest](コルーチンベースのテスト)にUniTask.ToCoroutineを組み合わせることで、async/awaitをEditTestで利用できるようになります。 using System; using System.Collections; using Cysharp.Threading.Tasks; using NUnit.Framework; using UnityEngine.TestTools; namespac

    Unity EditTestでasync/awaitが使いたい - Qiita
  • Unity BatchModeでテストを実行する - Qiita

    はじめに UnityのBatchMod(Headlessモード)を用いたEditTestの実行でハマったので、備忘録がてらまとめます。 Unity 2022.1.24f1 を使ってます BatchModeでテストを実行する流れ 1.テストを用意する EditorModeTestを用意します。 using System.Collections; using NUnit.Framework; using UnityEngine.TestTools; namespace TORISOUP.Tests { [TestFixture] public class SampleTest { [Test] public void 成功するテスト() { Assert.AreEqual(1, 1); } [UnityTest] public IEnumerator 非同期を含んだテスト() { yield

    Unity BatchModeでテストを実行する - Qiita
  • 【Unity】コルーチンからUniTaskに乗り換えるときに気をつけるべきところ - Qiita

    はじめに 今回はUnityにおけるコルーチンをどうUniTaskに置き換える上で気をつけるべき点を紹介します。 以前、【C#】async/awaitのキャンセル処理まとめ という記事を書いたのですが、この記事は「一般的なC#の話」となっています。 今回はもうちょっと話を「Unity寄り」かつ「初学者向け」にしています。 対象 対象者 Unityのコルーチンは使えるが、async/await,UniTaskはわからないという人 なお、次の話はしません。 async/awaitの文法について(触れません) UniTaskが提供するとコルーチン互換の機能について(触れません) コルーチンからUniTaskへ コルーチンからUniTaskに乗り換える上での注意点 コルーチンからUniTaskに乗り換える上で何を一番気をつけるべきか。それは「処理の寿命」です。コルーチンはMonoBehaviourに

    【Unity】コルーチンからUniTaskに乗り換えるときに気をつけるべきところ - Qiita
  • UniTask 処理のタイムアウトの書き方 まとめ - Qiita

    はじめに 今回はUniTaskを使って「タイムアウト処理」を書く方法を紹介します。 先に結論 TimeoutControllerを使おう 「タイムアウト」とは ここでいうタイムアウトとは、「処理が規定時間内に終わらなかったのでasync/awaitによる非同期処理をキャンセルする」という意味です。 しかし、こちらの記事で「キャンセルには2パターン意味がある」と説明しました。 await自体のキャンセル awaitしている対象が実行している処理自体のキャンセル UniTaskでタイムアウト処理を書くとき、「この書き方だと何がキャンセルされるのか」をしっかり意識しておく必要があります。 UniTaskで「タイムアウト」の実現方法 次のようなコードがあったとします。 using System.Threading; using Cysharp.Threading.Tasks; using Unit

    UniTask 処理のタイムアウトの書き方 まとめ - Qiita
    s_ryuuki
    s_ryuuki 2023/02/11
  • 【C#】async/awaitのキャンセル処理まとめ - Qiita

    はじめに C#におけるasync/awaitを使う上で、絶対に意識しないといけないものは「キャンセル処理」です。 正しく処理をキャンセルしないとメモリリークを起こしたり、デッドロックやデータ不整合を引き起こす可能性があります。 今回はこの「async/awaitにおけるキャンセル処理」について話します。 対象 C#におけるasync/await全般 Task/ValueTask/UniTaskすべてに共通します Unity含む C#のasyc/awaitについてイマイチ自信が持ててない人 先に「結論」 asyncメソッドはCancellationTokenを引数に取るべき await対象が引数にCancellationTokenを要求する場合は省略せずに渡すべき OperationCanceledExceptionの取り扱いを意識するべき 解説 そもそも「キャンセル」とは何を指すのか そも

    【C#】async/awaitのキャンセル処理まとめ - Qiita
    s_ryuuki
    s_ryuuki 2023/02/10
  • 【Unity】「爆発」を作ってモノを吹き飛ばす - Qiita

    はじめに 「Unityゲームを作るならたぶん誰しもが実装したことがあるし、大したことではないから誰も記事まとめたりしない」ような内容をあえて記事にしていきます。 シリーズものになるかは未定。 今回のテーマ 「爆発を作る」 概要 アクションゲームを作っていると、モノによっては周りのオブジェクトを吹き飛ばす「爆発」を作ることになるでしょう。 今回はこれをサクッと作ってみます。 作り方 1.爆発のエフェクトを用意する 爆発のエフェクトを用意します。 ParticleSystemを使って自作してもよいし、AssetStoreから良さそうなのを拾ってくるでもOKです。 今回はParticleSystemで雑に作りました。 このエフェクトをもつGameObjectをExplosionEffectという名前にしてPrefabにしておきます。 2.「Explosion」という名のGameObjectを作

    【Unity】「爆発」を作ってモノを吹き飛ばす - Qiita
  • VRM1.0を使うメモ(URP対応含む) - Qiita

    はじめに VRM1.0を使ってアバターを読み込む時のメモ書きです。 メモ VRMの導入 https://github.com/vrm-c/UniVRM/releases/tag/v0.108.0 に従う。 パッケージマネージャーを使うのが楽。Packages/manifest.jsonのdependenciesに次を追記してEditorを開けば自動インポートが実行される。 ややこしいが、com.vrmc.univrmが0.x系、com.vrmc.vrmが1.x系。混在可能。 // Packages/manifest.json { "dependencies": { // ... "com.vrmc.vrmshaders": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRMShaders#v0.108.0", "com.vrmc.gl

    VRM1.0を使うメモ(URP対応含む) - Qiita
  • Cysharp/ObservableCollectionsの紹介とUnityでの使い方考察 - Qiita

    はじめに 今回のサンプルコードについては次のリポジトリで公開しています。 https://github.com/TORISOUP/ObservableCollections_ViewSamples また今回の内容は2.0.0のバージョンを基準に執筆しました。 ObservableCollectionsとは ObservableCollectionsとは、Cysharp社が提供するMITライセンスのOSSライブラリです。 コレクション(複数データをまとめて扱う機構)をObservableとして扱え、さらにViewとの連動機能も提供しているライブラリとなっています。 文脈としては.NETのライブラリとしてObservableCollection<T>が存在し、それをベースにさらに機能追加ライブラリがこのObservableCollectionsです。 Unityユーザ向けに、すごく簡単にまとめ

    Cysharp/ObservableCollectionsの紹介とUnityでの使い方考察 - Qiita
  • UniTaskでマルチスレッド処理と例外処理 - Qiita

    概要 今回はUniTaskを使ってUnity上でマルチスレッド処理を実行する場合の書き方と例外処理での注意点を紹介します。 UniTaskでマルチスレッド処理を実行する方法 UniTaskでマルチスレッド処理を実行する方法(書き方)は大まかに2パターン存在します。 やり方A. UniTask.RunOnThreadPoolを使う UniTask.RunOnThreadPoolは引数で渡したデリゲートをスレッドプール上で実行し、処理完了後に自動的にUnityメインスレッドに戻ってくれるメソッドです。 using System.Threading; using Cysharp.Threading.Tasks; using UnityEngine; public class MultiThreadSample : MonoBehaviour { // (小ネタ: Start()メソッドはUniT

    UniTaskでマルチスレッド処理と例外処理 - Qiita