原カバンは鞄のお店ではありません。スマートフォン用の表示で見る原カバンは鞄のお店ではありません。Unityを使ったゲーム制作のあれこれを綴っていきます。海の日だからって皆が海に行くとは思うなよ!ということで三連休は部屋に閉じこもる平常運転な休日だったのですが、連休中にやろうと思っていたCutieCircuitのiOS版のリリースはTextureを小さくしてもipaサイズの問題解消とはいかず、いよいよAssetBundleに手をだすしかないことが確定したので心折れて、現実逃避の意味も含めてちょっと違うことにチャレンジしました。JobSystem)というものがあります。JobSystemとは、ざっくり言うと「Unityで並列処理を可能とする機能」です。C#自体にはThread処理機能がありますが、JobSystemではUnity側が内部で使用しているWorkerThreadをC#の(ユーザ側の)スクリプト処理にも開放することで並列処理を可能としている機能なので、Unity側が使いやすいようにAPIを用意してくれていて、C#のThread処理を使うよりはロジックの実装がかなり楽ちん、らしいです。ここら辺の話は以下のリンク先で詳しい解説が記載されています。tsubakit1.hateblo.jpせっかくだから使ってみようロジックの実装がかなり楽、とはいえ、幾つか決まりがあります。JobSystemを実装する場合は、この決まりに沿って処理を構築する必要があります。並列処理で処理する関数(構造体)で使用する領域(メモリ)を事前に確保する入力用の領域に並列処理用関数(構造体)へ渡すデータを設定するSceduleを実行して、JobSystemにジョブを発行依頼Completeで処理が終了まで待つ処理結果を出力用の領域から取得する1.で確保した領域を解放する手順が多くて難しそうな印象を受けるかもしれませんが、一つ一つの作業はそれほど難しくありません。一回覚えれば簡単に作れてしまいます。メモリの確保にはNativeContainerと呼ばれるコンテナを使う必要があることや、処理が終ったら必ずメモリを解放しなければいけないこと、メモリの確保の仕方が何種類かあること、などは慣れないと戸惑うかもしれませんが、最初のうちは「おまじないみたいなもの」として捉えて、とりあえず見よう見まねで実装しておけばよいです。詳しいことは全て先ほどのリンク先に書かれているのでそちらを参考してもらうとして、このJobSystemを使って実際私が作ったものがこちらドーン3つの球体がそれぞれ違う速度で自転と公転をしています。JobSystemを使って自転と公転それぞれの回転をフレーム毎に並列で計算しています。各球体の回転と移動はIJobParallelForTransformを継承したジョブ実行用の構造体にて行います。ジョブを実行すると各球体毎にIJobParallelForTransformのExecute関数が呼ばれます。このExecute関数にはTransformAccessという引数が渡ってくるので、このTransformAccessを経由して球体を移動させます。並列処理側の動作としては1フレーム分の角度回転した移動量を計算するTransformAccessのpositionから現在位置を取得し、移動量分を加算する加算した位置をTransformAccessのpositionに設定するという流れになります。ちなみに、IJobParallelForTransformではTransform.RotateAroundと言ったAPIを使うことができないようなので、行列計算を使い自力で公転の移動量を計算しています。これは以下のリンクのロジックを参考にしました。Accessor;この部分が入力・出力用の領域(メモリ)となります。RotCalStructは自前の回転計算用データで、メイン側で1フレーム毎の回転角度や公転原点を設定し、並列処理側でそれを参照する形で使用しています。自転の計算と移動こちらも公転と同様にIJobParallelForTransformを継承したジョブ実行用の構造体にて行います。}}こちらの場合は、Executeが呼ばれる度にCurrentRotを加算更新しメイン側へ返却、メイン側はそれを保持して次回のコール時に使用して球体を回転させています。メイン側の処理メイン側では前述した回転角度や公転原点を設定のほかに、TransformAccessArrayの配列を定義しています。そこに動作対象となる3つの球体のtransformを設定することで3つの球体それぞれの並列処理(IJobParallelForTransform)が呼ばれる仕組みとなっています。this._planetTransformAccessArray.Dispose();}Update()内にて公転のJob、自転のJobをそれぞれ発行し、Completeで待ち合わせています。各JobはScheduleで発行しますが、実際の動作開始はScheduleBatchedJobsになります。JOB発行⇒次フレーム⇒完了待ち、のほうがより高速化するからです。(・・・と資料に書いてあった)実際に作ってみてJobSystemの実装自体は難しいものではありませんでした、どちらかといえばY軸周りの公転用マトリックスを作るのに時間が掛かったぐらいです。(久しぶりに自力で行列計算した)JobSystemを使えば弾幕系シューティングのように大量のオブジェクトを動かすときなどに効果を発揮すると思います。JobSystemではUnityAPが殆ど使えないので、複雑な動きをさせたい場合などは今回のように自力でロジックを組む必要がありそうで、使いどころの見極めが重要になると感じました。最後に動かす球体を70個ぐらいに増やしたバージョンも作ったので見てやってください。当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。ご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。アクセス解析ツールについて当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。●プライバシーポリシーの変更について当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。修正された最新のプライバシーポリシーは常に本ページにて開示されます。スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。