sound sepher's PASTIME ゲーム開発で思ったことや、趣味などの話を書き綴っていきます。 2022-03-27T05:43:21+09:00 Ashtarte Hatena::Blog hatenablog://blog/10328749687233685844 【Unity】Tile World Creatorまとめ hatenablog://entry/13574176438077028827 2022-03-27T05:43:21+09:00 2022-03-27T06:22:23+09:00 TIle World Creatorについて 概要 タイルの作り方 ブループリント機能 ジェネレータ DSP Dungeon Cellular Automata L-System Maze Random Noise Paint モディファイア Add Expand Shrink Invert Offset Overlap PlayerPosition Select Smooth Subtract 生成用コード SetCustomRandomSeed(int value) ExecuteAllBlueprintLayers() ExecuteAllBuildLayers(true) OnBlue… <ul class="table-of-contents"> <li><a href="#TIle-World-Creatorについて">TIle World Creatorについて</a></li> <li><a href="#概要">概要</a></li> <li><a href="#タイルの作り方">タイルの作り方</a></li> <li><a href="#ブループリント機能">ブループリント機能</a><ul> <li><a href="#ジェネレータ">ジェネレータ</a><ul> <li><a href="#DSP-Dungeon">DSP Dungeon</a></li> <li><a href="#Cellular-Automata">Cellular Automata</a></li> <li><a href="#L-System">L-System</a></li> <li><a href="#Maze">Maze</a></li> <li><a href="#Random-Noise">Random Noise</a></li> <li><a href="#Paint">Paint</a></li> </ul> </li> <li><a href="#モディファイア">モディファイア</a><ul> <li><a href="#Add">Add</a></li> <li><a href="#Expand">Expand</a></li> <li><a href="#Shrink">Shrink</a></li> <li><a href="#Invert">Invert</a></li> <li><a href="#Offset">Offset</a></li> <li><a href="#Overlap">Overlap</a></li> <li><a href="#PlayerPosition">PlayerPosition</a></li> <li><a href="#Select">Select</a></li> <li><a href="#Smooth">Smooth</a></li> <li><a href="#Subtract">Subtract</a></li> </ul> </li> </ul> </li> <li><a href="#生成用コード">生成用コード</a><ul> <li><a href="#SetCustomRandomSeedint-value">SetCustomRandomSeed(int value)</a></li> <li><a href="#ExecuteAllBlueprintLayers">ExecuteAllBlueprintLayers()</a></li> <li><a href="#ExecuteAllBuildLayerstrue">ExecuteAllBuildLayers(true)</a></li> <li><a href="#OnBlueprintLayersCompleteイベント">OnBlueprintLayersCompleteイベント</a></li> <li><a href="#OnBuildLayersCompleteイベント">OnBuildLayersCompleteイベント</a></li> </ul> </li> <li><a href="#バグVersion-312p1---December-09-2021">バグ(Version 3.1.2p1 - December 09, 2021)</a><ul> <li><a href="#Tile-Colliderの南方向当たり判定が反転している">Tile Colliderの南方向当たり判定が反転している</a></li> <li><a href="#Collider-Border-Offsetをマイナス値設定するとコーナーの一部に当たり判定がつかない">Collider Border Offsetをマイナス値設定すると、コーナーの一部に当たり判定がつかない</a></li> </ul> </li> <li><a href="#見落としがちなミス">見落としがちなミス</a><ul> <li><a href="#ランタイムでマップビルド時にCannot-combineとエラー表示される">ランタイムでマップビルド時に「Cannot combine....」とエラー表示される</a></li> <li><a href="#AddressableAssetSystem使用中ビルド環境でのみTileWorldCreatorコンポーネントのアセット参照が切れる">AddressableAssetSystem使用中、ビルド環境でのみTileWorldCreatorコンポーネントのアセット参照が切れる</a></li> </ul> </li> <li><a href="#参考">参考</a></li> </ul> <h3 id="TIle-World-Creatorについて">TIle World <a class="keyword" href="http://d.hatena.ne.jp/keyword/Creator">Creator</a>について</h3> <ul> <li>3Dマップ自動生成機構</li> <li>さいきんバージョンが3にアップデートされて便利になった</li> <li>どんな機構かについては、<a href="https://assetstore.unity.com/packages/tools/level-design/tileworldcreator-3-199383?locale=ja-JP">アセットストア</a>にて</li> <li><a href="https://doorfortyfour.github.io/TileWorldCreator/#/">マニュアルはここ</a></li> <li>この記事は自分用の覚書なのでわかりにくいです</li> </ul> <h3 id="概要">概要</h3> <ul> <li>TileWorldCreator<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>をオブジェクトにつける</li> <li>ブループリントで生成ルールを設定してアセット指定してビルド</li> <li>生成位置は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>をつけた位置を基準に生成</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>につけたアセット名が親オブジェクトになる</li> <li>同シーン内で複数マップを生成したい場合はアセット名を変えること</li> </ul> <h3 id="タイルの作り方">タイルの作り方</h3> <ul> <li>図説したほうがわかりやすいので図説</li> <li>4タイルと6タイルルールがあるが、ここでは4タイルルールを採用</li> </ul> <figure class="figure-image figure-image-fotolife mceNonEditable" title="これだとexteriorとinteriorをTilePreset設定で90度回転させる必要があった"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20220327/20220327050116.png" alt="f:id:Ashtarte:20220327050116p:plain" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="1200" height="508" /></p> <figcaption class="mceEditable">これだとexteriorとinteriorをTilePreset設定で90度回転させる必要があった</figcaption> </figure> <figure class="figure-image figure-image-fotolife mceNonEditable" title="TilePreset設定(改善の余地あり)"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20220327/20220327050540.png" alt="f:id:Ashtarte:20220327050540p:plain" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="443" height="348" /></p> <figcaption class="mceEditable">TilePreset設定(改善の余地あり)</figcaption> </figure> <h3 id="ブループリント機能">ブループリント機能</h3> <h4 id="ジェネレータ">ジェネレータ</h4> <h5 id="DSP-Dungeon"><a class="keyword" href="http://d.hatena.ne.jp/keyword/DSP">DSP</a> Dungeon</h5> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%B0%A5%E9%A5%A4%A5%AF">ローグライク</a>風のダンジョンを生成</li> <li>CollidorWidthは通路の幅</li> </ul> <h5 id="Cellular-Automata">Cellular Automata</h5> <ul> <li>島や大<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%A6%C9%F7">陸風</a>のマップを生成</li> <li>細胞を増殖して消滅するまでの仕組みを利用して実装するやつ</li> </ul> <h5 id="L-System">L-System</h5> <ul> <li>樹枝状に枝分かれする道を生成</li> </ul> <h5 id="Maze">Maze</h5> <ul> <li>そのまんま迷路を作る</li> </ul> <h5 id="Random-Noise">Random Noise</h5> <ul> <li>適当にノイズをちりばめる</li> <li>Expand、Smoothで形を整えると大陸っぽい外観のマップができる</li> </ul> <h5 id="Paint">Paint</h5> <ul> <li>ツクール風に手動でタイルを塗るようにしてマップを描く</li> </ul> <h4 id="モディファイア">モディファイア</h4> <h5 id="Add">Add</h5> <ul> <li>指定レイヤーにこのレイヤーを加算</li> </ul> <h5 id="Expand">Expand</h5> <ul> <li>タイル境界線を外側に1タイルぶん拡張</li> </ul> <h5 id="Shrink">Shrink</h5> <ul> <li>タイル境界線を内側に1タイルぶん縮小</li> </ul> <h5 id="Invert">Invert</h5> <ul> <li>マップ配置を反転</li> <li>通常は外側へ開くが内側に閉じる作りにするのに使う</li> <li>屋内マップを作るのによく使う</li> </ul> <h5 id="Offset">Offset</h5> <ul> <li>配置を指定方向へずらす</li> </ul> <h5 id="Overlap">Overlap</h5> <ul> <li>指定した2つのレイヤーの重複部を結果に出力</li> </ul> <h5 id="PlayerPosition">PlayerPosition</h5> <ul> <li>図を<a class="keyword" href="http://d.hatena.ne.jp/keyword/3x3">3x3</a>に分割して位置を指定すると、そこに1タイルぶん生成される</li> </ul> <h5 id="Select">Select</h5> <ul> <li>ボーダー、エッジなど条件をもとに選択し、そこに結果を出力</li> <li>ルールを使うと特定の位置に配置する</li> </ul> <h5 id="Smooth">Smooth</h5> <ul> <li>入力値ぶん、マップデータをなめらかにする</li> </ul> <h5 id="Subtract">Subtract</h5> <ul> <li>指定レイヤーからこのレイヤーを減算</li> </ul> <h3 id="生成用コード">生成用コード</h3> <h5 id="SetCustomRandomSeedint-value">SetCustomRandomSeed(int <a class="keyword" href="http://d.hatena.ne.jp/keyword/value">value</a>)</h5> <ul> <li>シード値をセット</li> </ul> <h5 id="ExecuteAllBlueprintLayers">ExecuteAllBlueprintLayers()</h5> <ul> <li>ブループリントからデータを生成</li> </ul> <h5 id="ExecuteAllBuildLayerstrue">ExecuteAllBuildLayers(true)</h5> <ul> <li>生成されたデータをもとにビルドを実行</li> <li>ランタイムでも実行可</li> <li>ExecuteAllBlueprintLayersの実行が終わった後に実行するのがベター</li> </ul> <h5 id="OnBlueprintLayersCompleteイベント">OnBlueprintLayersCompleteイベント</h5> <ul> <li>ブループリント生成完了後に発火</li> <li>ここにExecuteAllBuildLayersを実行するメソッドを登録すると良い</li> </ul> <h5 id="OnBuildLayersCompleteイベント">OnBuildLayersCompleteイベント</h5> <ul> <li>ビルド完了後に発火</li> <li>ブループリント生成完了後に実行すること</li> <li>デフォルトでは完了通知はここで出力するしかない</li> </ul> <figure class="figure-image figure-image-fotolife mceNonEditable" title="実行時はこんな感じにやる"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20220327/20220327052447.png" alt="f:id:Ashtarte:20220327052447p:plain" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="588" height="112" /></p> <figcaption class="mceEditable">実行はこんな感じで、完了後にイベント登録解除すること</figcaption> </figure> <h3 id="バグVersion-312p1---December-09-2021">バグ(Version 3.1.2p1 - December 09, 2021)</h3> <h4 id="Tile-Colliderの南方向当たり判定が反転している">Tile Colliderの南方向当たり判定が反転している</h4> <ul> <li>スラッシュ型になっていないとならないのに、バックスラッシュ型になっている</li> <li>要するに、中に入れるけど外に出れない状態</li> <li>これに付随してCollider Border Offsetも反転している</li> <li>修正コードは下記</li> </ul> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20220327/20220327052849.png" alt="f:id:Ashtarte:20220327052849p:plain" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="765" height="642" /></p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="エンバグが起きる可能性もあるので修正は自己責任で"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20220327/20220327053334.png" alt="f:id:Ashtarte:20220327053334p:plain" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="1185" height="910" /></p> <figcaption class="mceEditable"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D0%A5%B0">エンバグ</a>が起きる可能性もあるので修正は自己責任で</figcaption> </figure> <h4 id="Collider-Border-Offsetをマイナス値設定するとコーナーの一部に当たり判定がつかない">Collider Border Offsetをマイナス値設定すると、コーナーの一部に当たり判定がつかない</h4> <ul> <li>これは仕様かなと思う</li> </ul> <figure class="figure-image figure-image-fotolife mceNonEditable" title="赤矢印方向にぶつかると入れてしまう"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20220327/20220327053609.png" alt="f:id:Ashtarte:20220327053609p:plain" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="438" height="460" /></p> <figcaption class="mceEditable">赤矢印方向にぶつかると入れてしまう</figcaption> </figure> <h3 id="見落としがちなミス">見落としがちなミス</h3> <h4 id="ランタイムでマップビルド時にCannot-combineとエラー表示される">ランタイムでマップビルド時に「Cannot combine....」とエラー表示される</h4> <ul> <li>使っているfbxの設定を参照、read/writeフラグを立てる</li> </ul> <h4 id="AddressableAssetSystem使用中ビルド環境でのみTileWorldCreatorコンポーネントのアセット参照が切れる">AddressableAssetSystem使用中、ビルド環境でのみTileWorldCreator<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>のアセット参照が切れる</h4> <ul> <li>おそらくどうしようもないので、他から参照を埋め込むコードを作る</li> </ul> <h3 id="参考">参考</h3> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdoorfortyfour.github.io%2FTileWorldCreator%2F%23%2F" title="TileWorldCreator" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://doorfortyfour.github.io/TileWorldCreator/#/">doorfortyfour.github.io</a></cite></p> Ashtarte 【Unity】ADXまとめ2 hatenablog://entry/13574176438062134639 2022-02-11T06:09:22+09:00 2022-02-11T09:08:12+09:00 ストリームでブロック再生を使う際のメモ 1回目のブロック遷移で無音が大きく発生 ゼロレイテンシーストリーム 無音の秒数 ストリーム(AttachFaderあり) ゼロレイテンシーストリーム(AttachFaderあり) AttachFaderなしのストリームとゼロレイテンシーストリーム 補足 メモリはどうなってるか? ストリーム ゼロレイテンシーストリーム 他のパターンを調べてみた ゼロレで波形ひとつを内部でカットして10個ブロック作成 ゼロレで同シート内にキュー追加、新波形2つを繋げてブロック作成 ゼロレで奇数ブロックをストリームにした(交互に切り替わる) ゼロレで同シート内に新波形1つの新… <ul class="table-of-contents"> <li><a href="#ストリームでブロック再生を使う際のメモ">ストリームでブロック再生を使う際のメモ</a><ul> <li><a href="#1回目のブロック遷移で無音が大きく発生">1回目のブロック遷移で無音が大きく発生</a></li> <li><a href="#ゼロレイテンシーストリーム">ゼロレイテンシーストリーム</a></li> <li><a href="#無音の秒数">無音の秒数</a><ul> <li><a href="#ストリームAttachFaderあり">ストリーム(AttachFaderあり)</a></li> <li><a href="#ゼロレイテンシーストリームAttachFaderあり">ゼロレイテンシーストリーム(AttachFaderあり)</a></li> <li><a href="#AttachFaderなしのストリームとゼロレイテンシーストリーム">AttachFaderなしのストリームとゼロレイテンシーストリーム</a></li> <li><a href="#補足">補足</a></li> </ul> </li> <li><a href="#メモリはどうなってるか">メモリはどうなってるか?</a><ul> <li><a href="#ストリーム">ストリーム</a></li> <li><a href="#ゼロレイテンシーストリーム-1">ゼロレイテンシーストリーム</a></li> </ul> </li> <li><a href="#他のパターンを調べてみた">他のパターンを調べてみた</a><ul> <li><a href="#ゼロレで波形ひとつを内部でカットして10個ブロック作成">ゼロレで波形ひとつを内部でカットして10個ブロック作成</a></li> <li><a href="#ゼロレで同シート内にキュー追加新波形2つを繋げてブロック作成">ゼロレで同シート内にキュー追加、新波形2つを繋げてブロック作成</a></li> <li><a href="#ゼロレで奇数ブロックをストリームにした交互に切り替わる">ゼロレで奇数ブロックをストリームにした(交互に切り替わる)</a></li> <li><a href="#ゼロレで同シート内に新波形1つの新キュー作成">ゼロレで同シート内に新波形1つの新キュー作成</a></li> <li><a href="#ストリームで同シート内に新波形1つの新キュー作成">ストリームで同シート内に新波形1つの新キュー作成</a></li> </ul> </li> <li><a href="#結論予測">結論(予測)</a></li> <li><a href="#所感">所感</a></li> <li><a href="#補足-1">補足</a><ul> <li><a href="#どうしてもAttachFaderをつけた状態でブロック再生の遅延をなくしたい場合">どうしてもAttachFaderをつけた状態でブロック再生の遅延をなくしたい場合</a></li> </ul> </li> </ul> </li> </ul> <h3 id="ストリームでブロック再生を使う際のメモ">ストリームでブロック再生を使う際のメモ</h3> <h4 id="1回目のブロック遷移で無音が大きく発生">1回目のブロック遷移で無音が大きく発生</h4> <ul> <li>PCで確認。おそらくストリーム再生時の遅延の影響と思われる?</li> <li>2回目以降も無音が入る事が多かった(おそらく100%?)</li> </ul> <h4 id="ゼロレイテンシーストリーム">ゼロ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%C6%A5%F3%A5%B7%A1%BC">レイテンシー</a>ストリーム</h4> <ul> <li>1回目のブロック遷移以外はすべてスムーズに繋がった</li> <li>通常のストリームより無音の間隔が短くなった</li> <li>1回目以外は遅延なし</li> </ul> <h4 id="無音の秒数">無音の秒数</h4> <h5 id="ストリームAttachFaderあり">ストリーム(AttachFaderあり)</h5> <ul> <li>1回目のブロック遷移で47ms</li> <li>2回目以降は11ms</li> </ul> <h5 id="ゼロレイテンシーストリームAttachFaderあり">ゼロ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%C6%A5%F3%A5%B7%A1%BC">レイテンシー</a>ストリーム(AttachFaderあり)</h5> <ul> <li>1回目のブロック遷移で17ms</li> <li>2回目以降は遅延なし 0ms</li> <li><span style="color: #ff0000;">メモリ再生でも同様の症状あり</span></li> </ul> <h5 id="AttachFaderなしのストリームとゼロレイテンシーストリーム">AttachFaderなしのストリームとゼロ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%C6%A5%F3%A5%B7%A1%BC">レイテンシー</a>ストリーム</h5> <ul> <li>ストリームはブロック遷移毎に13ms前後、おそらく1フレーム</li> <li>ゼロレは遅延なし</li> </ul> <h5 id="補足">補足</h5> <ul> <li>ゼロレで1回目の遷移用の波形をメモリにしても同じ秒数の遅延が発生</li> </ul> <h4 id="メモリはどうなってるか">メモリはどうなってるか?</h4> <ul> <li>CRI Profilerで確認</li> <li>波形を10個のデータにあらかじめ切って繋げてブロック化した</li> <li>調べたのはAtomMemoryUsage、FS Memory Usage、Streaming Usage</li> <li>色々なパターンを比較した結果、AtomMemoryUsageにのみ影響した</li> </ul> <h5 id="ストリーム">ストリーム</h5> <ul> <li><span class="css-901oao css-16my406 r-1tl8opc r-bcqeeo r-qvutc0">10.97MB</span></li> </ul> <h5 id="ゼロレイテンシーストリーム-1">ゼロ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%C6%A5%F3%A5%B7%A1%BC">レイテンシー</a>ストリーム</h5> <ul> <li><span class="css-901oao css-16my406 r-1tl8opc r-bcqeeo r-qvutc0">11.02MB</span></li> </ul> <h4 id="他のパターンを調べてみた">他のパターンを調べてみた</h4> <h5 id="ゼロレで波形ひとつを内部でカットして10個ブロック作成">ゼロレで波形ひとつを内部でカットして10個ブロック作成</h5> <ul> <li>10.99MB</li> <li><span style="color: #999999;">30KB減った</span></li> </ul> <h5 id="ゼロレで同シート内にキュー追加新波形2つを繋げてブロック作成">ゼロレで同シート内にキュー追加、新波形2つを繋げてブロック作成</h5> <ul> <li>11.03MB</li> <li><span style="color: #999999;">10KB増えた</span></li> </ul> <h5 id="ゼロレで奇数ブロックをストリームにした交互に切り替わる">ゼロレで奇数ブロックをストリームにした(交互に切り替わる)</h5> <ul> <li>11.01MB</li> <li><span style="color: #ff0000;">奇数ブロックに入る瞬間に無音が入る</span></li> <li><span style="color: #999999;">20KB減った</span></li> </ul> <h5 id="ゼロレで同シート内に新波形1つの新キュー作成">ゼロレで同シート内に新波形1つの新キュー作成</h5> <ul> <li>11.03MB</li> <li><span style="color: #999999;">10KB増えた</span></li> </ul> <h5 id="ストリームで同シート内に新波形1つの新キュー作成">ストリームで同シート内に新波形1つの新キュー作成</h5> <ul> <li>11.02MB</li> <li><span style="color: #999999;">もともと10ブロックに分けたキューが状態なので変わりなし</span></li> </ul> <h4 id="結論予測">結論(予測)</h4> <ul> <li>当然だが通常のストリームでは使用メモリは増えない</li> <li>ただしストリームでブロック再生するとブロック遷移時に無音が発生</li> <li>ゼロレ波形を使っても初回1度は微妙に無音の発生する<span style="color: #673ab7;">(AttachFaderが原因だった)</span></li> <li>ゼロレ波形を使ったキューをひとつ増やすと10~20KB使用メモリ増</li> <li>ゼロレ波形を複数使ったキューはそのぶんメモリ増(増値は一定でない?)</li> <li><span style="color: #ff0000;">AtomExPlayerでAttachFaderを使うとブロック遷移で無音が発生する<br /><span style="color: #999999;">ストリーム再生のブロック遷移で遅延が発生するのは変わらない、無音の間隔は違うが</span></span></li> </ul> <h4 id="所感">所感</h4> <ul> <li><span style="color: #dd830c;">1波形につき10~20KB程度なら100波形で1~2MB程度になる?</span><br />iPhone8(2GB)以下の古い<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>をターゲットにしないのであれば誤差か?</li> <li>PC向けに作るならストリームではなくゼロ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%C6%A5%F3%A5%B7%A1%BC">レイテンシー</a>のほうが良さそう</li> <li>ストリーム再生は<span style="color: #ff0000;">キュー内の波形毎の再生頭すべてに影響があるらしい</span></li> <li><span style="color: #1464b3;">メモリを気にするなら1波形内でブロック再生を組んだ方が良いかも??</span></li> <li>試作での確認なので、本番で作り進めたら印象が変わる可能性がある</li> </ul> <h4 id="補足-1">補足</h4> <h5 id="どうしてもAttachFaderをつけた状態でブロック再生の遅延をなくしたい場合">どうしてもAttachFaderをつけた状態でブロック再生の遅延をなくしたい場合</h5> <ul> <li>下記図のように、キューの頭に無音のブロックを作る</li> <li>ブロックはAtomEditorのインスペクターで2ミリ秒まで縮小可</li> <li>再生直後に約19ミリ秒の遅延が発生するが、ブロックはスムーズ再生にされる</li> <li>ビート単位で作る場合はすこし面倒になりそうではあるが…</li> </ul> <p align="center"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20220211/20220211085258.png" alt="f:id:Ashtarte:20220211085258p:plain" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="620" height="369" /></p> <p> </p> Ashtarte 【Unity】ADXまとめ hatenablog://entry/13574176438060057923 2022-02-04T21:32:43+09:00 2022-02-11T16:27:29+09:00 ADX 使用条件 仕様まとめ 使い方 インタラクティブ再生 ブロック再生 スイッチ セレクタ 便利機能 カテゴリ アクショントラック Timeline拡張 REACTでダッキング 3Dポジショニング コールバック コードからクロスフェード UniTaskでCriAtomCueSheetをawaitさせる 気になった点 補足 参考 <ul class="table-of-contents"> <li><a href="#ADX">ADX</a></li> <li><a href="#使用条件">使用条件</a></li> <li><a href="#仕様まとめ">仕様まとめ </a></li> <li><a href="#使い方">使い方</a></li> <li><a href="#インタラクティブ再生">インタラクティブ再生</a><ul> <li><a href="#ブロック再生">ブロック再生</a></li> <li><a href="#スイッチ">スイッチ</a></li> <li><a href="#セレクタ">セレクタ</a></li> </ul> </li> <li><a href="#便利機能">便利機能</a><ul> <li><a href="#カテゴリ">カテゴリ</a></li> <li><a href="#アクショントラック">アクショントラック</a></li> <li><a href="#Timeline拡張">Timeline拡張</a></li> <li><a href="#REACTでダッキング">REACTでダッキング</a></li> <li><a href="#3Dポジショニング">3Dポジショニング</a></li> <li><a href="#コールバック">コールバック</a></li> <li><a href="#コードからクロスフェード">コードからクロスフェード</a></li> <li><a href="#UniTaskでCriAtomCueSheetをawaitさせる">UniTaskでCriAtomCueSheetをawaitさせる</a></li> </ul> </li> <li><a href="#気になった点">気になった点</a></li> <li><a href="#補足">補足</a></li> <li><a href="#参考">参考</a></li> </ul> <h3 id="ADX"><a class="keyword" href="http://d.hatena.ne.jp/keyword/ADX">ADX</a></h3> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/CRIWARE">CRIWARE</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%A6%A5%F3%A5%C9">サウンド</a>システム、Unity用<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>あり</li> <li>販売権が自分および年商/年収1000万円以下の場合、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ADX">ADX</a> LEをフリーで利用可</li> <li>使い方は<a href="https://game.criware.jp/learn/tutorial/unity/">公式チュートリアルを参照</a></li> <li>この記事は <a class="keyword" href="http://d.hatena.ne.jp/keyword/ADX">ADX</a> LE / AtomCraftLE ver 3.46.02 時の情報</li> </ul> <h3 id="使用条件">使用条件</h3> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/ADX">ADX</a> LEはPC、<a class="keyword" href="http://d.hatena.ne.jp/keyword/MacOS">MacOS</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPhone">iPhone</a>向け。<a href="https://medium.com/@ichijo/cri-adx%E3%81%AE%E6%96%99%E9%87%91%E3%81%8C%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%81%BE%E3%81%A8%E3%82%81%E3%81%9F-%E7%A7%BB%E7%B1%8D%E7%89%88-68c8c7bb9597">詳細はこちら</a><br />UnityPC限定で年収1000万オーバーの場合は<a href="https://assetstore.unity.com/packages/tools/audio/cri-adx2-unity-plugin-assetstore-100086?locale=ja-JP">10000円程のUnity用ADX</a>を購入でOK</li> <li>コンソールでリリースしたい場合は製品版 <a class="keyword" href="http://d.hatena.ne.jp/keyword/ADX">ADX</a> を利用すること。<br />価格はDLのみなら売上0.95%~1%を<a class="keyword" href="http://d.hatena.ne.jp/keyword/CRIWARE">CRIWARE</a>に支払う。<br /><span style="color: #999999;">※買い切り条件もあるが日本では1機種12万本基準、2000円なら240万円??<br /></span></li> </ul> <h3 id="仕様まとめ">仕様まとめ<a href="https://game.criware.jp/learn/tutorial/unity/"> </a></h3> <ul> <li>CriAtom <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>は実行中のシーンにひとつしか配置できない。<br />マルチシーンで複数配置すると、最後にロードした CriAtom に上書きされる</li> <li>Timeline に対応させるには、<span style="color: #2196f3;">ProjectSettings→Player→Scripting Define Symbols </span>に<span style="color: #d32f2f;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/CRIWARE">CRIWARE</a>_TIMELINE_1_OR_NEWER </span>を追加</li> </ul> <h3 id="使い方">使い方</h3> <ul> <li><span style="color: #dd830c;">CriAtom.AddCueSheet、AddCueSheetAsync </span>でキューシートを追加<br /><span style="color: #ff5252;">CriAtom.RemoveCueSheet </span>でキューシートを削除</li> <li>キューシートのロード状態の確認は <span style="color: #1464b3;">CueSheetsAreLoading </span>で確認可</li> <li><span style="color: #00796b;">CriAtom.SetCateoryVolume </span>でカテゴリの音量を変更</li> <li><span style="color: #673ab7;">CriAtomExPlayer </span>に Play、Stop、Pause、Resume など一通りの機能がある<br />フェード諸々もここから実行</li> <li>CriAtomExPlayer <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>の <span style="color: #d32f2f;">UpdateAll メソッドで、弄った値を反映</span></li> </ul> <h3 id="インタラクティブ再生"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%E9%A5%AF%A5%C6%A5%A3%A5%D6">インタラクティブ</a>再生</h3> <h4 id="ブロック再生">ブロック再生</h4> <p>キューのブロック設定をコード側で指定するとそこから再生できる機能。<a href="https://game.criware.jp/manual/adx2_tool/latest/criatom_tools_atomcraft_sequence_block.html">詳細</a></p> <ol> <li><a href="https://game.criware.jp/learn/tutorial/atomcraft/atomcraft_jokyu_25/">ADX2のブロック再生機能のチュートリアル</a>でブロック機能を学ぶ</li> <li><a href="https://revsd.hatenablog.com/entry/2020/04/05/213338">同人サークルreverse snareさんの記事</a>で実際の使い方を参照</li> <li>コードでは再生時に CriAtomExPlayback 取得後、<span style="color: #dd830c;">SetBlockIndex(index)</span></li> </ol> <h4 id="スイッチ">スイッチ</h4> <p>キュー「スイッチ」はプロジェクトツリー「ゲーム変数」を参照する機能。<a href="https://game.criware.jp/manual/adx2_tool/latest/criatom_tools_atomcraft_game_variable_for_switch_cue.html?highlight=%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81">詳細</a></p> <ul> <li>複数トラックを仕込んだキューで変数値毎に再生するトラックを変える</li> <li>ただしスイッチでは再生途中で切り替えるということはできない(らしい)</li> <li>コード上では <span style="color: #dd830c;">CriAtom.SetGameVariable(id, <a class="keyword" href="http://d.hatena.ne.jp/keyword/value">value</a>)、GetGameVariable</span></li> </ul> <h4 id="セレクタ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%EC%A5%AF%A5%BF">セレクタ</a></h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%EC%A5%AF%A5%BF">セレクタ</a>を切り替えるとキュー内で再生されるトラックが切り替わる機能。<a href="https://game.criware.jp/manual/adx2_tool/latest/criatom_tools_atomcraft_switch_track_by_selector.html">詳細</a></p> <ol> <li>プロジェクトツリーの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%EC%A5%AF%A5%BF">セレクタ</a>フォルダからラベルを作成</li> <li>キューシートで右クリック、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%EC%A5%AF%A5%BF">セレクタ</a>によるトラック遷移の作成」</li> <li>トラックに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%EC%A5%AF%A5%BF">セレクタ</a>登録</li> <li><a href="https://game.criware.jp/learn/tutorial/atomcraft/atomcraft_jokyu_26/">詳細はこちら</a></li> <li>CriAtomSource で使う場合は <span style="color: #dd830c;">CriAtomExPlayer.SetSelecterLabal</span></li> </ol> <h3 id="便利機能">便利機能</h3> <h4 id="カテゴリ">カテゴリ</h4> <p>複数の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%A6%A5%F3%A5%C9">サウンド</a>をまとめて制御する機能。<a href="https://game.criware.jp/manual/native/adx2/latest/criatom_feat_category.html">詳細</a></p> <ul> <li>カテゴリグループの下にカテゴリを最大16個まで設定可</li> <li>キュー上ではグループ毎にカテゴリ登録可</li> <li>例えばマスターボリューム用グループと、内部制御用グループでわける、など</li> </ul> <h4 id="アクショントラック">アクショントラック</h4> <p>アクショントラックは他のキューのパラメータを調整できたりする便利機能。<a href="https://game.criware.jp/manual/adx2_tool/latest/criatom_tools_atomcraft_action.html?highlight=%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3">詳細</a></p> <ul> <li>再生パラメータアクションでボリュームやピッチ等を変更できる</li> <li>これはキューの他、<span style="color: #ff0000;">カテゴリグループの調整にも使える</span></li> </ul> <h4 id="Timeline拡張">Timeline拡張</h4> <ul> <li>TimelineでCriAtomSource<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>が使える!</li> <li>ピッチ、ボリューム、AISAC等が利用できるので、SE作りで活躍しそう</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/DAW">DAW</a>でパラメータを調整するイメージでMAできるのでは?(まだ試してない)</li> </ul> <h4 id="REACTでダッキング">REACTで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%AD%A5%F3%A5%B0">ダッキング</a></h4> <ul> <li>こちらの<a href="https://game.criware.jp/learn/tutorial/atomcraft/atomcraft_jokyu_23/">チュートリアルを参照</a>のこと</li> </ul> <h4 id="3Dポジショニング">3Dポジショニング</h4> <ul> <li>AtomListener がシーンにない状態で3Dポジションのキュー再生で鳴ってしまう問題。<br />これは事前に disable 状態にした AtomListener <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>を配置しておくと解決。</li> <li>複数のリスナーを配置して、特定のリスナーを手っ取り早く有効化する方法は、<br />まず全リスナーの ActivateListenerOnEnable を true にしておく。<br />その後、聞かせたいリスナーを enable にしてやればよい。<br />若干乱暴だが、最後に enable になったリスナーが有効化される。</li> <li><span style="color: #673ab7;">距離は 1m = 1unity 単位</span>。<br />内部的には再生状態が続くが、距離減衰の最大をカメラ範囲距離に設定すれば、<br />カメラ範囲から離れたら音が聞こえなくなる。</li> </ul> <h4 id="コールバック">コールバック</h4> <ol> <li><span style="color: #1464b3;">CriAtomExSequencer.OnCallback += Callback</span> といった感じで書く<br />Start() あたりで登録しておくと良さそう</li> <li><span style="color: #00796b;">private void Callback(ref CriAtomExSequencer.CriAtomExSequenceEventInfo info)</span><br />といった形のメソッドを作って、シーケンスイベント情報を取得</li> <li>CriAtomExSequenceEventInfo はIDやタグなどの情報がまとまっている</li> <li>あとは勝手にコールバックが発火するので好きに中身をつくるとよい</li> <li>ビート同期も同じような感じ。<a href="https://qiita.com/tatmos/items/a27d27218f1233cd2781">詳細はこちら</a></li> </ol> <h4 id="コードからクロスフェード">コードから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%ED%A5%B9%A5%D5%A5%A7%A1%BC%A5%C9">クロスフェード</a></h4> <p><a href="https://game.criware.jp/manual/adx2_tool/latest/craftv2_tips_performance_xfade.html">AtomCraft上でもある程度設定できる</a>が、コードから設定した方が使いやすいか?</p> <ol> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%ED%A5%B9%A5%D5%A5%A7%A1%BC%A5%C9">クロスフェード</a>を使用したいカテゴリは発音数を<span style="color: #ff0000;">2音</span>にしておく</li> <li>CriAtomExPlayer.<a href="https://game.criware.jp/manual/unity_plugin/latest/contents/classCriAtomExPlayer.html#a9710ffc80cf4ba18e60441923bc34c38"><span style="color: #1464b3;">AttachFader()</span></a> でフェーダーをプレイヤーに<span style="color: #ff0000;">必ずセット</span><br /><span style="color: #999999;">フェーダーをセットすると<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%ED%A5%B9%A5%D5%A5%A7%A1%BC%A5%C9">クロスフェード</a>に対応(擬似的に発音数1音化)</span></li> <li>CriAtomExPlayer.<a href="https://game.criware.jp/manual/unity_plugin/latest/contents/classCriAtomExPlayer.html#a0513c23718b72b3ba0175cebb50175a3"><span style="color: #00796b;">SetFadeInTime(時間ms)</span></a> でフェードイン時間のセット</li> <li>CriAtomExPlayer.<a href="https://game.criware.jp/manual/unity_plugin/latest/contents/classCriAtomExPlayer.html#a81601ad41745f08b21b213964aa6f38e"><span style="color: #286f2c;">SetFadeOutTime(時間ms)</span></a> でフェードアウト時間のセット</li> <li>CriAtomExPlayer.<a href="https://game.criware.jp/manual/unity_plugin/latest/contents/classCriAtomExPlayer.html#abc919718da3b68a997da76a7c86a750b"><span style="color: #dd830c;">SetFadeOutEndDelay(時間ms)</span></a> で再生終了後の破棄時間のセット</li> <li>上記をセットした状態で <span style="color: #cc00cc;">CriAtomExPlayer.Play()</span> か <span style="color: #0000cc;">Stop()</span> を実行</li> </ol> <blockquote> <p><span style="color: #999999;">AttachFader() は ExPlayer を作成した後、いちど実行するだけでOK。</span></p> <p><span style="color: #999999;">その後は Stop() 実行前に SetFadeOutTime() を実行すると次の Stop() 実行時に反映。</span></p> <p><span style="color: #999999;">ただし、変更状態が維持されるので必要毎にセット必須。</span></p> <p><span style="color: #999999;">ちなみに</span> <a href="https://game.criware.jp/manual/unity_plugin/latest/contents/classCriAtomExPlayer.html#a26b836ff38a9c0e25a8b0fb2ef68c7ec">DetachFader()</a> <span style="color: #999999;">でフェーダー状態を解除可。</span></p> </blockquote> <h4 id="UniTaskでCriAtomCueSheetをawaitさせる">UniTaskでCriAtomCueSheetをawaitさせる</h4> <ul> <li>UniTask に対応させる方法は<a href="https://qiita.com/Takaaki_Ichijo/items/dcce0fe27a4fc9808a1c">こちら</a>(まだ UniRx 時代の解説だけど)<br />一條さんのコードは古いバージョン用のコード。<br />該当コンスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タは削除された(neueccさん談)らしく、下記のように修正されたし</li> </ul> <p align="center"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20220204/20220204232238.png" alt="f:id:Ashtarte:20220204232238p:plain" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="897" height="364" /></p> <h3 id="気になった点">気になった点</h3> <ul> <li>Unity2021.2.7f1 + ver2.37.13LEでは AtomBrowser でエラーしまくる</li> <li>原因は <span class="css-901oao css-16my406 r-1tl8opc r-bcqeeo r-qvutc0">CriAtomWindowPrefs.cs の36行目で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%E4%C2%D0%A5%D1%A5%B9">絶対パス</a>を取得しているため。<br />解決するにはプロジェクトフォルダ以下の Assets/... に直す必要あり<br /></span></li> </ul> <figure class="figure-image figure-image-fotolife mceNonEditable" title="動けばいいや、という良くない例"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20220205/20220205000742.png" alt="f:id:Ashtarte:20220205000742p:plain" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="925" height="26" /></p> <figcaption class="mceEditable">動けばいいや、という良くない例</figcaption> </figure> <h3 id="補足">補足</h3> <ul> <li><span style="color: #286f2c;">CriAtomExPlayer.SetCue(acbファイル名, キュー名)</span> の<span style="color: #ff0000;">acbファイルは null でもOK</span></li> <li><a href="https://ashtarte.hateblo.jp/entry/2022/02/11/060922">ゼロレイテンシーストリームとストリームのブロック再生についてはこちら</a></li> </ul> <h3 id="参考">参考</h3> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgame.criware.jp%2Fmanual%2Funity_plugin%2Flatest%2Fcontents%2Findex.html" title="CRIWARE Unity Plugin Manual: CRIWARE Unity Plug-inマニュアル" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"></cite><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgame.criware.jp%2Flearn%2Ftutorial%2Funity%2F" title="CRI ADX2(Unity) - CRIWARE for Games" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgame.criware.jp%2Fmanual%2Fadx2_tool%2Flatest%2Fcriatom_tools_atomcraft.html" title="CRI ADX2 Tools マニュアル: CRI Atom Craft" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"></cite><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2FTakaaki_Ichijo%2Fitems%2Fdcce0fe27a4fc9808a1c" title="ADX2 for Unityを他のアセットと一緒に使う(DOTween, UniTask, DoozyUI) - Qiita" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"></cite><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgame.criware.jp%2Flearn%2Ftutorial%2Fatomcraft%2Fatomcraft_jokyu_25%2F" title="上級編25 ブロック再生 - CRIWARE for Games" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"></cite><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Frevsd.hatenablog.com%2Fentry%2F2020%2F04%2F05%2F213338" title="ADX2LEでインタラクティブミュージック(横遷移)の実装 - 同人ゲームサークル reverse snare 開発ブログ" class="embed-card embed-blogcard" scrolling="no" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"></cite><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmedium.com%2F%40ichijo%2Fcri-adx%25E3%2581%25AE%25E6%2596%2599%25E9%2587%2591%25E3%2581%258C%25E3%2582%2588%25E3%2581%258F%25E3%2582%258F%25E3%2581%258B%25E3%2582%2589%25E3%2581%25AA%25E3%2581%2584%25E3%2581%25AE%25E3%2581%25A7%25E3%2581%25BE%25E3%2581%25A8%25E3%2582%2581%25E3%2581%259F-%25E7%25A7%25BB%25E7%25B1%258D%25E7%2589%2588-68c8c7bb9597" title="CRI ADXの料金がよくわからないのでまとめた(移籍版)" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"></cite><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fashtarte.hateblo.jp%2Fentry%2F2022%2F02%2F11%2F060922" title="【Unity】ADXまとめ2 - sound sepher's PASTIME" class="embed-card embed-blogcard" scrolling="no" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://ashtarte.hateblo.jp/entry/2022/02/11/060922">ashtarte.hateblo.jp</a></cite></p> <p> </p> Ashtarte 【Unity】ゲームパッド対応アセット「InControl」メモ hatenablog://entry/13574176438053325496 2022-01-16T16:19:46+09:00 2022-01-16T17:13:01+09:00 InControl 目的 内容 PlayerActionSetの保存方法 AddDefaultBindingメソッドで複数キーバインドできる キー入力受付 設定のリセット 参考 <ul class="table-of-contents"> <li><a href="#InControl">InControl</a></li> <li><a href="#目的">目的</a></li> <li><a href="#内容">内容</a><ul> <li><a href="#PlayerActionSetの保存方法">PlayerActionSetの保存方法</a></li> <li><a href="#AddDefaultBindingメソッドで複数キーバインドできる">AddDefaultBindingメソッドで複数キーバインドできる</a></li> <li><a href="#キー入力受付">キー入力受付</a></li> <li><a href="#設定のリセット">設定のリセット</a></li> </ul> </li> <li><a href="#参考">参考</a></li> </ul> <h3 id="InControl">InControl</h3> <ul> <li>Unityのアセット、<a href="https://assetstore.unity.com/packages/tools/input-management/incontrol-14695?locale=ja-JP">Incontrol</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%E0%A5%D1%A5%C3%A5%C9">ゲームパッド</a>など<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>に対応できるがコード主体、かつリファレンスが英語</li> <li><a href="https://www.gallantgames.com/pages/incontrol-introduction">公式サイトはこちら</a></li> </ul> <h3 id="目的">目的</h3> <ul> <li>この記事では他のサイトに掲載されてない細かい使い方を紹介</li> </ul> <h3 id="内容">内容</h3> <ul> <li>この解説の <span style="color: #d32f2f;">actions </span>は <span style="color: #1464b3;">PlayerActionSet </span>を継承したクラスの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>とする</li> </ul> <h4 id="PlayerActionSetの保存方法">PlayerActionSetの保存方法</h4> <ul> <li><span style="color: #d32f2f;">Save() </span>メソッドの返り値 string 文字列がセーブデータ扱いになる</li> <li>この文字列を <span style="color: #d32f2f;">Load(文字列) </span>として実行すると反映される</li> </ul> <h4 id="AddDefaultBindingメソッドで複数キーバインドできる">AddDefaultBindingメソッドで複数<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AD%A1%BC%A5%D0%A5%A4%A5%F3%A5%C9">キーバインド</a>できる</h4> <ul> <li><span style="color: #1464b3;">actions.Enter.AddDefaultBinding(InControl.Key.Z);</span><br /><span style="color: #1464b3;">actions.Enter.AddDefaultBinding(InputControlType.Action2);</span><br />のような感じで複数差し込める、これは Bindings リストに Add される</li> <li>ちなみに BindingSource は Bindings リストの要素ひとつ分</li> </ul> <h4 id="キー入力受付">キー入力受付</h4> <ul> <li> <p><span style="color: #1464b3;">bindingSource = action.Bindings[0];</span><br /><span style="color: #1464b3;">action.ListenForBindingReplacing(bindingSource);</span><br />のようなイメージ。新規でキー入力待ちメソッドを作って組み合わせる</p> </li> <li> <p>Bindings リストは AddDefaultBinding を使った順番に登録されている</p> </li> </ul> <h4 id="設定のリセット">設定のリセット</h4> <ul> <li><span style="color: #1464b3;">actions.Reset() </span>のように Reset メソッドを使うと初期状態に戻る</li> </ul> <h3 id="参考">参考</h3> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fakatana.games%2Fblog%2Ftips%2Funity%2F1015%2F" title="Unityの入出力管理ツール InControl で簡単にゲームコントローラーを設定 | AKATANA GAMES" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fkan-kikuchi.hatenablog.com%2Fentry%2FInControl" title="Xbox360&amp;OneやPS3&amp;4など様々なコントローラーへの対応が簡単に出来るInControl【Unity】【アセット】 - (:3[kanのメモ帳]" class="embed-card embed-blogcard" scrolling="no" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe></p> Ashtarte 【Unity】あとからタグ名を変更する方法 hatenablog://entry/26006613769461666 2021-05-29T07:38:22+09:00 2021-05-29T07:56:26+09:00 目的 方法 問題 Unityで使用中のシーンにあるタグを書き換える Unityで開いていないシーンのタグを書き換える 結論 <ul class="table-of-contents"> <li><a href="#目的">目的</a></li> <li><a href="#方法">方法</a></li> <li><a href="#問題">問題</a><ul> <li><a href="#Unityで使用中のシーンにあるタグを書き換える">Unityで使用中のシーンにあるタグを書き換える</a></li> <li><a href="#Unityで開いていないシーンのタグを書き換える">Unityで開いていないシーンのタグを書き換える</a></li> </ul> </li> <li><a href="#結論">結論</a></li> </ul> <h3 id="目的">目的</h3> <ul> <li>あとからタグ名が気に入らない…となっても設定済で、削除するとタグ位置のソートもできないし終端に追加されるのが不満<br /> <ul> <li>ちなみに標準では書き換えもソートもできない仕様</li> <li>おそらくタグをIDではなくstringなどで直接登録してるんだと思われる</li> </ul> </li> </ul> <h3 id="方法">方法</h3> <ul> <li>Unityプロジェクトのルート、「Project Settings」フォルダの「TagManager.asset」を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%AD%A5%B9%A5%C8%A5%A8%A5%C7%A5%A3%A5%BF">テキストエディタ</a>で開いて直接書き換える</li> </ul> <h3 id="問題">問題</h3> <h5 id="Unityで使用中のシーンにあるタグを書き換える">Unityで使用中のシーンにあるタグを書き換える</h5> <ul> <li>タグが消滅して「Undefined」になる → 再設定必須</li> </ul> <h5 id="Unityで開いていないシーンのタグを書き換える">Unityで開いていないシーンのタグを書き換える</h5> <ul> <li>そのシーンを開いたときに、該当するタグを自動で終端に追加する</li> </ul> <h3 id="結論">結論</h3> <ul> <li>最終的には手動もしくはコードで再設定することになる</li> <li>根本的な解決はできなさそう…?</li> </ul> Ashtarte 【Unity】フレームカウント厳禁! 代替策の Time.deltaTime hatenablog://entry/26006613764143002 2021-05-15T20:33:47+09:00 2021-05-15T20:36:09+09:00 フレーム数でカウント禁止の理由 Unityでタイムカウントを行うときは Time.deltaTime 使用例 自動回復するエネルギー 目標タイムまでカウント 他の代替方法 参考 <ul class="table-of-contents"> <li><a href="#フレーム数でカウント禁止の理由">フレーム数でカウント禁止の理由</a></li> <li><a href="#Unityでタイムカウントを行うときは-TimedeltaTime">Unityでタイムカウントを行うときは Time.deltaTime</a></li> <li><a href="#使用例">使用例</a><ul> <li><a href="#自動回復するエネルギー">自動回復するエネルギー</a></li> <li><a href="#目標タイムまでカウント">目標タイムまでカウント</a></li> </ul> </li> <li><a href="#他の代替方法">他の代替方法</a></li> <li><a href="#参考">参考</a></li> </ul> <h3 id="フレーム数でカウント禁止の理由">フレーム数でカウント禁止の理由</h3> <ul> <li>1秒60Hzで固定だった時代は今は昔</li> <li>PCはモニターのリフレッシュレートその他でフレーム数が変動する<br /> <ul> <li>モニターのリフレッシュレートが110Hzなら1秒110フレームになる、など</li> <li><span style="color: #d32f2f;">60カウントで1秒のはずが、約0.55秒しかカウントされてない! となる</span></li> </ul> </li> </ul> <h3 id="Unityでタイムカウントを行うときは-TimedeltaTime">Unityでタイムカウントを行うときは Time.deltaTime</h3> <ul> <li><strong><span style="color: #d32f2f;">Time.deltaTime は1フレーム更新にかかった秒数を返す</span></strong></li> <li>Update() 内で deltaTime を加算し続けて値が1になった=1秒</li> </ul> <h3 id="使用例">使用例</h3> <h5 id="自動回復するエネルギー">自動回復するエネルギー</h5> <ul> <li>Update() で 現在エネルギー += 1秒に回復するエネルギー * Time.deltaTime</li> </ul> <h5 id="目標タイムまでカウント">目標タイムまでカウント</h5> <ul> <li>Update() で if (count &lt; 目標タイム) count += Time.deltaTime</li> </ul> <h3 id="他の代替方法">他の代替方法</h3> <ul> <li>コルーチンの WaitForSeconds(待機系)</li> <li>UniTask の async/await、UniTask.WaitForSeconds(待機系)</li> <li>UniRx の Observable.Timer(遅延実行系)</li> <li>DOTween の DOVirtual.DelayedCall(遅延実行系)</li> </ul> <h3 id="参考">参考</h3> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2FtoRisouP%2Fitems%2F930100e25e666494fcd6" title="【Unity】Time.deltaTimeの正しい使い方わかってる?適当に掛ければいいてもんじゃない! - Qiita" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://qiita.com/toRisouP/items/930100e25e666494fcd6">qiita.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.shibuya24.info%2Fentry%2F2016%2F11%2F10%2F092000" title="DOTweenに用意されている遅延実行が便利 - 渋谷ほととぎす通信" class="embed-card embed-blogcard" scrolling="no" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://www.shibuya24.info/entry/2016/11/10/092000">www.shibuya24.info</a></cite></p> Ashtarte 【Unity】向きを基準に必要なベクトルを求める方法 hatenablog://entry/26006613764066974 2021-05-15T17:41:08+09:00 2021-05-15T20:12:25+09:00 必要な理由 方法 例えばオブジェクトの前方を基準をして特定の角度を求るとき 例 注意点 参考 <ul class="table-of-contents"> <li><a href="#必要な理由">必要な理由</a></li> <li><a href="#方法">方法</a><ul> <li><a href="#例えばオブジェクトの前方を基準をして特定の角度を求るとき">例えばオブジェクトの前方を基準をして特定の角度を求るとき</a></li> <li><a href="#例">例</a></li> </ul> </li> <li><a href="#注意点">注意点</a></li> <li><a href="#参考">参考</a></li> </ul> <h3 id="必要な理由">必要な理由</h3> <ul> <li>オブジェクトの向きから特定の角度に弾を飛ばしたい</li> <li>他にも歩く方向なんかを求めたい</li> </ul> <h3 id="方法">方法</h3> <h5 id="例えばオブジェクトの前方を基準をして特定の角度を求るとき">例えばオブジェクトの前方を基準をして特定の角度を求るとき</h5> <ul> <li>まず、Quaternion.AngleAxis(角度, 軸) を使う<br /> <ul> <li><span style="color: #999999;">Unityマニュアルでは AngleAxis(angle, axis)</span></li> </ul> </li> <li>それにオブジェクトの前方を掛ける<br /> <ul> <li><span style="color: #999999;">angleAxis * transform.forward など</span></li> </ul> </li> <li>これにスピードを掛ければAddForceなんかで飛ばしたい方向に飛ばせる</li> </ul> <h5 id="例">例</h5> <p align="center"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20210515/20210515180533.png" alt="f:id:Ashtarte:20210515180533p:plain" title="" class="hatena-fotolife" itemprop="image" /></p> <h3 id="注意点">注意点</h3> <ul> <li><strong><span style="color: #d32f2f;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%A9%A1%BC%A5%BF%A5%CB%A5%AA%A5%F3">クォータニオン</a>とベクトルを掛けるときは、【<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%A9%A1%BC%A5%BF%A5%CB%A5%AA%A5%F3">クォータニオン</a> * ベクトル】順が必須</span></strong></li> <li>ベクトル * <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%A9%A1%BC%A5%BF%A5%CB%A5%AA%A5%F3">クォータニオン</a> では計算できない。エラーする</li> </ul> <h3 id="参考">参考</h3> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgomafrontier.com%2Funity%2F1880" title="【Unity】キャラクターの前方3方向にオブジェクトを飛ばす方法 | ゴマちゃんフロンティア" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://gomafrontier.com/unity/1880">gomafrontier.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fspi8823.hatenablog.com%2Fentry%2F2015%2F05%2F31%2F025903" title="UnityでRotation(Quaternion)をうまく使いたい - お米 is ライス" class="embed-card embed-blogcard" scrolling="no" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://spi8823.hatenablog.com/entry/2015/05/31/025903">spi8823.hatenablog.com</a></cite></p> Ashtarte 【Unity】Timelineをツクールのアニメーションエディタ的に使う hatenablog://entry/26006613715808395 2021-04-13T23:28:53+09:00 2021-04-14T00:01:55+09:00 目的 Timelineとは 基本的な使い方 いいところ Timelineを使いまわす方法 注意点 参考 <ul class="table-of-contents"> <li><a href="#目的">目的</a></li> <li><a href="#Timelineとは">Timelineとは</a></li> <li><a href="#基本的な使い方">基本的な使い方</a></li> <li><a href="#いいところ">いいところ</a></li> <li><a href="#Timelineを使いまわす方法">Timelineを使いまわす方法</a></li> <li><a href="#注意点">注意点</a></li> <li><a href="#参考">参考</a></li> </ul> <h3 id="目的">目的</h3> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/RPG%A5%C4%A5%AF%A1%BC%A5%EB">RPGツクール</a>でいうアニメーションエディタをUnityで代替するには?</li> <li>プログラミングでバトルエフェクトを作るのは確認しづらい。やりにくい。<br />…ので、Unityエディタ上で再生しつつ作りこめる仕様はないか探した</li> <li>すると、Timelineという機能が見つかった</li> </ul> <h3 id="Timelineとは">Timelineとは</h3> <ul> <li>Unityエディタ上でオブジェクトやパーティクルをTimelineに配置して、<br />キーフレームを打つことで動画のように演出を作れるという機能</li> <li>リアルタイムに演出確認できるというところがポイント</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を連携させることも可能(らしいがまだ未確認)</li> </ul> <h3 id="基本的な使い方">基本的な使い方</h3> <ol> <li>Projectウィンドウで右クリックしてTimelineアセットを作成</li> <li>Hierarchyに上記Timelineアセットを置くとTimeline<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>が配置される</li> <li>Timeline<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>からTimelineウィンドウを開く</li> <li>ここにHierarchy上に配置したオブジェクトやパーティクルを並べる</li> <li>再生するとエディタ上で実行!</li> </ol> <h3 id="いいところ">いいところ</h3> <ul> <li>エディタ上でリアルタイムに演出の確認ができる</li> <li>後述する方法を使えばどこででも再生できる</li> <li>AnimationTrackを作成してオブジェクトをアタッチすると、<br />そのオブジェクトにキーフレームを打ってアニメーションできる<br /> <ul> <li>アニメーションはAnimatorでデータを持つ</li> </ul> </li> </ul> <p align="center"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20210413/20210413230639.png" alt="f:id:Ashtarte:20210413230639p:plain" title="" class="hatena-fotolife" itemprop="image" /></p> <h3 id="Timelineを使いまわす方法">Timelineを使いまわす方法</h3> <ul> <li>Timeline<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>は単体ではプレハブ化できないが、<br />Timelineアセットを再びHierarchyに投げれば同じ機能が使える<br /> <ul> <li>ただしトラックを消すと同じTimelineに直で影響(オーバーライドはない)</li> </ul> </li> <li>単体でプレハブ化はできないが、<br /><strong><span style="color: #ff0000;">親オブジェクトの子にTimelineを置いた場合、そのままプレハブ化できる</span></strong></li> <li>Timelineで使うオブジェクトやパーティクルを、<br />この親オブジェクトの下に配置してプレハブ化すればリンクが切れない</li> <li>あとはこの親オブジェクトプレハブを良い感じに使いまわせばOK<br /> <ul> <li>Instantiateして再生終了したらDestroyとか</li> <li>親プレハブのpositionを変えれば指定した場所でTimelineを実行できる</li> <li>この使い方をする場合、パーティクルなどのPlay on Awakeはオフにしよう</li> </ul> </li> </ul> <h3 id="注意点">注意点</h3> <ul> <li>Timelineはシーン上に配置したオブジェクトしか使えない<br /> <ul> <li>Project上からTimelineにアタッチしても表示されない</li> <li>この点から、親オブジェクトの子にTimelineと素材を配置するのは有効</li> </ul> </li> </ul> <h3 id="参考">参考</h3> <ul> <li>Timelineを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>から再生する方法<br /> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Flearn.unity.com%2Ftutorial%2Fstarting-timeline-through-a-c-script-2019-3-jp%3Flanguage%3Dja%235fb64433edbc2a00224e18c1" title="C# スクリプトを使って Timeline をやってみよう - 2019.3 - Unity Learn" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"></cite></p> </li> <li>パーティクルのタイミングをTimelineで制御する</li> <li> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Ftsubakit1.hateblo.jp%2Fentry%2F2017%2F10%2F22%2F001708" title="【Unity】パーティクルのタイミングをTimelineで制御する - テラシュールブログ" class="embed-card embed-blogcard" scrolling="no" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"></cite>Timelineを使ってエフェクトを作る<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Fddorange%2Fitems%2F0870b2310a9dfb377b42" title="【Unity】Timelineを使ってエフェクトを作ってみた - Qiita" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe></p> </li> <li>Timelineを使ってオブジェクトを動かす方法<br /> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmiyagame.net%2Ftimeline-obj%2F%23index_id11" title="【Unity】Timeline(タイムライン)を使ってオブジェクトを動かす方法 | Unishar-ユニシャー" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"></cite></p> </li> </ul> Ashtarte 【Unity】NaniNovel (ver 1.15.1) で NewInputSystem 使用時のトラブルシューティング hatenablog://entry/26006613710375103 2021-03-30T21:59:44+09:00 2021-03-31T00:37:47+09:00 問題 解決方法 補足 メモ 参考 <ul class="table-of-contents"> <li><a href="#問題">問題</a></li> <li><a href="#解決方法">解決方法</a></li> <li><a href="#補足"> 補足</a></li> <li><a href="#メモ">メモ</a></li> <li><a href="#参考">参考</a></li> </ul> <h3 id="問題">問題</h3> <ul> <li>NaniNovel 1.15.1 で NewInputSystem をインストールして使おうとすると、<br />Naninovel\Runtime\Input\InputSampler.cs 183行・185行めがエラーする</li> <li>どうやら inputAction.WasPressdThisFrame() というメソッドがないらしい</li> </ul> <h3 id="解決方法">解決方法</h3> <ul> <li>下記のように修正(旧バージョンの記述を移植すると解決する)</li> </ul> <p align="center"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20210330/20210330214524.png" alt="f:id:Ashtarte:20210330214524p:plain" title="" class="hatena-fotolife" itemprop="image" /></p> <h3 id="補足"> 補足</h3> <ul> <li>NaniNovel では NewInputSystem 使用時も旧InputSystemを使っている(らしい)<br />そのため、ProjectSettings → Player → OtherSettings → Configuration の<br />Active Input Handling は <strong>Both</strong> にしておくこと</li> <li>InputSystem は ProjectSetting → NaniNovel  Input を下記設定にすると有効になる</li> </ul> <p align="center"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20210330/20210330215746.png" alt="f:id:Ashtarte:20210330215746p:plain" title="" class="hatena-fotolife" itemprop="image" /></p> <ul> <li>InputSystem のキーマップ設定 InputActions は仮に下記のようにしておく。</li> </ul> <p align="center"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20210330/20210330215324.png" alt="f:id:Ashtarte:20210330215324p:plain" title="" class="hatena-fotolife" itemprop="image" /></p> <h3 id="メモ">メモ</h3> <ul> <li>Unity2019から2021にプロジェクトをアップデートする際、<br />NaniNovelがメニューに表示されなくなったため、手動で移植することに…</li> <li>消えたメニューはNaniNovelをアプデ後、<strong>エラー全修正で復活した<br /></strong> <ul> <li><span style="color: #999999;">新規プロジェクトにコピペだとArborが正常に動作しなくなった…</span><br /><span style="color: #999999;">Unityプロジェクト丸ごとアップデートしたら、素直に手動でエラーを直そう!</span></li> </ul> </li> </ul> <h3 id="参考">参考</h3> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fnaninovel.com%2Fja%2Fguide%2Finput-processing.html%23%25E5%2585%25A5%25E5%258A%259B%25E3%2582%25B7%25E3%2582%25B9%25E3%2583%2586%25E3%2583%25A0" title="入力処理 | Naninovel" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://naninovel.com/ja/guide/input-processing.html#%E5%85%A5%E5%8A%9B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0">naninovel.com</a></cite></p> Ashtarte 【音楽】Sound Forge Pro 10 が起動できない場合の対処法 hatenablog://entry/26006613697979088 2021-03-01T19:44:32+09:00 2021-03-31T10:23:30+09:00 レジストリをいじります。下記を実行すると逆におかしくなる可能性も否定できないため、自己責任でどうぞ。 問題 解決方法 引用元 <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%C8%A5%EA">レジストリ</a>をいじります。<br />下記を実行すると逆におかしくなる可能性も否定できないため、<strong><span style="color: #d32f2f;">自己責任でどうぞ</span></strong>。</p> <ul class="table-of-contents"> <li><a href="#問題">問題</a></li> <li><a href="#解決方法">解決方法</a></li> <li><a href="#引用元">引用元</a></li> </ul> <h4 id="問題">問題</h4> <ul> <li>SF10を起動するとライセンスチェックで「高い権限が必要です」と表示されて以降進まない</li> <li>管理者権限で起動すると実行できるが、ドラッグ&ドロップできない</li> </ul> <h4 id="解決方法">解決方法</h4> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%D7%A5%ED%A5%F3%A5%D7%A5%C8">コマンドプロンプト</a>を起動して、下記コマンドを打ち込んで実行</li> </ul> <blockquote> <p>whoami /user</p> </blockquote> <ul> <li> これがあなたのユーザーSID。メモしておく</li> <li>regeditを起動 <span style="color: #999999;">※<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%C8%A5%EA">レジストリ</a>エディタです</span></li> <li>下記の <span style="color: #1464b3;">[バージョン番号]</span> フォルダを右クリックで削除</li> </ul> <blockquote> <p><span class="css-901oao css-16my406 r-1tl8opc r-bcqeeo r-qvutc0">HKEY_USERS&gt; [user SID] _Classes&gt; VirtualStore&gt; MACHINE&gt; SOFTWARE&gt; Wow6432Node&gt; <a class="keyword" href="http://d.hatena.ne.jp/keyword/Sony">Sony</a> Creative Software&gt; <a class="keyword" href="http://d.hatena.ne.jp/keyword/Sound%20Forge">Sound Forge</a> [ProまたはAudioStudio]&gt; [バージョン番号]</span> </p> </blockquote> <p> 以上</p> <h4 id="引用元">引用元</h4> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fy6a7cqghvxahxhff3mkd555bbu--www-magix-info.translate.goog%2Fus%2Fforum%2Fdrag-and-drop-not-working--1198058%2F" title="Drag and drop not working?" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://y6a7cqghvxahxhff3mkd555bbu--www-magix-info.translate.goog/us/forum/drag-and-drop-not-working--1198058/">y6a7cqghvxahxhff3mkd555bbu--www-magix-info.translate.goog</a></cite></p> Ashtarte 【Unity】EasySaveについて hatenablog://entry/26006613647231382 2020-10-31T13:52:29+09:00 2020-10-31T14:02:18+09:00 検証結果 サポート外の型のEasySave対応方法 参照と直接保存どちらでも設定可 参照保存時の挙動 List<ScriptableObject>を直接保存 List<ScriptableObject>がフィールドとして登録してあるクラスを保存 セーブ・ロード方法 セーブ ロード 保存しやすい構造(案) 参考 <ul class="table-of-contents"> <li><a href="#検証結果">検証結果</a><ul> <li><a href="#サポート外の型のEasySave対応方法">サポート外の型のEasySave対応方法</a></li> <li><a href="#参照と直接保存どちらでも設定可">参照と直接保存どちらでも設定可</a></li> <li><a href="#参照保存時の挙動">参照保存時の挙動</a><ul> <li><a href="#ListScriptableObjectを直接保存">List&lt;ScriptableObject&gt;を直接保存</a></li> <li><a href="#ListScriptableObjectがフィールドとして登録してあるクラスを保存">List&lt;ScriptableObject&gt;がフィールドとして登録してあるクラスを保存</a></li> </ul> </li> <li><a href="#セーブロード方法">セーブ・ロード方法</a><ul> <li><a href="#セーブ">セーブ</a></li> <li><a href="#ロード">ロード</a></li> </ul> </li> <li><a href="#保存しやすい構造案">保存しやすい構造(案)</a></li> </ul> </li> <li><a href="#参考">参考</a></li> </ul> <h3 id="検証結果">検証結果</h3> <h4 id="サポート外の型のEasySave対応方法">サポート外の型のEasySave対応方法</h4> <ul> <li>Window → Easy Save 3 → Types で型を検索して登録<br /> <ul> <li>保存するフィールドとプロパティも選択可</li> </ul> </li> </ul> <h4 id="参照と直接保存どちらでも設定可">参照と直接保存どちらでも設定可</h4> <ul> <li>Settings → Advanced Settings → Serialise Unity Object fields の設定を変更<br /> <ul> <li>By Ref で参照ID保存</li> <li>By <a class="keyword" href="http://d.hatena.ne.jp/keyword/Value">Value</a> で直接データ保存<br /> <ul> <li>ただし By <a class="keyword" href="http://d.hatena.ne.jp/keyword/Value">Value</a> は丸ごと保存するのでサイズが超大になる</li> <li>めんどくさがらずに By Ref にしておくのが安パイ</li> </ul> </li> </ul> </li> </ul> <h4 id="参照保存時の挙動">参照保存時の挙動</h4> <ul> <li>この場合は new を使わず参照渡しで繋げたデータ、という意味</li> </ul> <h5 id="ListScriptableObjectを直接保存">List&lt;ScriptableObject&gt;を直接保存</h5> <ul> <li><span style="color: #d32f2f;">参照登録済の ScriptableObject のフィールド</span>が保存される</li> <li>「リストに何が参照されているか」は保存されない</li> </ul> <h5 id="ListScriptableObjectがフィールドとして登録してあるクラスを保存">List&lt;ScriptableObject&gt;がフィールドとして登録してあるクラスを保存</h5> <ul> <li><span style="color: #d32f2f;">「リストに何が参照されているか」</span>が保存される</li> <li>参照登録済みの ScriptableObject のパラメータは保存されない</li> </ul> <h4 id="セーブロード方法">セーブ・ロード方法</h4> <h5 id="セーブ">セーブ</h5> <ul> <li><span style="color: #1464b3;">ES3.Save("キー", 保存したいデータ, "ファイル名")</span></li> </ul> <h5 id="ロード">ロード</h5> <ul> <li><span style="color: #1464b3;">ES3.Load("キー", "ファイル名")</span></li> </ul> <h4 id="保存しやすい構造案">保存しやすい構造(案)</h4> <ol> <li><strong>シングルトンでデータベースを作って親DBに List&lt;ScriptableObject&gt; を並べる</strong><br /> <ul> <li><span style="color: #666666;">実際は List&lt;Skill&gt; とか List&lt;Item&gt; とかそんな感じ</span></li> <li><span style="color: #666666;">↑の場合は Skill と Item が ScriptableObject を継承したクラス(アセット)</span></li> </ul> </li> <li><strong>親DBクラスをセーブ</strong><br /> <ul> <li><span style="color: #666666;">リストに何が登録されているか(参照)を保存</span></li> </ul> </li> <li><strong>リストをひとつずつセーブ</strong><br /> <ul> <li><span style="color: #666666;">リストデータのフィールドを保存</span></li> </ul> </li> <li><strong>もし非サポートの型を使ってるなら型(クラス)を Type で検索して登録</strong></li> </ol> <h3 id="参考">参考</h3> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="Easy Save 3 Documentation - The Complete Save and Load Solution for Unity" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.moodkie.com%2Fproduct%2Feasy-save-3%2F" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://docs.moodkie.com/product/easy-save-3/">docs.moodkie.com</a></cite></p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="簡単にセーブ&ロード&amp;暗号化が実装できるEasy Save【Unity】【アセット】【Easy Save】 - (:3[kanのメモ帳]" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fkan-kikuchi.hatenablog.com%2Fentry%2FEasySave" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://kan-kikuchi.hatenablog.com/entry/EasySave">kan-kikuchi.hatenablog.com</a></cite></p> Ashtarte 【Unity】TextMeshProのlocalScale拡大縮小でテキストが一瞬文字化けする hatenablog://entry/26006613637617487 2020-10-07T12:17:45+09:00 2020-10-07T20:24:42+09:00 問題 原因 解決方法 補足 なぜ localScale をゼロにするか 別案 <ul class="table-of-contents"> <li><a href="#問題">問題</a></li> <li><a href="#原因">原因</a></li> <li><a href="#解決方法">解決方法</a></li> <li><a href="#補足">補足</a><ul> <li><a href="#なぜ-localScale-をゼロにするか">なぜ localScale をゼロにするか</a></li> <li><a href="#別案">別案</a></li> </ul> </li> </ul> <h3 id="問題">問題</h3> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%D6%A5%B8">サブジ</a>ェクトの通り、<br />TextMeshPro で localScale が (0, 0, 1) などの値から (1, 1, 1) に一瞬で拡大するとき、<br />フォントは適切に設置されているのに、なぜか少しの間「■■■■」と文字化けして表示される</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Canvas">Canvas</a> 下にオブジェクトを仕込んで、その下に TextMeshPro を配置した際、<br />Object をエディタ上で直接上記の値に設定すると同様の事象が発生</li> </ul> <h3 id="原因">原因</h3> <ul> <li>localScale.y の値をゼロから1にした瞬間に文字化けするらしい<br /> <ul> <li>文字化けするということは認識されなくなったということだし、<br />localScale.yをゼロにするとテクスチャが解放されてしまうのだろうか??</li> </ul> </li> <li>localScale.x の値をゼロから1に一瞬で変えても何も起きない、問題ない</li> </ul> <h3 id="解決方法">解決方法</h3> <ul> <li>localScale.yの値はゼロにしない。new Vector3(0, 1, 0) だとか、<br />そんな感じに <span style="color: #ff0000;">y だけ 0 にしない</span>形で不可視状態にすれば、<br />元に戻したとき普通に表示される。</li> </ul> <h3 id="補足">補足</h3> <h4 id="なぜ-localScale-をゼロにするか">なぜ localScale をゼロにするか</h4> <ul> <li>uGUI にはオブジェクトをアクティブ・非アクティブで切り替えて表示・非表示を操作すると、<br />非アクティブ時に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%D9%A1%BC%A5%B8%A5%B3%A5%EC%A5%AF%A5%B7%A5%E7%A5%F3">ガベージコレクション</a>が走ってしまう問題があるため。</li> </ul> <h4 id="別案">別案</h4> <ul> <li>Image などの uGUI のオブジェクトには、<br />CanvasRenderer という <a class="keyword" href="http://d.hatena.ne.jp/keyword/Canvas">Canvas</a> にアクセスするための<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>が必ず実装されてる。<br />これの SetAlpha をいじれば似たような処理はできるけど、<br />localScale は親オブジェクトごと非表示にできるのが強みか?</li> <li>このあたり、処理速度にどの程度の差があるかまではチェックしてないが、<br />そういう方法もあるみたい、ということでメモしておく。</li> </ul> Ashtarte 【Unity】データコピーの注意点(参照型と値型について) hatenablog://entry/26006613622325225 2020-09-01T05:15:32+09:00 2020-09-01T05:31:58+09:00 起きたトラブル 参照型と値型の違い 解決方法 補足 <ul class="table-of-contents"> <li><a href="#起きたトラブル">起きたトラブル</a></li> <li><a href="#参照型と値型の違い">参照型と値型の違い</a></li> <li><a href="#解決方法">解決方法</a><ul> <li><a href="#補足">補足</a></li> </ul> </li> </ul> <p>起きた問題と、教わった解決方法をメモ。万が一、忘れたとき用に。</p> <h3 id="起きたトラブル">起きたトラブル</h3> <ul> <li>自作クラス型の変数に、別の変数を代入したあと、<br />変数中にある公開変数の値を変更したら、元の変数の値まで変わってしまった</li> <li>イメージ的には、<span style="color: #1464b3;">ActorSkill skill = originalSkill</span> で、<span style="color: #1464b3;">skill.sp = 10</span> としたら、<br /><span style="color: #1464b3;">originalSkill.sp</span> の値まで 10 になってしまった風味</li> </ul> <h3 id="参照型と値型の違い">参照型と値型の違い</h3> <ul> <li><span style="color: #1464b3;">int num = originalNum</span> なら数値がそれぞれ別扱いになる。<br />が、クラス型になると変わる。<br /> <ul> <li><span style="color: #1464b3;">Transform tr = originalTr</span> としたあと <span style="color: #1464b3;">tr.position</span> を変えると、<br />オリジナルのポジションも変わるのがまさにそれ(参照型でコピー)</li> </ul> </li> </ul> <h3 id="解決方法">解決方法</h3> <ol> <li>クラスにコンスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タを作って、そこにコピー元を代入できるようにしたのち、<br />コンスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タ中でそれぞれの値を移し替える。<br /><br /><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20200901/20200901050435.png" alt="f:id:Ashtarte:20200901050435p:plain" title="f:id:Ashtarte:20200901050435p:plain" class="hatena-fotolife" itemprop="image" /><br /><br /></li> <li>あとは <span style="color: #1464b3;">ActorSkillOption skillOption = new ActorSkillOption(originalSkillOption);</span><br />とすれば参照コピーではなく、新規コピーとして<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>が生成される。</li> </ol> <h4 id="補足">補足</h4> <ul> <li>その他、適宜 <span style="color: #1464b3;">Clone</span> メソッドなりを作っておくと、<br /><span style="color: #1464b3;">ActorSkillOption skillOption = originalSkillOption.Clone()</span> として実行できて便利。</li> <li>上記のサンプルで、もしコンスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タがない状態で <span style="color: #1464b3;">Clone()</span> するとすべての値がゼロ(何も存在しない)<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>が複製される。<br />その場合は <span style="color: #1464b3;">Clone()</span> にコンスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タで書いたコピー用のコードを書くこと。</li> </ul> Ashtarte 【Unity】画像圧縮とロード方法 hatenablog://entry/26006613618086454 2020-08-22T12:34:10+09:00 2020-09-01T05:30:50+09:00 PC向けはBC7 DirectX用圧縮テクスチャ規格、DXT BC7 iOS/Android向けはASTC4x4 AddressableAsset における組み込みについて シーン紐づけの場合 同アセットを別オブジェクトに直接紐づけ アセット紐づけの場合 現時点での運用案 なぜタグを使わないか <ul class="table-of-contents"> <li><a href="#PC向けはBC7">PC向けはBC7</a><ul> <li><a href="#DirectX用圧縮テクスチャ規格DXT">DirectX用圧縮テクスチャ規格、DXT</a></li> <li><a href="#BC7">BC7</a></li> </ul> </li> <li><a href="#iOSAndroid向けはASTC4x4">iOS/Android向けはASTC4x4</a></li> <li><a href="#AddressableAsset-における組み込みについて">AddressableAsset における組み込みについて</a><ul> <li><a href="#シーン紐づけの場合">シーン紐づけの場合</a><ul> <li><a href="#同アセットを別オブジェクトに直接紐づけ">同アセットを別オブジェクトに直接紐づけ</a></li> </ul> </li> <li><a href="#アセット紐づけの場合">アセット紐づけの場合</a></li> <li><a href="#現時点での運用案">現時点での運用案</a><ul> <li><a href="#なぜタグを使わないか">なぜタグを使わないか</a></li> </ul> </li> </ul> </li> </ul> <h3 id="PC向けはBC7">PC向けはBC7</h3> <h4 id="DirectX用圧縮テクスチャ規格DXT"><a class="keyword" href="http://d.hatena.ne.jp/keyword/DirectX">DirectX</a>用圧縮テクスチャ規格、DXT</h4> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="DirectX 11の圧縮フォーマットBC1~BC7について(前編) | OPTPiX Labs Blog" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.webtech.co.jp%2Fblog%2Foptpix_labs%2Fformat%2F6993%2F" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://www.webtech.co.jp/blog/optpix_labs/format/6993/">www.webtech.co.jp<br /></a></cite></p> <h4 id="BC7">BC7</h4> <p>試した限り、最も画像がキレイで、サイズもそこそこ圧縮された(公称 1/4)。<br />2048x2048px の 12MB の画像を RGBA Compressed BC7 UNorn で圧縮すると、<br />4MBまで落ちた。</p> <h3 id="iOSAndroid向けはASTC4x4"><a class="keyword" href="http://d.hatena.ne.jp/keyword/iOS">iOS</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>向けはASTC4x4</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/iPhone6">iPhone6</a>以降、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>はここ最近のものなら大体行ける形式らしい。</p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="AndroidでASTCを使える条件 - LIGHT11" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Flight11.hatenadiary.com%2Fentry%2F2018%2F10%2F29%2F232630" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://light11.hatenadiary.com/entry/2018/10/29/232630">light11.hatenadiary.com</a></cite></p> <h3 id="AddressableAsset-における組み込みについて">AddressableAsset における組み込みについて</h3> <h4 id="シーン紐づけの場合">シーン紐づけの場合</h4> <h5 id="同アセットを別オブジェクトに直接紐づけ">同アセットを別オブジェクトに直接紐づけ</h5> <ul> <li>bundle圧縮後にサイズは変わらない。ひとつの画像を参照。</li> <li>直接紐づけというのは、直接画像をアタッチするという意味。<br /> <ul> <li>間接的紐づけは AssetReference を使う。</li> <li>直接だと同じbundleにまるごと格納される。<br />間接では別のGroupから該当アセットをロードしないと表示されない。</li> </ul> </li> </ul> <h4 id="アセット紐づけの場合">アセット紐づけの場合</h4> <ul> <li>試してはいないが、恐らくシーンと同様の扱いになると思われる。<br /> <ul> <li>そうでないと依存性がおかしくなる。</li> <li>ちなみにアセットに直接別アセットをアタッチすると丸ごとパックされる。<br />それが嫌ならAssetReferenceでバラバラに切り離す。<br /> <ul> <li>AssetReferenceは参照指定するだけなので結構めんどい。<br />アドレスIDを文字列で記入するか、位置を指定するか。</li> </ul> </li> </ul> </li> </ul> <h4 id="現時点での運用案">現時点での運用案</h4> <ul> <li>依存性がプロファイラに表示されないが、<br />シーンに「使うアセットを直接紐付けるオブジェクト」を配置して、<br />そこにデータをまとめて、シーンロード時に丸ごと自動ロード。<br /> <ul> <li>シーンはAddressableからLoadSceneAsyncでロードする。</li> <li>後からInstantiateしないなら直接配置してもOK。</li> </ul> </li> <li>データベースに必ず使うアセットを直接アタッチして、関連シーンで丸ごとロード。<br /> <ul> <li>これでアタッチした変数から直接 Instantiate できる。<br />AddressableAsset を Resources に近い使い方で運用できるように。</li> </ul> </li> </ul> <h5 id="なぜタグを使わないか">なぜタグを使わないか</h5> <ul> <li>タグを使って関連アセットを丸ごとロードする場合、<br />どういう順で格納されるか不明な AsyncOperationHandle リストにロードされる。</li> <li>どこに何が入ってるか探すのが面倒。</li> <li>シーン破棄で丸ごと消える InstantiateAsync を使うなら良いけど、<br />自分でオブジェクトを実体化して破棄する際にかなり面倒。<br /> <ul> <li>プリロードしておくと、Instantiate と Destroy が使える。<br />※プリロードすると InstantiateAsync が必要なくなる。</li> </ul> </li> <li>欠点としては、自分で管理することになるのでミスする可能性が上がる<br /> <ul> <li>まぁAddress文字列を直接書き込むよりはよい気はする</li> </ul> </li> <li>あくまでも自己流なので保証できません。</li> </ul> Ashtarte 【開発】ハードウェアの記録媒体メモ hatenablog://entry/26006613617106918 2020-08-20T12:08:14+09:00 2020-08-21T12:06:25+09:00 記憶媒体の種類 SSD eMMC HDD SDカード USBメモリ まとめ 補足 <ul class="table-of-contents"> <li><a href="#記憶媒体の種類">記憶媒体の種類</a><ul> <li><a href="#SSD">SSD</a></li> <li><a href="#eMMC">eMMC</a></li> <li><a href="#HDD">HDD</a></li> <li><a href="#SDカード">SDカード</a></li> <li><a href="#USBメモリ">USBメモリ</a></li> </ul> </li> <li><a href="#まとめ">まとめ</a></li> <li><a href="#補足">補足</a></li> </ul> <p>ざっくり調べたことをまとめておく。自作ゲーのデータのロード時間計算用。<br />間違ってる可能性もあるので、あくまでも自分用ということでよろしくです。</p> <h3 id="記憶媒体の種類"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%AD%B2%B1%C7%DE%C2%CE">記憶媒体</a>の種類</h3> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a></li> <li>eMMC</li> <li>HDD</li> <li>SDカード(SD/<a class="keyword" href="http://d.hatena.ne.jp/keyword/microSD">microSD</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDHC">SDHC</a>/microSDHC、SDXC/microSDXC)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a></li> </ul> <h4 id="SSD"><a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a></h4> <ul> <li>大きく PCIe3.0 x NVMe、SATA3.0 にわかれ、NVMeの方が7倍くらい早いらしい</li> <li>それでも媒体の中では最も早い</li> <li>規格的には前者が1500~3000MB/s、後者がMAX600MB/sくらい、実際はもう少し遅い</li> </ul> <h4 id="eMMC">eMMC</h4> <ul> <li>スイッチに採用されてる</li> <li>eMMC5.0規格では転送速度400MB/sに対応</li> </ul> <h4 id="HDD">HDD</h4> <ul> <li>転送速度100~150MB/s程度。</li> </ul> <h4 id="SDカード">SDカード</h4> <ul> <li>規格により転送速度に大きな違いあり<br /> <ul> <li>スピードクラス Class2~10(数値が最低速度で、単位はMB/s)</li> <li>UHSスピードクラス Class1、3(最低10MB/s、30MB/s)<br /> <ul> <li>UHS-Iなら理論値104MB/s、IIなら312MB/s</li> </ul> </li> </ul> </li> <li>スイッチはUHS-Iまで、IIは非対応<br /> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%F3%A5%C6%A5%F3%A5%C9%A1%BC">ニンテンドー</a>ストアで販売されているSDカードは <span style="color: #3366ff;"><strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/Samsung">Samsung</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/microSD">microSD</a> EVO Plus </strong><span style="color: #333333;">(UHS-I対応)</span></span></li> </ul> </li> </ul> <h4 id="USBメモリ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a></h4> <ul> <li>2.0、3.0(3.1 gen1)、3.1 gen2の3種ある<br /> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/USB2.0">USB2.0</a>は60MB/s(最大転送速度)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/USB3.1">USB3.1</a> gen1は625MB/s</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/USB3.1">USB3.1</a> gen2は1.25GB/s</li> </ul> </li> <li>そんなに早かったっけ? <a class="keyword" href="http://d.hatena.ne.jp/keyword/USB3.1">USB3.1</a>だとUSBの6倍くらい早いんだけど…最大計算だから?</li> </ul> <h3 id="まとめ">まとめ</h3> <p><strong>NVMe <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a> &gt; <a class="keyword" href="http://d.hatena.ne.jp/keyword/USB3.1">USB3.1</a> gen2 &gt; <a class="keyword" href="http://d.hatena.ne.jp/keyword/USB3.1">USB3.1</a> gen1 ≒ SATA3.0 <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a> &gt; eMMC &gt; SD UHS-II &gt; HDD ≒ SD UHS-I &lt; <a class="keyword" href="http://d.hatena.ne.jp/keyword/USB2.0">USB2.0</a> …か?</strong></p> <p>とりあえずHDDの速度を基準にすると、最近の規格ならあらかた上回ってる感…で、あってる?</p> <h3 id="補足">補足</h3> <p>実際は例えば<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>のOSが入ったドライブがターゲットだった場合、<br />他のIO処理を行ってる可能性もあるので、速度は遅くなる可能性が高い。</p> <p>また、常時トップスピードが出るわけでもなく、下限が出るわけでもないので、<br />おおよその速度として計算するのが良さそう。</p> Ashtarte 【Unity】NaniNovel を UniTask V2 に対応させる hatenablog://entry/26006613608717684 2020-08-02T14:23:13+09:00 2020-08-03T00:54:58+09:00 注意 確認バージョン 方法 v1.12 で対応されるとのこと <ul class="table-of-contents"> <li><a href="#注意">注意</a></li> <li><a href="#確認バージョン">確認バージョン</a></li> <li><a href="#方法">方法</a></li> <li><a href="#v112-で対応されるとのこと">v1.12 で対応されるとのこと</a></li> </ul> <h3 id="注意">注意</h3> <p>直接 NaniNovel のコードを書き換えるので、アップデートのたびに修正する必要がある。<br />正常に動作しない可能性もあるので自己責任でどうぞ。</p> <h3 id="確認バージョン">確認バージョン</h3> <ul> <li>Unity 2019.4.6f1</li> <li>NaniNovel 1.11.0</li> </ul> <h3 id="方法">方法</h3> <ol> <li>UniTask V2 をインストール</li> <li>NaniNovel をインストール(順序はどちらでもOK)</li> <li>すると、999個以上のエラーが出る</li> <li><span style="color: #673ab7;">Naninovel\ThirdParty\UniRx\</span> を削除</li> <li><em>Naninovel\Editor\Elringus.Naninovel.Editor.asmdef</em><br /><em>Naninovel\Runtime\Elringus.Naninovel.Runtime.asmdef</em><br />の <span style="color: #1464b3;">Assenbly Definition References に UniTask を追加</span></li> <li>VisualStudio(ツールは何でもよい)で<br />「編集 → 検索と置換 → フォルダを指定して置換」を選ぶ</li> <li>検索「<em>UniRx.Async</em>」<br />置換「<span class="st"><em>Cysharp</em>.<em>Threading</em>.<em>Tasks</em></span>」<br />と記入し、すべて置換を実行</li> <li>すべて保存</li> <li>約三か所<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>エラーする</li> <li>すべて <span style="color: #286f2c;">task.IsCompleted</span> がなくなってるのが原因なので、<br /><span style="color: #ff0000;">task.Status.IsCompleted()</span> に書き換える</li> <li>終了!</li> </ol> <h3 id="v112-で対応されるとのこと">v1.12 で対応されるとのこと</h3> <p>こちらの件を報告して数時間で対応されたみたい。早すぎる…!</p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="en">Hey, We've added an automated upgrade script for UniTask v2. The feature will be available in Naninovel v1.12, which is currently in pre-release and can be downloaded on our Discord.<br /><br />Here are the details: <a href="https://t.co/B2reFxYtQl">https://t.co/B2reFxYtQl</a><br /><br />Thanks for the suggestion! <a href="https://t.co/7HY5Lfv44f">pic.twitter.com/7HY5Lfv44f</a></p> — Naninovel (@naniengine) <a href="https://twitter.com/naniengine/status/1289926517787566084?ref_src=twsrc%5Etfw">2020年8月2日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p> </p> <p><span style="opacity: 0; position: absolute; white-space: pre-wrap;"><a href="https://twitter.com/naniengine/status/1289926517787566084?s=20">https://twitter.com/naniengine/status/1289926517787566084?s=20</a></span></p> Ashtarte 【Unity】使いそうな知識とノウハウメモ hatenablog://entry/26006613605001739 2020-07-26T23:39:05+09:00 2020-07-27T00:29:39+09:00 Lighting関係 Skyboxの作り方 Skyboxをスクリプトで回転させる プロのライティングを学ぶ Terrain関係 Terrainの解説 Terrainのtree重すぎ問題を GPU Instancing で解決 Terrainチューリアル(英語) Terrain Tools Sample Asset Pack Shader関係 Amplify Shader Editor Shadero Sprite ProBuilder Polyblush ノウハウ 1unit = 1m Debug.Logは重い uGUIは動かすことを想定していない 文字列を作るときは StringBuilde… <ul class="table-of-contents"> <li><a href="#Lighting関係"> Lighting関係</a><ul> <li><a href="#Skyboxの作り方">Skyboxの作り方</a></li> <li><a href="#Skyboxをスクリプトで回転させる">Skyboxをスクリプトで回転させる</a></li> <li><a href="#プロのライティングを学ぶ">プロのライティングを学ぶ</a></li> </ul> </li> <li><a href="#Terrain関係">Terrain関係</a><ul> <li><a href="#Terrainの解説">Terrainの解説</a></li> <li><a href="#Terrainのtree重すぎ問題を-GPU-Instancing-で解決">Terrainのtree重すぎ問題を GPU Instancing で解決</a></li> <li><a href="#Terrainチューリアル英語">Terrainチューリアル(英語)</a></li> <li><a href="#Terrain-Tools-Sample-Asset-Pack">Terrain Tools Sample Asset Pack</a></li> </ul> </li> <li><a href="#Shader関係">Shader関係</a><ul> <li><a href="#Amplify-Shader-Editor">Amplify Shader Editor</a></li> <li><a href="#Shadero-Sprite">Shadero Sprite</a></li> </ul> </li> <li><a href="#ProBuilder">ProBuilder</a><ul> <li><a href="#Polyblush">Polyblush</a></li> </ul> </li> <li><a href="#ノウハウ">ノウハウ</a><ul> <li><a href="#1unit--1m">1unit = 1m</a></li> <li><a href="#DebugLogは重い">Debug.Logは重い</a></li> <li><a href="#uGUIは動かすことを想定していない">uGUIは動かすことを想定していない</a></li> <li><a href="#文字列を作るときは-StringBuilder-が早い">文字列を作るときは StringBuilder が早い</a></li> </ul> </li> </ul> <h3 id="Lighting関係"> Lighting関係</h3> <h4 id="Skyboxの作り方">Skyboxの作り方</h4> <p>地平線が中心に来るように一枚の高解像度画像を使ってテクスチャを作る。<br />それを Cubemap に登録、Skybox 作成、アタッチ、LightingでSkybox登録。</p> <p>スカイボックスはドーム状に作られるので、上部がギューッと圧縮される。<br />画像の左右はループできるように作れば繋がるので、これを守れば自作可。</p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="UnityのSkyboxのテクスチャを自作する - トマシープが学ぶ" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fbibinbaleo.hatenablog.com%2Fentry%2F2019%2F08%2F12%2F220032" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://bibinbaleo.hatenablog.com/entry/2019/08/12/220032">bibinbaleo.hatenablog.com</a></cite></p> <h4 id="Skyboxをスクリプトで回転させる">Skyboxを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>で回転させる</h4> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="【Unity(C#)】Skyboxをスクリプトで操作(切り替え、回転)する方法 - Qiita" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2FOKsaiyowa%2Fitems%2F8cde77d962c8d5f959fd" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://qiita.com/OKsaiyowa/items/8cde77d962c8d5f959fd">qiita.com</a></cite></p> <h4 id="プロのライティングを学ぶ">プロのライティングを学ぶ</h4> <p>LightProbe、AreaLightの使い方、Lightingパラメータ周り。</p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="Unityアセットレビュー:ArchVizPRO Interior Vol.5 - ウーパの手習い" src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fuuupa.hatenablog.com%2Fentry%2F2018%2F05%2F14%2F202537" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="http://uuupa.hatenablog.com/entry/2018/05/14/202537">uuupa.hatenablog.com</a></cite></p> <h3 id="Terrain関係">Terrain関係</h3> <p>ブラシを使って高さの上下、テクスチャを塗ったり、テクスチャはマテリアル毎に設定できる機能。<br />木や草を配置できて、風の設定すると草が揺れてくれる模様(木も拡張すれば揺れる)</p> <p>ただし仕上げの後にサイズを変えたい際に木が最適化されないなどの問題がある様子。<br />最初からサイズを決め打ちして作る必要が?</p> <h4 id="Terrainの解説">Terrainの解説</h4> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="【Unity】自由に地形を生成できるTerrainを解説!テクスチャやColliderの設定や注意点まで | XR-Hub" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fxr-hub.com%2Farchives%2F16348" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://xr-hub.com/archives/16348">xr-hub.com</a></cite></p> <h4 id="Terrainのtree重すぎ問題を-GPU-Instancing-で解決">Terrainのtree重すぎ問題を <a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU">GPU</a> Instancing で解決</h4> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="【Unity】Terrainのtree重すぎ問題をGPU Instancingで解決する - Qiita" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2FKAD%2Fitems%2Fdeac9120023743b9e7a2" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://qiita.com/KAD/items/deac9120023743b9e7a2">qiita.com</a></cite></p> <h4 id="Terrainチューリアル英語">Terrainチューリアル(英語)</h4> <p><iframe src="https://www.youtube.com/embed/MWQv2Bagwgk?feature=oembed" width="480" height="270" frameborder="0" allowfullscreen=""></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=MWQv2Bagwgk">www.youtube.com</a></cite></p> <h4 id="Terrain-Tools-Sample-Asset-Pack">Terrain Tools Sample Asset Pack</h4> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="Terrain Tools Sample Asset Pack | 2D Nature | Unity Asset Store" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fassetstore.unity.com%2Fpackages%2F2d%2Ftextures-materials%2Fnature%2Fterrain-tools-sample-asset-pack-145808" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation">assetstore.unity.com</cite></p> <h3 id="Shader関係">Shader関係</h3> <h4 id="Amplify-Shader-Editor">Amplify Shader Editor</h4> <p>SRP、URP、HDRP以前の built-in shader では Shader Graph が使えないためこれを使う</p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="【Unity】ノードベースで始めるシェーダー【Amplify Shader Editor】 | STYLY" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fstyly.cc%2Fja%2Ftips%2Fhow-to-use-ase1_ytomi%2F" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://styly.cc/ja/tips/how-to-use-ase1_ytomi/">styly.cc</a></cite></p> <h4 id="Shadero-Sprite">Shadero Sprite</h4> <p>2Dスプライトにエフェクトを加えるシェーダーを作るツール。</p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="【Unity】「Shadero Sprite」の基本操作と使えるノードまとめ - コガネブログ" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fbaba-s.hatenablog.com%2Fentry%2F2018%2F01%2F07%2F230000" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://baba-s.hatenablog.com/entry/2018/01/07/230000">baba-s.hatenablog.com</a></cite></p> <h3 id="ProBuilder">ProBuilder</h3> <p>プロトタイピングにサクッとマップを作るときに推奨されるようだが、<br />ローポリ系のオブジェクトでマップを作るときはこれだけで行けそう。</p> <p>マテリアルは何個も登録して貼り付けていく形の作り方。<br />これと Polyblush を組み合わせるととてもよいよ、という宣伝文句。</p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="Unity2018から標準搭載されるProBuilderを使ってみる" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgametukurikata.com%2Fmesh%2Fprobuilder" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://gametukurikata.com/mesh/probuilder">gametukurikata.com</a></cite></p> <h4 id="Polyblush">Polyblush</h4> <p>既存のメッシュをスカルプトで変形できたり、色やテクスチャをブラシで塗れる。<br />Terrein のように個性的なブラシが使えるわけではないようなこと、<br />マテリアル設定もできるがシェーダーを自力で書かないとならないのが厳しいか。</p> <p>とりあえず Probuilder で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E2%A5%C7%A5%EA%A5%F3%A5%B0">モデリング</a>して、Polyblush でスカルプトする、<br />といった簡単な機能が Unity 単体で使えるという意味ではよさそうだけど、<br />検索してる限り、あまり使ってる人がいない気がする。これから?</p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="【Unity】Polybrush チュートリアルを触ってみました - Cz_mirror Game開発備忘録" src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fcz-mirror.hatenablog.com%2Fentry%2F2018%2F03%2F09%2F020905" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="http://cz-mirror.hatenablog.com/entry/2018/03/09/020905">cz-mirror.hatenablog.com</a></cite></p> <h3 id="ノウハウ">ノウハウ</h3> <h4 id="1unit--1m">1unit = 1m</h4> <p>Unityのグリッドは 1unit と呼ぶが、それは 1m に対応する。<br />ライティング関係は、これを基準に計算するらしいので、覚えておくとよいかも。</p> <h4 id="DebugLogは重い">Debug.Logは重い</h4> <p>どうもビルド環境でも内部では動作するらしいので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%EA%A5%D7%A5%ED%A5%BB%A5%C3%A5%B5">プリプロセッサ</a>のUNITY_EDITORで囲っておく必要がありそう。<br />おそらく<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>ログを表示するメソッドを用意して、そこにテキストを流し込む形がよいかも?</p> <p>もしくは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>ログ表示用のフラグを作るとか。</p> <h4 id="uGUIは動かすことを想定していない">uGUIは動かすことを想定していない</h4> <p>特に Animator で動かすのはよくないらしい、相当重いとのこと。<br />Tween がオススメらしいが、とりあえず uGUI を動かすと <a class="keyword" href="http://d.hatena.ne.jp/keyword/GC">GC</a> が働くらしいのでそこを意識しておいたほうがよさげ。</p> <h4 id="文字列を作るときは-StringBuilder-が早い">文字列を作るときは StringBuilder が早い</h4> <p>ふつうに「+=」で追加したり、「"文字列" + 変数」系は処理が重いらしい。</p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="C#における最速の文字列結合を検証する - Qiita" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2FTD12734%2Fitems%2Ffad83dddb8f0452b7d38" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://qiita.com/TD12734/items/fad83dddb8f0452b7d38">qiita.com</a></cite></p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title=".NET の StringBuilder クラスを使用する" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.microsoft.com%2Fja-jp%2Fdotnet%2Fstandard%2Fbase-types%2Fstringbuilder" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation">docs.<a class="keyword" href="http://d.hatena.ne.jp/keyword/microsoft">microsoft</a>.com</cite></p> Ashtarte 【Unity】マルチシーンメモ hatenablog://entry/26006613603907919 2020-07-25T01:24:36+09:00 2020-07-27T01:23:27+09:00 マルチシーン シーン追加命令 Addressables 経由 SceneManager 経由 ポイント 全シーンに配置したオブジェクトやコードが自律動作可 クロスシーンリファレンス エディタ上の挙動 × ランタイムでの挙動 〇 シングルトン や ScriptableObject で解決 シングルトンの問題 ScriptableObject ライティングに注意 アクティブなシーンの設定が使用される要素 他のシーンの Directional Light などは反映される 参考 マルチシーン シングルトン ScriptableObject Light <ul class="table-of-contents"> <li><a href="#マルチシーン">マルチシーン</a><ul> <li><a href="#シーン追加命令">シーン追加命令</a><ul> <li><a href="#Addressables-経由">Addressables 経由</a></li> <li><a href="#SceneManager-経由">SceneManager 経由</a></li> </ul> </li> </ul> </li> <li><a href="#ポイント">ポイント</a><ul> <li><a href="#全シーンに配置したオブジェクトやコードが自律動作可">全シーンに配置したオブジェクトやコードが自律動作可</a></li> <li><a href="#クロスシーンリファレンス">クロスシーンリファレンス</a><ul> <li><a href="#エディタ上の挙動-">エディタ上の挙動 ×</a></li> <li><a href="#ランタイムでの挙動-〇">ランタイムでの挙動 〇</a></li> <li><a href="#シングルトン-や-ScriptableObject-で解決">シングルトン や ScriptableObject で解決</a></li> <li><a href="#シングルトンの問題">シングルトンの問題</a></li> <li><a href="#ScriptableObject">ScriptableObject</a></li> </ul> </li> <li><a href="#ライティングに注意">ライティングに注意</a><ul> <li><a href="#アクティブなシーンの設定が使用される要素">アクティブなシーンの設定が使用される要素</a></li> <li><a href="#他のシーンの-Directional-Light-などは反映される">他のシーンの Directional Light などは反映される</a></li> </ul> </li> </ul> </li> <li><a href="#参考">参考</a><ul> <li><a href="#マルチシーン-1">マルチシーン</a></li> <li><a href="#シングルトン">シングルトン</a></li> <li><a href="#ScriptableObject-1">ScriptableObject</a></li> <li><a href="#Light">Light</a></li> </ul> </li> </ul> <h3 id="マルチシーン">マルチシーン</h3> <p>マルチシーンは、シーンをいくつも重ねて表示できる機能。</p> <h4 id="シーン追加命令">シーン追加命令</h4> <h5 id="Addressables-経由">Addressables 経由</h5> <ul> <li><span style="color: #ff5252;">Addressables.LoadSceneAsync(scene, LoadSceneMode.Additive)</span><br /> <ul> <li>Completed などのコールバックが使える</li> <li>PercentComplete で状態確認できる(ゲージに反映可)</li> </ul> </li> <li>アンロードは <span style="color: #673ab7;">Addressables.UnloadScene(scene)</span></li> <li><span style="color: #ff0000;"><span style="color: #cc00cc;">Addressables を使うと、シーンをアセットバンドルに組み込める</span><br /></span> <ul> <li>シーンは普通にビルドすると level0、level0.resS のようなファイルに変換される</li> <li>LZ4圧縮指定でビルドすると、resources.assets に丸ごと組み込まれる</li> <li>それを Addressables で StreamingAssets に切り離せるのは大きな意味がある</li> </ul> </li> </ul> <h5 id="SceneManager-経由">SceneManager 経由</h5> <ul> <li>SceneManager.LoadScene(scene, LoadSceneMode.Additive)</li> <li>SceneManager.LoadSceneAsync(scene, LoadSceneMode.Additive)</li> <li>アンロードは SceneManager.UnloadScene(scene)</li> </ul> <h3 id="ポイント">ポイント</h3> <h4 id="全シーンに配置したオブジェクトやコードが自律動作可">全シーンに配置したオブジェクトやコードが自律動作可</h4> <ul> <li><span style="color: #ff0000;">ひとつのシーンで実行してるように振舞ってくれる</span></li> <li>ただしクロスシーンリファレンス問題あり<span style="color: #999999;">(後述)</span></li> <li>ライティングに注意<span style="color: #999999;">(後述)</span></li> </ul> <h4 id="クロスシーンリファレンス">クロスシーンリファレンス</h4> <h5 id="エディタ上の挙動-">エディタ上の挙動 ×</h5> <ul> <li>別シーンのオブジェクトを別シーンにアタッチしても無意味<br /> <ul> <li>アタッチ自体はできるがランタイム実行時に消えてしまう</li> </ul> </li> </ul> <h5 id="ランタイムでの挙動-〇">ランタイムでの挙動 〇</h5> <ul> <li>GameObject.Find 経由でシーンの関係なく取得できる<br /><span style="color: #1464b3;">なお、Find を Update で使うのは重いので避ける事、タグで探すのがベター</span><br /> <ul> <li>FindWithTag("文字列") でタグベースで取得</li> <li><span class="crayon-e">FindGameObject<span style="color: #cc00cc;">s</span>WithTag</span>("文字列") で複数のオブジェクトを配列で取得</li> </ul> </li> </ul> <h5 id="シングルトン-や-ScriptableObject-で解決">シングルトン や ScriptableObject で解決</h5> <h5 id="シングルトンの問題">シングルトンの問題</h5> <ul> <li>シングルトンを使う事でコード間の結びつきが強くなりすぎる問題<br /> <ul> <li>誰でもアクセスできる、これがないと動作しなくなるなど</li> <li>全シーンでランタイム実行時に存在しない際、自動生成する仕組みが必須</li> </ul> </li> </ul> <h5 id="ScriptableObject">ScriptableObject</h5> <ul> <li>プロジェクト中にひとつしか存在しない<br /> <ul> <li>どこから参照しても同じデータを取得できる</li> </ul> </li> <li>シングルトンの代わりに使う<br /> <ul> <li>個人制作レベルでは正直どちらでもよい気はする</li> </ul> </li> </ul> <h4 id="ライティングに注意">ライティングに注意</h4> <h5 id="アクティブなシーンの設定が使用される要素">アクティブなシーンの設定が使用される要素</h5> <ul> <li>Skybox</li> <li>Environment Lighting(環境光)</li> <li>Environment Reflections(環境反射)</li> <li>Realtime GI / Baked GI<br /> <ul> <li>ミックスモードでは、<span style="color: #1464b3;">直接光を Realtime GI</span>、<span style="color: #dd830c;">間接光を Baked GI</span> が担当<br /> <ul> <li>ミックスモードでベイク時、Realtime GI をオフにすると直接光の影響が消える<br /> <ul> <li>例えば Emission の光が床や壁に反映されなくなる</li> </ul> </li> <li>最初にアクティブにしたシーンで Realtime GI のチェックが入ってないと直接光が反映されないっぽい</li> </ul> </li> <li>Bakedモードでは、すべてBaked GI が担当するがベイクに時間がかかる</li> <li>Realtimeモードでは、すべてリアルタイムで実行する代わりにCPUに負担がかかる</li> </ul> </li> </ul> <h5 id="他のシーンの-Directional-Light-などは反映される">他のシーンの Directional Light などは反映される</h5> <ul> <li>どうシーンを切り分けるかは慎重に検討すべき</li> </ul> <h3 id="参考">参考</h3> <h4 id="マルチシーン-1">マルチシーン</h4> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="【Unity】5.3に追加されたマルチ・シーン・エディティングで出来る事 - テラシュールブログ" src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Ftsubakit1.hateblo.jp%2Fentry%2F2016%2F01%2F13%2F233000" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="http://tsubakit1.hateblo.jp/entry/2016/01/13/233000">tsubakit1.hateblo.jp</a></cite></p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="【Unity】5.3からのマルチシーン編集を前提として使用する上で注意すべき7つの項目 - テラシュールブログ" src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Ftsubakit1.hateblo.jp%2Fentry%2F2016%2F04%2F18%2F011411" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="http://tsubakit1.hateblo.jp/entry/2016/04/18/011411">tsubakit1.hateblo.jp</a></cite></p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="【CEDEC 2018】大規模開発におけるUnityの“弱点”解消法が語られたポケラボの講演「SINoALICE -シノアリス-におけるUnity活用術」をレポート | Social Game Info" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgamebiz.jp%2F%3Fp%3D218949" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://gamebiz.jp/?p=218949">gamebiz.jp</a></cite></p> <h4 id="シングルトン">シングルトン</h4> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="シングルトンなゲーム管理オブジェクトの作り方" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Funity.moon-bear.com%2Funitychan-coin%2Fsingleton-gamemanager%2F" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://unity.moon-bear.com/unitychan-coin/singleton-gamemanager/">unity.moon-bear.com</a></cite></p> <h4 id="ScriptableObject-1">ScriptableObject</h4> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="ゲーム構築を劇的にスマートにする Scriptable Objectの 3つの活用方法 – Unity for Pro" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fforpro.unity3d.jp%2Funity_pro_tips%2F2019%2F07%2F27%2F57%2F" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://forpro.unity3d.jp/unity_pro_tips/2019/07/27/57/">forpro.unity3d.jp</a></cite></p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="【Unity】ScriptableObjectってなんなん? って時に読む記事【解説】" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fekulabo.com%2Fabout-scriptable-object" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://ekulabo.com/about-scriptable-object">ekulabo.com</a></cite></p> <h4 id="Light">Light</h4> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="UnityのLight関連を完全に理解する(第1章) - Machio_Kinniku’s diary" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmachio-kinniku.hatenablog.com%2Fentry%2Funity-light-part1" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://machio-kinniku.hatenablog.com/entry/unity-light-part1">machio-kinniku.hatenablog.com</a></cite></p> Ashtarte 【Unity】光、陰影、反射などルックの設定方法メモ hatenablog://entry/26006613603523903 2020-07-24T11:25:57+09:00 2021-04-28T06:49:27+09:00 床の鏡面反射 Reflection Probe SSR オブジェクトにいい感じに陰をつける SSAO 光をよりキレイに光らせる Bloom マテリアルの Emission を光らせる Bloom 反射光や間接光や影をいい感じに出す Global Illumination Realtime Global Illumination Baked Global Illumination Light Probe ってなんぞや マルチシーン時の挙動 アクティブなシーンの Lighting が反映される 実際に影響される要素 他 実際にフルオプションを載せてテストしてみた 参考リンク <ul class="table-of-contents"> <li><a href="#床の鏡面反射">床の鏡面反射</a><ul> <li><a href="#Reflection-Probe">Reflection Probe</a></li> <li><a href="#SSR">SSR</a></li> </ul> </li> <li><a href="#オブジェクトにいい感じに陰をつける">オブジェクトにいい感じに陰をつける</a><ul> <li><a href="#SSAO">SSAO</a></li> </ul> </li> <li><a href="#光をよりキレイに光らせる">光をよりキレイに光らせる</a><ul> <li><a href="#Bloom">Bloom</a></li> </ul> </li> <li><a href="#マテリアルの-Emission-を光らせる">マテリアルの Emission を光らせる</a><ul> <li><a href="#Bloom-1">Bloom</a></li> </ul> </li> <li><a href="#反射光や間接光や影をいい感じに出す">反射光や間接光や影をいい感じに出す</a><ul> <li><a href="#Global-Illumination">Global Illumination</a><ul> <li><a href="#Realtime-Global-Illumination">Realtime Global Illumination</a></li> <li><a href="#Baked-Global-Illumination">Baked Global Illumination</a></li> </ul> </li> </ul> </li> <li><a href="#Light-Probe-ってなんぞや">Light Probe ってなんぞや</a></li> <li><a href="#マルチシーン時の挙動">マルチシーン時の挙動</a><ul> <li><a href="#アクティブなシーンの-Lighting-が反映される">アクティブなシーンの Lighting が反映される</a><ul> <li><a href="#実際に影響される要素">実際に影響される要素</a></li> </ul> </li> <li><a href="#他">他</a></li> </ul> </li> <li><a href="#実際にフルオプションを載せてテストしてみた">実際にフルオプションを載せてテストしてみた</a></li> <li><a href="#参考リンク">参考リンク</a></li> </ul> <h3 id="床の鏡面反射">床の鏡面反射</h3> <h4 id="Reflection-Probe">Reflection Probe</h4> <ul> <li>ネットで検索かけると出てくる。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>で反転させるやつ<br />更新が遅くてガクガクしちゃうので、おそらく<span style="color: #d32f2f;">推奨される方法ではない<br /></span> <ul> <li>床を鏡面反射したいなら <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSR">SSR</a> を使おうぜってことかと</li> </ul> </li> <li>リフレクションプローブはふつうに使うのがおそらくよい<br /> <ul> <li>屋内ならぴったり部屋を囲って Box Projection にチェックを入れる</li> <li>鏡とか真っ暗なテレビ画面とかいい感じに反射してくれる</li> </ul> </li> </ul> <h4 id="SSR"><a class="keyword" href="http://d.hatena.ne.jp/keyword/SSR">SSR</a></h4> <ul> <li>Screen Space Reflection<br /> <ul> <li>Post Processing Stack系の機能。壁から何まですべてコレでいける</li> <li>マテリアルの Smoothness の値が 1 に近いほど反射しまくる</li> </ul> </li> </ul> <h3 id="オブジェクトにいい感じに陰をつける">オブジェクトにいい感じに陰をつける</h3> <h4 id="SSAO">SSAO</h4> <ul> <li>Screen Space Ambient Occulution<br /> <ul> <li>Post Processing Stack系の機能。<br />物体と物体の間に陰をつけて、やたら立体的に見えるようになる</li> </ul> </li> </ul> <h3 id="光をよりキレイに光らせる">光をよりキレイに光らせる</h3> <h4 id="Bloom">Bloom</h4> <ul> <li>Post Processing Stack系の機能。<br /> <ul> <li>Intensity でギラッと光る。あまり高い数値を入れないほうがよいらしい</li> <li>Thretiold でいい感じににじみを加える</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Clamp">Clamp</a> は初期値が高すぎるので低くしてよい</li> </ul> </li> <li>あまり光らせると白飛びするので調整すること</li> </ul> <h3 id="マテリアルの-Emission-を光らせる">マテリアルの Emission を光らせる</h3> <h4 id="Bloom-1">Bloom</h4> <ul> <li>追加すると Emission を設定したマテリアルが光る。</li> <li>マテリアルのパラメータ Global Illumination で近くのオブジェクトに影響を与える<br /> <ul> <li>Realtime なら CPU に負担がかかるがなんにでも影響を与える</li> <li>Bake なら static オブジェクトのみ。Light Probe で dynamic にも対応可</li> </ul> </li> </ul> <h3 id="反射光や間接光や影をいい感じに出す">反射光や間接光や影をいい感じに出す</h3> <h4 id="Global-Illumination">Global Illumination</h4> <ul> <li>Window → Rerdering → Lighting Settings より設定可</li> <li>基本的に GI はベイクしないと効果がないと覚えておくとよいか?</li> </ul> <h5 id="Realtime-Global-Illumination">Realtime Global Illumination</h5> <ul> <li>正しくはPrecomputing Realtime Global Illumination<br /> <ul> <li>「事前計算」であることに要注意</li> </ul> </li> <li>CPU を喰う代わりにオブジェクトの制限なくいい感じにしてくれる<br /> <ul> <li>実際に使った感覚だと、あまり効果があるように感じないのだけど…?</li> </ul> </li> <li>ただし直接光のみしか扱えない。間接光は BakedGI 担当。<br /> <ul> <li>間接光だけはベイクしないと表現できないという絶対ルールがある</li> </ul> </li> </ul> <h5 id="Baked-Global-Illumination">Baked Global Illumination</h5> <ul> <li>Static なオブジェクトに影響を与える<br /> <ul> <li>Light Probe を使えば Dynamic なオブジェクトにも影響を付与可能</li> </ul> </li> <li>ライト諸々をセットしたあと、Lighing Settings 最下部「Bake」で焼きこむ<br /> <ul> <li>びっくりするほど完了に時間がかかる</li> </ul> </li> <li>ライトの設定「<span style="color: #dd830c;">Baked Shadow <a class="keyword" href="http://d.hatena.ne.jp/keyword/Radius">Radius</a></span>」の値を2くらいに上げるとボヤッとした影になる<br /> <ul> <li>実際やってみるとだいぶ馴染む感じがして良い</li> </ul> </li> </ul> <h3 id="Light-Probe-ってなんぞや">Light Probe ってなんぞや</h3> <ul> <li>GIと連携して動的なオブジェクトに間接光や影を落とす機能</li> <li>シーンの三次元空間で設定するのでちょっと面倒<br /> <ul> <li>グループで移動できる</li> <li><span style="color: #ff5252;">Ctrl + D を一回押すと複製</span>してくれる</li> <li>細かく配置しないとうまく反映されない</li> </ul> </li> </ul> <h3 id="マルチシーン時の挙動">マルチシーン時の挙動</h3> <h4 id="アクティブなシーンの-Lighting-が反映される">アクティブなシーンの Lighting が反映される</h4> <ul> <li>詳細は<a href="https://ashtarte.hateblo.jp/entry/2020/07/25/012436#%E3%83%A9%E3%82%A4%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AB%E6%B3%A8%E6%84%8F">こちらのリンク</a>参照のこと</li> </ul> <h5 id="実際に影響される要素">実際に影響される要素</h5> <ul> <li>Skybox</li> <li>Environment Lighting</li> <li>Environment Reflections</li> <li>Realtime GI / Baked GI</li> </ul> <h4 id="他">他</h4> <ul> <li> <p>エディタ上でマルチシーンにしてる場合、すべてのシーンがベイクされる</p> </li> <li> <p>ベイクしたオブジェクトを他のシーンに持って行っても意味はない</p> </li> <li> <p>Reflection Probe のベイク実行で、ライトマップも一緒にベイクされる</p> </li> </ul> <h3 id="実際にフルオプションを載せてテストしてみた">実際にフルオプションを載せてテストしてみた</h3> <ul> <li>左が全オブジェクトが Dynamic でリアルタイムライトを使用、<br />右が全オブジェクトが Static でベイクしたもの<br /> <ul> <li>SSAO だけ後から PostProcess で乗せた</li> </ul> </li> <li>リアルタイムだと間接光の影響を受けないから真っ暗。<br />エミッションも壁に焼き付けられないのでクオリティが若干下がってる</li> </ul> <p align="center"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20210428/20210428063332.jpg" alt="f:id:Ashtarte:20210428063332j:plain" title="" class="hatena-fotolife" itemprop="image" /></p> <h3 id="参考リンク">参考リンク</h3> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="Unity5を使った屋内向けにもう少し綺麗なライティングのメモ - テラシュールブログ" src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Ftsubakit1.hateblo.jp%2Fentry%2F2015%2F03%2F17%2F233423" scrolling="no" frameborder="0"></iframe><cite class="hatena-citation"><a href="http://tsubakit1.hateblo.jp/entry/2015/03/17/233423">tsubakit1.hateblo.jp</a></cite></p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="【Unity】良い感じに見える(屋内向け)ライティングの設定手順 - テラシュールブログ" src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Ftsubakit1.hateblo.jp%2Fentry%2F2018%2F01%2F04%2F235520" scrolling="no" frameborder="0"></iframe><cite class="hatena-citation"><a href="http://tsubakit1.hateblo.jp/entry/2018/01/04/235520">tsubakit1.hateblo.jp</a></cite><cite class="hatena-citation"></cite></p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="【Unity】ライティングを理解するためにコーネルボックスを作って遊ぶ - テラシュールブログ" src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Ftsubakit1.hateblo.jp%2Fentry%2F2016%2F03%2F14%2F230904" scrolling="no" frameborder="0"></iframe><cite class="hatena-citation"><a href="http://tsubakit1.hateblo.jp/entry/2016/03/14/230904">tsubakit1.hateblo.jp</a></cite></p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="Emission - Unity マニュアル" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.unity3d.com%2Fja%2F2018.4%2FManual%2FStandardShaderMaterialParameterEmission.html" scrolling="no" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://docs.unity3d.com/ja/2018.4/Manual/StandardShaderMaterialParameterEmission.html">docs.unity3d.com</a></cite></p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="グローバルイルミネーション - Unity マニュアル" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.unity3d.com%2Fja%2F2019.3%2FManual%2FGIIntro.html" scrolling="no" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://docs.unity3d.com/ja/2019.3/Manual/GIIntro.html">docs.unity3d.com</a></cite></p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="グロー表現のクオリティーを高める3つのポイント" src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fcompojigoku.blog.fc2.com%2Fblog-entry-28.html" scrolling="no" frameborder="0"></iframe><cite class="hatena-citation"><a href="http://compojigoku.blog.fc2.com/blog-entry-28.html">compojigoku.blog.fc2.com</a></cite></p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="UnityのLight関連を完全に理解する(第1章) - Machio_Kinniku’s diary" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmachio-kinniku.hatenablog.com%2Fentry%2Funity-light-part1" scrolling="no" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://machio-kinniku.hatenablog.com/entry/unity-light-part1">machio-kinniku.hatenablog.com</a></cite></p> Ashtarte 【Unity】デリゲートとコールバックとイベントの復習 hatenablog://entry/26006613600243772 2020-07-18T15:55:23+09:00 2020-07-18T16:11:27+09:00 デリゲート 通常の実行方法 Action と Func Action Func ラムダ式 使い方 コールバック 参考:デリゲート、ラムダ式、コールバックについて イベント イベントとは イベントハンドラーとは 作り方 補足 参考 <ul class="table-of-contents"> <li><a href="#デリゲート">デリゲート</a><ul> <li><a href="#通常の実行方法">通常の実行方法</a></li> <li><a href="#Action-と-Func">Action と Func</a><ul> <li><a href="#Action">Action</a></li> <li><a href="#Func">Func</a></li> </ul> </li> <li><a href="#ラムダ式">ラムダ式</a><ul> <li><a href="#使い方">使い方</a></li> </ul> </li> <li><a href="#コールバック">コールバック</a></li> <li><a href="#参考デリゲートラムダ式コールバックについて">参考:デリゲート、ラムダ式、コールバックについて</a></li> </ul> </li> <li><a href="#イベント">イベント</a><ul> <li><a href="#イベントとは">イベントとは</a></li> <li><a href="#イベントハンドラーとは">イベントハンドラーとは</a></li> </ul> </li> <li><a href="#作り方">作り方</a></li> <li><a href="#補足">補足</a></li> <li><a href="#参考">参考</a></li> </ul> <h3 id="デリゲート">デリゲート</h3> <h4 id="通常の実行方法">通常の実行方法</h4> <blockquote> <p><span class="k"><a class="keyword" href="http://d.hatena.ne.jp/keyword/delegate">delegate</a></span> <span class="err">戻り値の型</span> <span class="err">デリゲート名</span> <span class="p">(</span><span class="err">関数が引き受ける仮引数</span><span class="p">);</span></p> </blockquote> <ul> <li>上記を定義したのち、実行したいメソッドで この型の変数にメソッドを仕込む<br /> <ul> <li><span style="color: #1464b3;"><em>デリゲート名 <a class="keyword" href="http://d.hatena.ne.jp/keyword/hoge">hoge</a> = メソッド()</em></span></li> <li>これを <span style="color: #dd830c;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/hoge">hoge</a>()</span> として実行すると、登録したメソッドが実行される</li> </ul> </li> <li>メソッドの中で実行したいメソッドを差し替えたいときに使う</li> </ul> <h4 id="Action-と-Func">Action と Func</h4> <ol> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/delegate">delegate</a> を定義するのが面倒なときにメソッドの引数で登録できる</li> <li><span style="color: #1464b3;">public void メソッド名 (Action&lt;T&gt; <span style="color: #00796b;">action</span>)</span><br /> <ol> <li>このメソッド中で <span style="color: #00796b;">action</span> を実行したいタイミングに <span style="color: #dd830c;">action()</span> と書いておく</li> <li>他のメソッドでこのメソッドを実行する際、<span style="color: #00796b;">Method()</span> の引数に実行したいメソッドを記入</li> <li>このメソッドの <span style="color: #dd830c;">action()</span> のタイミングで 実行したいメソッドを実行してくれる</li> </ol> </li> </ol> <h5 id="Action">Action</h5> <ul> <li> <span style="color: #ff0000;">戻り値を持たない</span>デリゲート</li> </ul> <h5 id="Func">Func</h5> <ul> <li><span style="color: #ff0000;">戻り値を持つ</span>デリゲート</li> </ul> <h4 id="ラムダ式"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%E0%A5%C0%BC%B0">ラムダ式</a></h4> <ul> <li>Task や UniRx に <a class="keyword" href="http://d.hatena.ne.jp/keyword/Linq">Linq</a>、それにイベントなど、色んな所でやたら出てくる</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%E0%A5%C0%BC%B0">ラムダ式</a>が出てくる = 実装は Action/Func、デリゲート<br /> <ul> <li>実行したいメソッドを差し替え可能にするために使われてる</li> </ul> </li> </ul> <h5 id="使い方">使い方</h5> <ul> <li>上記の「他のメソッド」に相当する箇所で、<span style="color: #00796b;">Method (</span><span style="color: #dd830c;"><span style="color: #d32f2f;">()</span><span style="color: #00796b;"> =&gt; 実行したい処理)</span></span> などと書く<br /> <ul> <li><span style="color: #1464b3;"><span style="color: #d32f2f;">()</span> <span style="color: #333333;">は実行したい処理で使う引数</span></span></li> </ul> </li> <li>つまり実行したいメソッドに直接処理を書き込める省略記法<br /> <ul> <li>匿名メソッド、無名関数とも呼ばれる</li> </ul> </li> </ul> <h4 id="コールバック">コールバック</h4> <ul> <li>実はもう説明済<br /> <ul> <li>「Action と Func」項目の (2) がコールバック</li> </ul> </li> <li>つまりコールバックは、用意済のタイミングで任意のメソッドを実行可にしたもの</li> </ul> <h4 id="参考デリゲートラムダ式コールバックについて">参考:デリゲート、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%E0%A5%C0%BC%B0">ラムダ式</a>、コールバックについて</h4> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="多分わかりやすいC#のDelegateとラムダ式入門 | SIOS Tech. Lab" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftech-lab.sios.jp%2Farchives%2F15318" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://tech-lab.sios.jp/archives/15318">tech-lab.sios.jp</a></cite></p> <h3 id="イベント">イベント</h3> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%D9%A5%F3%A5%C8%A5%CF%A5%F3%A5%C9%A5%E9">イベントハンドラ</a>ーの追加と削除が自由にできる便利なやつ</li> <li>コールバックのすごい版</li> <li>デリゲートのプロパティ版<br /> <ul> <li>クラス内ではデリゲートとして使えて、外からは追加と削除の操作しかできない</li> <li>外から追加するときは += 、削除は -= で<br /> <ul> <li><span style="color: #00796b;">AsyncOperation.Completed += <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%E0%A5%C0%BC%B0">ラムダ式</a></span> とやるアレがイベント</li> </ul> </li> </ul> </li> </ul> <h5 id="イベントとは">イベントとは</h5> <ul> <li>ボタンが押された、マウスがクリックされたなどの事象のこと</li> </ul> <h5 id="イベントハンドラーとは"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%D9%A5%F3%A5%C8%A5%CF%A5%F3%A5%C9%A5%E9">イベントハンドラ</a>ーとは</h5> <ul> <li>イベントが発生したときに起きる処理のこと</li> </ul> <h4 id="作り方">作り方</h4> <blockquote> <p><span class="reserved">event</span> <span class="input">デリゲート型</span> <span class="input">イベント ハンドラー名</span>;</p> </blockquote> <ul> <li> <span style="color: #1464b3;">get/set</span> の代わりに、<span style="color: #1464b3;">add/remove</span> が使える</li> </ul> <h4 id="補足">補足</h4> <ul> <li>UniRxはイベントの上位互換</li> <li>UniRxでイベント操作もコルーチンもなんでも取り込んで使えるよ! とのこと</li> </ul> <h4 id="参考">参考</h4> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="イベント" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fufcpp.net%2Fstudy%2Fcsharp%2Fsp_event.html" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://ufcpp.net/study/csharp/sp_event.html">ufcpp.net</a></cite></p> <p> </p> Ashtarte 【Unity】AddressableAssetSystemメモ hatenablog://entry/26006613599103033 2020-07-16T03:27:01+09:00 2020-08-04T11:32:22+09:00 前書き ScriptableObject 関連 AddressableAsset に組み込む際の要点 ScriptableObject に Prefab を配置すると bundle に含まれてしまう件 問題 解決方法 疑問点1(→解決済) 疑問点2(→解決済) 上記の問題群に対する回答案 AssetReferenceTypeRestriction は廃止された 補足1 補足2 <ul class="table-of-contents"> <li><a href="#前書き">前書き</a></li> <li><a href="#ScriptableObject-関連">ScriptableObject 関連</a><ul> <li><a href="#AddressableAsset-に組み込む際の要点">AddressableAsset に組み込む際の要点</a></li> <li><a href="#ScriptableObject-に-Prefab-を配置すると-bundle-に含まれてしまう件">ScriptableObject に Prefab を配置すると bundle に含まれてしまう件</a><ul> <li><a href="#問題">問題</a></li> <li><a href="#解決方法">解決方法</a></li> </ul> </li> <li><a href="#疑問点1解決済">疑問点1(→解決済)</a></li> <li><a href="#疑問点2解決済">疑問点2(→解決済)</a><ul> <li><a href="#上記の問題群に対する回答案">上記の問題群に対する回答案</a></li> </ul> </li> <li><a href="#AssetReferenceTypeRestriction-は廃止された">AssetReferenceTypeRestriction は廃止された</a><ul> <li><a href="#補足1">補足1</a></li> <li><a href="#補足2">補足2</a></li> </ul> </li> </ul> </li> </ul> <h3 id="前書き">前書き</h3> <p>まだよくわかってないので調べてみた内容をまとめておきます。<br />間違ってるところとかあるかも。</p> <h3 id="ScriptableObject-関連">ScriptableObject 関連</h3> <h4 id="AddressableAsset-に組み込む際の要点">AddressableAsset に組み込む際の要点</h4> <ul> <li>ScriptableObject にアセット(Prefabなど)の参照を入れて AddressableAsset をビルドすると、<br />参照されているものも丸ごと bundle ファイルに入る</li> </ul> <ul> <li>ScriptableObject の中で ScriptableObject を参照した場合、<br />その ScriptableObject で参照されているアセットも bundle ファイルに入る</li> </ul> <ul> <li>ただし、その親 ScriptableObject 下で参照したアセットが被っていると、<br />さすがにアセットひとつのみのロードで済むっぽい<br /><br /></li> <li>本番環境<span style="color: #666666;"> (Use Existing Build)</span> とテスト環境<span style="color: #666666;"> (Use AssetDatabase) </span>で参照アセットが変わる<br /> <ul> <li><a href="https://ashtarte.hateblo.jp/entry/2020/07/16/032701#%E7%96%91%E5%95%8F%E7%82%B92%E8%A7%A3%E6%B1%BA%E6%B8%88">疑問点2</a>参照</li> </ul> </li> </ul> <h4 id="ScriptableObject-に-Prefab-を配置すると-bundle-に含まれてしまう件"><span style="color: #d32f2f;">ScriptableObject に Prefab を配置すると bundle に含まれてしまう件</span></h4> <h5 id="問題">問題</h5> <ul> <li>ScriptableObject をロードすればその下の Prefab も一緒にロードできる<br />…が、データベースを組むときに Prefab や Image まで含めてしまうと、<br />AddressableAsset のデータを小分けにロードできるメリットが失われる。<br /><br />データベースなのにやたらサイズが大きくなるし、ロードが遅くなる。<span style="text-decoration: line-through;"><br /></span></li> </ul> <h5 id="解決方法">解決方法</h5> <ul> <li>AddressableGroup で別途アセットを配置したグループを作る。<br />これを AssetReference で参照すると Group(bundle)に含まずに済む。<br /><br />ただしアセットを別途ロードしないと実体化できない。ちょっとめんどい。</li> </ul> <h4 id="疑問点1解決済">疑問点1(→解決済)</h4> <ul> <li><span style="text-decoration: line-through;">ScriptableObject の中で AssetReference を置いたとき、</span><br /><span style="text-decoration: line-through;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>から参照して<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>すると null でエラーする??<br /></span><br /> <ul> <li>ロード処理(下記画像だと LoadWaitAsync)の while の条件式の問題だった。<br />while は ”条件式が真であるとき” ループし続ける仕組みなので、<br /><span style="color: #d32f2f;">PercentComplete &lt; 1 だと 1 にならずに抜ける</span>。&lt;= だと永遠に回り続ける。<br /><br />ので、確実にハンドルに参照が入ったかどうかをチェックする<br />handle.<span style="color: #673ab7;">Result == null</span> を使って、ロードが完全に終了したかどうかを見た。</li> </ul> </li> </ul> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20200716/20200716195359.png" alt="f:id:Ashtarte:20200716195359p:plain" title="f:id:Ashtarte:20200716195359p:plain" class="hatena-fotolife" itemprop="image" /></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20200716/20200716200538.png" alt="f:id:Ashtarte:20200716200538p:plain" title="f:id:Ashtarte:20200716200538p:plain" class="hatena-fotolife" itemprop="image" /></p> <h4 id="疑問点2解決済">疑問点2(→解決済)</h4> <ol> <li>AddressableAsset の <span style="color: #1464b3;">PlayModeScript の Use Existing Build を選択時</span>、<br />ScriptableObject を直接グループに紐づけした状態で LoadAssetAsync した際、<br /><span style="color: #ff0000;">該当する ScriptableObject は Project にある同名の ScriptableObject とは別扱い</span>になるっぽい。<br /><br /></li> <li>つまり Project にある同名のアセットの値を変更しても反映されないということ。<br /><strong>ロードしたアセットは Project の同名アセットとは別扱いになる。</strong><br /><br /></li> <li><span style="text-decoration: line-through;"><span style="color: #333333; text-decoration: line-through;">Addressables経由 ScriptableObject 下にあるprivateメンバーの値が読めない。なぜ?</span></span><br /><span style="color: #cc00cc;">数値を変えたい private メンバーは [SerializeField] 属性をつけること!</span>(ポカミス)<br /><br /></li> <li>ちなみに AssetReference 経由の場合、オブジェクトの実体は editorAsset 経由で拾える。<br /><span style="color: #00796b;">handle.Result.assetReferenceGameObjects[0] では null</span> を吐き出す。<br />正解は <span style="color: #d32f2f;">handle.Result.assetReferenceGameObjects[0].editorAsset</span>。<br />ただし、editorAsset を使ってると アセットのビルド時にエラーを吐く。</li> </ol> <h5 id="上記の問題群に対する回答案">上記の問題群に対する回答案</h5> <ul> <li>PlayModeScriptの <span style="color: #00796b;">Use Asset Database</span> では<span style="color: #d32f2f;">アセットビルドを参照しない</span>。<br />このモードでは Project上 の ScriptableObject 等アセットを参照する<span style="color: #286f2c;">(確認済み)</span>ので、<br /><strong>開発中は Use Asset Database で直接参照状態にして<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>。</strong><br />本番ではビルドして Use Existing Build で実行。<br /><br /></li> <li>直接参照状態なら、Addressables からロードした別<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>にはならない。<br />エディタから ScriptableObject の値を変えてもランタイム終了時に保持される。<br /> <ul> <li>別<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>状態になると、<span style="color: #673ab7;">本番環境ではランタイム終了時に消える</span></li> </ul> </li> </ul> <h4 id="AssetReferenceTypeRestriction-は廃止された">AssetReferenceTypeRestriction は廃止された</h4> <p>下記が詳しい。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%A7%A5%CD%A5%EA%A5%C3%A5%AF">ジェネリック</a>型は通常のインスペクターで確認できない。<br />Odin でも AssetReference には対応してないのでどうしようもない。</p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="AssetReferenceTypeRestrictionが無くなっていた(とその行方) :: Kuro Tech Blog — 調べたもの置き場" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fkurokuru.github.io%2Fposts%2F20191028_01%2F" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://kurokuru.github.io/posts/20191028_01/">kurokuru.github.io</a></cite></p> <h5 id="補足1">補足1</h5> <p>ちなみに下記のようなものが模様。いろいろあるなあ。<br /><span style="color: #1464b3;">LoadAssetAsync&lt;T&gt;(文字列)</span> の<span style="color: #dd830c;">文字列部分</span>に下記の型の変数を配置すればOK。</p> <ul> <li>AssetReferenceAtlasedSprite</li> <li>AssetReferenceGameObject</li> <li>AssetReferenceSprite</li> <li>AssetReferenceT&lt;&gt;</li> <li>AssetReferenceTexture</li> <li>AssetReferenceTexture2D</li> <li>AssetReferenceTexture3D</li> </ul> <h5 id="補足2">補足2</h5> <p>AssetReference は Odin の [PreviewField] で画像ウィンドウが出せない。つらい。</p> Ashtarte 【Unity】UniRx の復習 hatenablog://entry/26006613597132369 2020-07-12T03:20:33+09:00 2020-07-18T16:16:58+09:00 UniRxの概要 UniRxの覚え方 どういうものか Subject ReactiveProperty OnTrriger 処理を停止するオペレータ AddTo(this) TakeUntilDestroy(this) サンプル オペレータ逆引き <ul class="table-of-contents"> <li><a href="#UniRxの概要">UniRxの概要</a></li> <li><a href="#UniRxの覚え方">UniRxの覚え方</a><ul> <li><a href="#どういうものか">どういうものか</a></li> <li><a href="#Subject">Subject</a></li> <li><a href="#ReactiveProperty">ReactiveProperty</a></li> <li><a href="#OnTrriger">OnTrriger</a></li> <li><a href="#処理を停止するオペレータ">処理を停止するオペレータ</a><ul> <li><a href="#AddTothis">AddTo(this)</a></li> <li><a href="#TakeUntilDestroythis">TakeUntilDestroy(this)</a></li> </ul> </li> </ul> </li> <li><a href="#サンプル">サンプル</a></li> <li><a href="#オペレータ逆引き">オペレータ逆引き</a></li> </ul> <h3 id="UniRxの概要">UniRxの概要</h3> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="UniRx入門 その1 - Qiita" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2FtoRisouP%2Fitems%2F2f1643e344c741dd94f8" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://qiita.com/toRisouP/items/2f1643e344c741dd94f8">qiita.com</a></cite></p> <h3 id="UniRxの覚え方">UniRxの覚え方</h3> <h4 id="どういうものか">どういうものか</h4> <p><span style="color: #ff0000;">先に処理を登録して、特定の条件で実行するもの。</span><br />Update で if とか switch を使って色々処理を書かなくて済む。</p> <p>下にいくつかまとめておく。</p> <h4 id="Subject">Subject</h4> <p>特定のタイミングに任意で実行したいとき用。</p> <ol> <li><span style="color: #1464b3;">Subject</span> を作って <span style="color: #dd830c;">Subscribe</span> で実行したい処理を登録</li> <li>実行したいときに <span style="color: #ff0000;">OnNext</span> で実行</li> </ol> <h4 id="ReactiveProperty">ReactiveProperty</h4> <p>例えばHPが増減したらゲージが勝手に動くとかやりたいとき用。</p> <ol> <li><span style="color: #1464b3;">var rp = new ReactiveProperty&lt;型&gt;</span> で作成</li> <li>Start等で <span style="color: #dd830c;">Subscribe</span> でやりたい処理を登録</li> <li>rp.<a class="keyword" href="http://d.hatena.ne.jp/keyword/Value">Value</a> で値を変更すると即実行</li> </ol> <h4 id="OnTrriger">OnTrriger</h4> <p>特定の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%EA%A5%B8%A5%E7%A5%F3">コリジョン</a>に入ったり、中に居たり、出たとき用。</p> <ol> <li>2つのオブジェクトを用意</li> <li>どちらかにRigidBodyをつけ、対象にColliderつける</li> <li>ColliderのIsTrrigerにチェック</li> <li>このColliderに対して下記の条件を満たすと実行<br />→ 入ったとき<span style="color: #dd830c;">(OnTriggerEnterAsObservable)</span><br />→ 入ってるとき<span style="color: #dd830c;">(OnTriggerStayAsObservable)</span><br />→ 出たとき<span style="color: #dd830c;">(OnTriggerExitAsObservable)</span></li> <li>ちなみに2D用のOnTrrigerもある</li> </ol> <h4 id="処理を停止するオペレータ">処理を停止するオペレータ</h4> <h5 id="AddTothis">AddTo(this)</h5> <ul> <li>処理の最後に .AddTo(this) と足しておくと<br />該当するゲームオブジェクトがDestroyしたときに処理を停止してくれる</li> <li>Observable.Timer等の常時監視する処理に付け足しておく</li> <li><span style="color: #ff0000;">AddTo は Dispose のみ</span>。OnComplete は発行されない</li> </ul> <h5 id="TakeUntilDestroythis">TakeUntilDestroy(this)</h5> <ul> <li>処理の途中で .TakeUntilDestroy(this) と足しておくと<br />該当するゲームオブジェクトがDestroyしたときに処理を停止してくれる</li> <li>そこまでは AddTo と同じだが、<span style="color: #ff0000;">TakeUntilDestroy は OnComplete を発行する</span></li> </ul> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="【Unity】OnTriggerを利用した当たり判定を理解しよう! | XR-Hub" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fxr-hub.com%2Farchives%2F7499" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://xr-hub.com/archives/7499">xr-hub.com</a></cite></p> <h3 id="サンプル">サンプル</h3> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="UniRxのシンプルなサンプルの取扱説明書 - Qiita" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2FMarimoiro%2Fitems%2Fb0c66c6c22cf58bde049" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://qiita.com/Marimoiro/items/b0c66c6c22cf58bde049">qiita.com</a></cite></p> <h3 id="オペレータ逆引き">オペレータ逆引き</h3> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="UniRx オペレータ逆引き - Qiita" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2FtoRisouP%2Fitems%2F3cf1c9be3c37e7609a2f" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://qiita.com/toRisouP/items/3cf1c9be3c37e7609a2f">qiita.com</a></cite></p> Ashtarte 【Unity】UniTask の復習 hatenablog://entry/26006613597132255 2020-07-12T03:19:38+09:00 2020-07-18T15:59:14+09:00 UniTaskの概要 await と Task async と Task UniTaskの補足 UniTaskのネスト <ul class="table-of-contents"> <li><a href="#UniTaskの概要">UniTaskの概要</a></li> <li><a href="#await-と-Task">await と Task</a></li> <li><a href="#async-と-Task">async と Task</a></li> <li><a href="#UniTaskの補足">UniTaskの補足</a></li> <li><a href="#UniTaskのネスト">UniTaskのネスト</a></li> </ul> <h3 id="UniTaskの概要">UniTaskの概要</h3> <p>非同期処理を行う Task を Unity に最適化したもの。<br />AsyncOperation(LoadAsync等) や DOTween なんかが、await できるようになる。</p> <p>下記の記事がとてもわかりやすいので忘れたら読む。</p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="UniTask機能紹介 - Qiita" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2FtoRisouP%2Fitems%2F4445b6b9bf00e49eb147" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://qiita.com/toRisouP/items/4445b6b9bf00e49eb147">qiita.com</a></cite></p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="UniTask Ver2 、UniTaskAsyncEnumerableまとめ - Qiita" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2FtoRisouP%2Fitems%2F8f66fd952eaffeaf3107" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://qiita.com/toRisouP/items/8f66fd952eaffeaf3107">qiita.com</a></cite></p> <h3 id="await-と-Task">await と Task</h3> <p>await はただ処理待ちするだけ。<br />Task は非同期処理を行う。</p> <p>await Task~ と続けるのは、非同期処理が終わるまで待つ、という意味。</p> <h3 id="async-と-Task">async と Task</h3> <p><span style="color: #673ab7;">「async Task メソッド名()」</span></p> <p>async は非同期処理ですよ、と明示する修飾子。await を使うためのもの。<br />Task は非同期処理中の状態を示す戻り値。</p> <p>async void…と続けると、戻り値がないので「await メソッド()」ができない。</p> <p>ちなみに <span style="color: #1464b3;">Task.Run (() =&gt; アクション)</span> は、<span style="color: #dd830c;">public static Task Run (Action action)</span>。</p> <h3 id="UniTaskの補足">UniTaskの補足</h3> <p>UniTaskでDOTweenを使えるんですけども、初心者には使用方法がちょっとわかりにくい。<br />Scripting Define Symbols ってなんじゃらほい。</p> <blockquote> <p>OpenUPMからDOTweenを導入する、またはScripting Define Symbolsに<br />「UNITASK_DOTWEEN_SUPPORT」を定義する</p> </blockquote> <p><span style="color: #ff0000;"> Edit → ProjectSettings → PlayerSetting のタブ一番左の OtherSettings にある</span>。<br />(Icon、Resolution、Splash の次)</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20200712/20200712021140.png" alt="f:id:Ashtarte:20200712021140p:plain" title="f:id:Ashtarte:20200712021140p:plain" class="hatena-fotolife" itemprop="image" /></p> <p>ちなみにOdinを使ってる場合はこんな感じの表記</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20200712/20200712031444.png" alt="f:id:Ashtarte:20200712031444p:plain" title="f:id:Ashtarte:20200712031444p:plain" class="hatena-fotolife" itemprop="image" /></p> <h3 id="UniTaskのネスト">UniTaskのネスト</h3> <p>下記はUIイメージにアタッチした<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>。<br />ボタンを押すと、このイメージをDOTweenで右方向へ1秒、左方向へ1秒動かします。</p> <p>なお、移動完了するまでボタンを押しても無視されます。<br />あとホントは<span style="color: #ff0000;">async系はメソッド名の最後に Async とつけるのがマナー</span>らしい。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20200712/20200712021339.png" alt="f:id:Ashtarte:20200712021339p:plain" title="f:id:Ashtarte:20200712021339p:plain" class="hatena-fotolife" itemprop="image" /></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20200712/20200712035413.png" alt="f:id:Ashtarte:20200712035413p:plain" title="f:id:Ashtarte:20200712035413p:plain" class="hatena-fotolife" itemprop="image" /><br /><br /></p> <p> </p> Ashtarte 【Unity】AddressableAssetSystemの復習 hatenablog://entry/26006613597095166 2020-07-12T00:17:37+09:00 2020-07-18T16:18:03+09:00 AddressableAssetSystem の概要 メモリ管理の仕組み LoadAssetAsync と InstantiateAsync の違い RetroSpriteAnimator.cs UniTask との連携 他メモ <ul class="table-of-contents"> <li><a href="#AddressableAssetSystem-の概要">AddressableAssetSystem の概要</a></li> <li><a href="#メモリ管理の仕組み">メモリ管理の仕組み</a></li> <li><a href="#LoadAssetAsync-と-InstantiateAsync-の違い">LoadAssetAsync と InstantiateAsync の違い</a></li> <li><a href="#RetroSpriteAnimatorcs">RetroSpriteAnimator.cs</a></li> <li><a href="#UniTask-との連携">UniTask との連携</a></li> <li><a href="#他メモ">他メモ</a></li> </ul> <p>自分が忘れないようメモ。初心者なので間違ってるところもあるかも…<br />バージョンアップでずいぶん仕様が変わってるので、過去記事は参考にならない場合がたまにある</p> <h3 id="AddressableAssetSystem-の概要">AddressableAssetSystem の概要</h3> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="Addressable Assets Systemをちゃんと導入するための技術検証まとめ" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fblog.applibot.co.jp%2F2020%2F06%2F15%2Fintroduce-addressable-assets-system%2F" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://blog.applibot.co.jp/2020/06/15/introduce-addressable-assets-system/">blog.applibot.co.jp</a></cite></p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="ResourcesのシンプルさとAssetBundleの自由度を実現したAddressable Assetsとは(脱Preview記念リライト)【Unity】【Addressable Assets】 - (:3[kanのメモ帳]" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fkan-kikuchi.hatenablog.com%2Fentry%2FAddressable_Assets_Rewrite" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://kan-kikuchi.hatenablog.com/entry/Addressable_Assets_Rewrite">kan-kikuchi.hatenablog.com</a></cite></p> <h3 id="メモリ管理の仕組み">メモリ管理の仕組み</h3> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="【Unity】Addressableアセットシステムのメモリ管理の仕組み - LIGHT11" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Flight11.hatenadiary.com%2Fentry%2F2020%2F01%2F04%2F193512" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://light11.hatenadiary.com/entry/2020/01/04/193512">light11.hatenadiary.com</a></cite></p> <h3 id="LoadAssetAsync-と-InstantiateAsync-の違い"><span style="color: #1464b3;">LoadAssetAsync</span> と <span style="color: #1464b3;">InstantiateAsync</span> の違い</h3> <p>どこのサイトを探しても見つからなかったので、<br /><span style="color: #1464b3;">LoadAssetAsync</span> と <span style="color: #1464b3;">InstantiateAsync</span> の違いについて付け足しをば。</p> <p>InstantiateAsync は アセットのロードから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>までやってくれるので、<br />対応する ReleaseInstance でもデストロイまでやってくれます。</p> <p>でも、<span style="color: #ff0000;">LoadAssetAsync から Instantiate で実体化したオブジェクトは、<br />ReleaseInstance ではアセットを解放するところまでしかやってくれない</span>です。</p> <p>AddressableAssets をビルドした状態で実行すると、<br />関連づいたマテリアルやスプライトなんかは参照が消えるので見えなくなりますが、<br />オブジェクトは残ったままになります。</p> <p>で、結論的には<br /><span style="color: #ff0000;">LoadAssetAsync 後に Instantiate したオブジェクトは Destroy で消せばOK<span style="color: #333333;">。<br /></span></span>ただし、アセットはメモリにロードしたままになるので、<br />必要がなくなったら、Addressales.Release()で解放しましょう。</p> <h3 id="RetroSpriteAnimatorcs">RetroSpriteAnimator.cs</h3> <p>ドット絵をアニメさせるのにいちいちアニメーター使うのはめんどくさい!<br />というとき用のコードです。詳細は下記。 </p> <p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="【Unity】Animator を使用せずに 2D スプライトアニメーションを実装できる「RetroSpriteAnimator」紹介 - コガネブログ" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fbaba-s.hatenablog.com%2Fentry%2F2019%2F01%2F08%2F090000" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://baba-s.hatenablog.com/entry/2019/01/08/090000">baba-s.hatenablog.com</a></cite></p> <p>このコードですが、<span style="color: #ff0000;">AddressableAssetSystem で使う場合、ビルド時にエラーします</span>。</p> <p>理由は UnityEditor でしか使えない<br />AssetDatabase を OnValidate メソッドで使ってるからです。</p> <p>OnValidate自体、UnityEditor上でしか読み込まないメソッドのはずなんですが、<br />どうもビルド時に走るようで、それでエラーしてる模様。</p> <p>なのでOnValidate メソッドを  <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%EA%A5%D7%A5%ED%A5%BB%A5%C3%A5%B5">プリプロセッサ</a> UNITY_EDITOR でくくれば解決。<br /><span style="color: #1464b3;">#if UNITY_EDITOR ~ #endif</span> ってやつです。</p> <h3 id="UniTask-との連携">UniTask との連携</h3> <p>ロード処理を IEnumerator から async ~ await に切り替えるやつです。</p> <p>下記はスライダーでロードゲージを実装して、<br />async な Start メソッドから await を使って呼び出すメソッド。</p> <p>handle.isDone だと 1 にならずに終了するので、handle.PercentComplete を使いました。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20200711/20200711235819.png" alt="f:id:Ashtarte:20200711235819p:plain" title="f:id:Ashtarte:20200711235819p:plain" class="hatena-fotolife" itemprop="image" /></p> <p> このあたりの資料は下記。</p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="コルーチンを全てUniTaskに置き換える - Qiita" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Fpio%2Fitems%2Fda6d56a742b8db79f28b" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://qiita.com/pio/items/da6d56a742b8db79f28b">qiita.com</a></cite></p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="UniTask v2 - Unityのためのゼロアロケーションasync/awaitと非同期LINQ" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftech.cygames.co.jp%2Farchives%2F3417%2F" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://tech.cygames.co.jp/archives/3417/">tech.cygames.co.jp</a></cite></p> <h3 id="他メモ">他メモ</h3> <ul> <li><span style="color: #1464b3;">var handle = Addressables.LoadAssetAsync&lt;GameObject&gt;("Prefab名")</span> の型(var)は<br /><span style="color: #dd830c;">AsyncOperationHandle&lt;GameObject&gt;</span><br /><br /></li> <li><span style="color: #1464b3;">var handles = Addressables.LoadAssetsAsync&lt;Object&gt;("Label名", null)</span> の型(var)は<br /><span style="color: #dd830c;">AsyncOperationHandle&lt;IList&lt;Object&gt;&gt;</span><br /><br /></li> <li><span style="color: #1464b3;">handle = Addressables.InstantiateAsync("Prefab名")</span> は <br /><span style="color: #dd830c;">Addressables.ReleaseInstance(handle.Result)</span> で解放<br /><br /></li> <li>handle  = Addressables.LoadAssetAsync&lt;GameObject&gt;("Prefab名") 後に<br /> <span style="color: #1464b3;">Instantiate</span> したゲームオブジェクトは <span style="color: #dd830c;">Destroy(ゲームオブジェクト)</span>で消去可。<br /><span style="color: #673ab7;">アセットの解放は Addressables.Release(handle.Result)</span>。<br /><br />解放するとゲームオブジェクトに紐付けされた画像などの素材はすべて消える。<br />ただし <span style="color: #ff0000;">Addressable Groups の Play Mode Script が Use Existing Build 以外では消えない</span>ので注意。</li> </ul> <ul> <li>実際にデータベースを組もうとしてつまづいた際にまとめた補足<iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="【Unity】AddressableAssetSystemメモ - sound sepher's PASTIME" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fashtarte.hateblo.jp%2Fentry%2F2020%2F07%2F16%2F032701" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://ashtarte.hateblo.jp/entry/2020/07/16/032701">ashtarte.hateblo.jp</a></cite></li> </ul> <p> </p> <p> </p> Ashtarte 【Unity】AddressableAssetで詰まったところメモ hatenablog://entry/10257846132698072515 2019-01-05T17:37:58+09:00 2020-07-18T16:00:25+09:00 PreloadDependenciesについて <ul class="table-of-contents"> <li><a href="#PreloadDependenciesについて">PreloadDependenciesについて</a></li> </ul> <p> AddressableAssetっていう便利そうな機能があるので、いまさらメモリ管理にAssetBundle使うというのもどうかなと思っていろいろ試してるなか、Addressables.ReleaseAssetの挙動で詰まりました…。</p> <p> この命令はResources.UnloadAssetのかわりの命令ということで、同様の命令をかければ例えばスプライトがその場で消えるのかな? と思ったら、まったく消えないんですよね。同じじゃなかったのかよ! と、気になって色んなパターンを試しました。</p> <p> 以下、模索中のツイート。UnloadAssetと完全に同じ挙動するよ! という方がおられましたら、ぜひ教えてください…。</p> <p><a href="https://twitter.com/Jun_A_sakamoto/status/1081435673729495040">https://twitter.com/Jun_A_sakamoto/status/1081435673729495040</a></p> <p><a href="https://twitter.com/Jun_A_sakamoto/status/1081445570084929536">https://twitter.com/Jun_A_sakamoto/status/1081445570084929536</a></p> <p><a href="https://twitter.com/Jun_A_sakamoto/status/1081463820185362433">https://twitter.com/Jun_A_sakamoto/status/1081463820185362433</a></p> <h4 id="PreloadDependenciesについて">PreloadDependenciesについて</h4> <p> こちら、いつのタイミングからかわかりませんが、PreloadDependencies&lt;TObject&gt;(....)のTObjectの部分が省略できなくなったっぽいです。0.5.3確認。SpriteならSpriteと明示してやらないとエラー吐く様子なので、10月以前のスライドや情報を頼りに使おうとすると使えなさそう…たぶん…よくわからないけど使えませんでした…。</p> Ashtarte 【ADX2】CriAtomCraftでプレビュー再生できなくなる問題の改善方法 hatenablog://entry/10257846132688660078 2018-12-23T00:18:17+09:00 2018-12-23T00:26:53+09:00 さいきんUnity勉強するついでにADX2もやろうと思いまして、ADX2LEを落として組み込もうとしたのですけども。 いやまあ、もともと仕事でちょっとADX2使ってたので「簡単にいけるだろ~」と思って油断してたら… AtomCraftのプレビュー再生でまさかの事態。「プレビュープロセスへの接続に失敗しました」とは…? 最初の一発再生したあと2度め以降はこの表示が出てきて使えないんですね。 原因 いろいろ試行錯誤した結果、結論としては「AVGの挙動監視シールドに引っかかった」でした。アンチウイルスのせいか~! 改善方法 AtomCraftはプレビュー再生に「AtomPreviewer_PC.ex… <div class="entry-content"> <p><br /> さいきんUnity勉強するついでにADX2もやろうと思いまして、ADX2LEを落として組み込もうとしたのですけども。</p> <p> いやまあ、もともと仕事でちょっとADX2使ってたので「簡単にいけるだろ~」と思って油断してたら…</p> <p><img class="hatena-fotolife" title="f:id:Ashtarte:20181223001311j:plain" src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20181223/20181223001311.jpg" alt="f:id:Ashtarte:20181223001311j:plain" /></p> <p> AtomCraftのプレビュー再生でまさかの事態。「プレビュープロセスへの接続に失敗しました」とは…? 最初の一発再生したあと2度め以降はこの表示が出てきて使えないんですね。</p> <h4>原因</h4> <p> いろいろ試行錯誤した結果、結論としては<strong>「<a class="keyword" href="http://d.hatena.ne.jp/keyword/AVG">AVG</a>の挙動監視シールドに引っかかった」</strong>でした。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%F3%A5%C1%A5%A6%A5%A4%A5%EB%A5%B9">アンチウイルス</a>のせいか~!</p> <h4>改善方法</h4> <p> AtomCraftはプレビュー再生に「AtomPreviewer_PC.exe」を使ってるのですが、これを<a class="keyword" href="http://d.hatena.ne.jp/keyword/AVG">AVG</a>が強制隔離して使えなくしてたようなのですね。1回使用した瞬間に「cri\tools\criatomex」フォルダから抹消されます。ですので、<strong>「メニュー」→「設定」→「一般」→「例外」でAtomCraft等が配置された「cri\tools\criatomex」を例外に追加する</strong>ことで動作するようになります。</p> <p><img class="hatena-fotolife" title="f:id:Ashtarte:20181223000258p:plain" src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20181223/20181223000258.png" alt="f:id:Ashtarte:20181223000258p:plain" /></p> <p><img class="hatena-fotolife" title="f:id:Ashtarte:20181223000459p:plain" src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20181223/20181223000459.png" alt="f:id:Ashtarte:20181223000459p:plain" /></p> <h4>wavも再生できなくなる</h4> <p> ちなみに原音再生もaifは正常に再生できるのですが、例外追加以前はwavも再生できません。なので、原音再生されないようなら、たぶんこのあたりに問題があるかもです。</p> </div> Ashtarte 【雑記】RPGを個人で作るための4つのノウハウ(+アドバイス10点) hatenablog://entry/10257846132646636089 2018-10-06T13:24:43+09:00 2018-10-06T13:26:23+09:00 箱セレで経験した問題を踏まえて、RPG個人開発において「これだけはやってはいけない」「これをやるならこうしよう」という要素をザックリまとめておきます。すべて僕の失敗経験を通したノウハウなので、これからゲームを作る人、今作ってる人も、よかったら参考にして頂けたら幸いです。 目次 マップ作りに凝りすぎるな 人形劇はコスパが悪い パラメータ管理は適当にやるな 作り手の人的リソースは一番重要な箇所にだけかけろ 今後ゲームを作りたい人向けのアドバイス まとめ 1.マップ作りに凝りすぎるな RPGツクールやウディタで作るなら、デフォルト素材やフリー素材、販売素材でなんとかしましょう。確かに見た目は量産型に… <p> 箱セレで経験した問題を踏まえて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RPG">RPG</a>個人開発において「これだけはやってはいけない」「これをやるならこうしよう」という要素をザックリまとめておきます<strong>。すべて僕の失敗経験を通したノウハウ</strong>なので、これからゲームを作る人、今作ってる人も、よかったら参考にして頂けたら幸いです。</p> <h4>目次</h4> <ol> <li>マップ作りに凝りすぎるな</li> <li>人形劇は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%B9%A5%D1">コスパ</a>が悪い</li> <li>パラメータ管理は適当にやるな</li> <li>作り手の人的リソースは一番重要な箇所にだけかけろ</li> <li>今後ゲームを作りたい人向けのアド<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a></li> <li>まとめ</li> </ol> <h4>1.マップ作りに凝りすぎるな</h4> <p> <a class="keyword" href="http://d.hatena.ne.jp/keyword/RPG%A5%C4%A5%AF%A1%BC%A5%EB">RPGツクール</a>やウディタで作るなら、デフォルト素材やフリー素材、販売素材でなんとかしましょう。確かに見た目は量産型になるかもしれませんが、そこにこだわると、作業量が倍々に積み重なって、終わらなくなります。<strong>僕の場合はボツ・試作込みで最低でも40000パーツ作りました。</strong></p> <p> もしオリジナルのゲーム画面にこだわりたいなら以下を守ること。</p> <ol> <li>レイヤーを使わない。1レイヤー範囲内で作れる仕様にすること。</li> <li>マップを絵で表現するならとにかく流用できる設計にすること。</li> <li>ドット絵でもバリエーションを作らず、流用できる設計にすること。</li> </ol> <h4>2.人形劇は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%B9%A5%D1">コスパ</a>が悪い</h4> <p> なるべく紙芝居にしましょう。キャラを動かすのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>でかなり苦労します。<strong>いちいち計算しながら何十個、何百個とイベントを作っていくのはキツイ</strong>です。1イベント作るのに何時間かかるのだろう?</p> <h4>3.パラメータ管理は適当にやるな</h4> <p> 自力で入力する要素を極力排除すること。</p> <p> 敵モンスターを100体、200体と作る段階でデータ的な個性付けをするのに、基準を設けましょう。</p> <p> 最低でも、基本パラメータを設計すること。何百体とパラメータを入力し続けるのは苦痛ですし、バランス調整する際、ある程度全体をオートメーション的に調整できる設計にしておかないと、いちいち関連する値を数百体ぶん書き換えることになります。</p> <p> 敵の行動パターンも同様。設計をある程度しておかないと、何百パターン、何千パターンと自力で書き込んで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>することなります。</p> <p> 解決策は、個性パターンをあらかじめ設計して、敵の強さにあてはめて、その上から少し人間味をつけるといった調整をつけることかなと、現時点は考えています。</p> <h4>4.作り手の人的リソースは一番重要な箇所にだけかけろ</h4> <p> コンシューマ<a class="keyword" href="http://d.hatena.ne.jp/keyword/RPG">RPG</a>に出てくる要素を一人で作ろうとするのは避けるべきです。あれらは複数人が同時に並列で作業することで製作スピードを上げているので、一人で直列作業しようとすると、つまり作業負担が倍々ゲームになっていきます。</p> <p> とにかく設計段階で、あらゆる要素を自動化しましょう。PCが計算して結果を出せる事項は、ぜんぶプログラムに任せましょう。</p> <p> それができないなら、一度事前にバランスを取って、決め打ちして作りましょう。<strong>人間は絶対にやらなきゃいけないことだけやればいい</strong>。</p> <h4>5.今後ゲームを作りたい人向けのアド<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a></h4> <ol> <li>一人で作るなら、とにかく一点突破型を作ること</li> <li>「作ってます」と公に発言するのは、動くゲームを見せられるようになってから</li> <li>個人制作ゲームは短編で十分に需要を満たせる</li> <li>お金をかけるならキャ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>ターイラスト</li> <li>皆が「おおっ」と言うのはイラスト。見える要素が一番伝わりやすい</li> <li>コンテスト向けのゲームは、ストーリーとキャ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>ターに集中すること</li> <li>どこに投下するにしろ、システム重視のゲームはウケが悪い</li> <li>リアルイベント展示では、アクションゲームや<a class="keyword" href="http://d.hatena.ne.jp/keyword/STG">STG</a>のほうがウケがいい</li> <li>動画映えするポイントと、静止画映えするポイントを意図的に作ること</li> <li>本当に作りたいものを作るなら、生活に負担をかけない範囲で、趣味でやろう</li> </ol> <h4>6.まとめ</h4> <p> 割と周囲から心配されつつ開発を続けてきましたが、実は17年8月に操業資金が底をついて、廃業寸前の地獄を味わいました。今は運良く様々な方に助けて頂いて完全回復しているのですが、やっぱり精神的にかなりキツイというか、必死になりすぎて周りが見えなくなってしまい、よりマイナス方向に落ちていくので、余裕をもってやるのが良いです。</p> <p> そのためには(良い意味で)手を抜くこと。がんばりすぎないこと。やりたいことだけをゲームにすること。要素を増やさないこと。一極集中して、短期間で仕上げること。</p> <p> 時間=お金です。とにかく時間をかければかけるほどキツくなっていくので、手早く仕上げられる設計をあらかじめ考えて、ゲームを作りましょう。それに尽きます。</p> <p> 僕自身も、次はもっと簡単に作れるものを作る予定です。やりたいこと以外は全部自動化しようかなーと。そう考えてます。</p> <p> 一言で表せば、<strong>「無理すんな!」</strong>というわけなのでありましたとさ。</p> Ashtarte 【雑記】やっとゲームをリリースできました、という苦労話 hatenablog://entry/8599973812338605413 2018-01-18T09:00:09+09:00 2018-01-18T09:00:09+09:00 長かった、4~5年作ってた気がする。まだ終わってはいないけど。作ろうと志して10年かかりました。ちなみに挫折履歴とやりたかったことは下記。 挫折履歴 2008年 プログラマと共同制作、連絡が取れなくなって挫折 2009年 プログラマと共同制作、最終的にうやむやになって挫折 同年 他人と組むのを諦めてツクールVXで組み始めて、理解できなくて挫折 2011年 会社を辞めて独立、ツクールVXAで組み始める 2012年 ↑スクリプトの理解度の問題で挫折 同年 ウディタで組み直し始める 2014年 ついに箱庭セレナータ体験版までこぎつける 2018年 悪戦苦闘の末、やっと本編ひとあそびverリリース や… <p> 長かった、4~5年作ってた気がする。まだ終わってはいないけど。作ろうと志して10年かかりました。ちなみに挫折履歴とやりたかったことは下記。</p> <h4>挫折履歴</h4> <ul> <li>2008年 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>と共同制作、連絡が取れなくなって挫折</li> <li>2009年 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>と共同制作、最終的にうやむやになって挫折</li> <li>同年 他人と組むのを諦めてツクールVXで組み始めて、理解できなくて挫折</li> <li>2011年 会社を辞めて独立、ツクールVXAで組み始める</li> <li>2012年 ↑<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>の理解度の問題で挫折</li> <li>同年 ウディタで組み直し始める</li> <li>2014年 ついに箱庭セレナータ体験版までこぎつける</li> <li>2018年 悪戦苦闘の末、やっと本編ひとあそびverリリース</li> </ul> <h4>やりたかったこと</h4> <ul> <li>3Dダンジョン<a class="keyword" href="http://d.hatena.ne.jp/keyword/RPG">RPG</a>作りたかったのに、いつのまにか2DRPGを作ってた</li> <li>2Dやるなら本格的な昔ながらの<a class="keyword" href="http://d.hatena.ne.jp/keyword/RPG">RPG</a>が作りたい</li> <li>でも、見た目は今風な感じにしたい、キャラ絵とか</li> <li>女性にも遊んでもらえるような見た目にしたい</li> <li>レベル上げしてもしなくてもクリアできて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RTA">RTA</a>もできるやつにしたい</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%E7%A5%D6%A5%C1%A5%A7%A5%F3%A5%B8">ジョブチェンジ</a>、スキルシステムを自分なりに読み解いたものにしたい</li> <li>何度も遊べる作りにしたい</li> </ul> <h4>苦労話</h4> <p> 音楽の仕事していて、どうしてもミスマッチ感をかんじていたというか、他の人とのズレをすごく感じてました。</p> <p> 音楽ってゲーム開発とはだいぶ切り離された独立した分野で、最終的には生演奏・ライブ・スタジオで収録なんかの、完全に音楽音楽した方向に行かざるを得なかった。</p> <p> みながそっち方面にどんどん進出していくなか、「あれっ、僕はゲームが作りたかったんだけどなぁ」「これ、違うな…」っていう思いがすごく強くなっていって。求められることとやりたいことのズレをどんどん強く感じるようになっていったのでした。</p> <p> そのズレを解消するために、開発人数の少なく、より深く介入しやすい個人制作ゲームの仕事を受けたりしつつ、お仕事で得た収入をゲーム制作に投入していった、というのが独立してからの自分なのでありました。</p> <p> かといって<strong>投資者からお金を募って作ると、僕のゲームではなくなる</strong>。お金を出した人が一番偉いし、権利はそこへ行ってしまう。僕が考えたものなのに僕が関われなくなる可能性が1%でもあるなら、それはイヤなので。<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>と組んだら、僕自身の成長がない</strong>。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>がいなくなれば、僕はゲームが作れなくなる。</p> <p> なので、当時30歳っていう微妙な年齢ですけども、ゼロからやり直すことにしました。つまり<strong>「自分でも扱えるエンジンを探して」「一人で作る」。</strong></p> <p> <a class="keyword" href="http://d.hatena.ne.jp/keyword/XNA">XNA</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Flash">Flash</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%23">C#</a>、いろいろ探りましたけど、プログラムのプの字もわからない僕には全然ダメでしたね。ツクールも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>いじりまで行くと、途端にわからなくなる。</p> <p> けっきょく永い挫折を経て、ウディタに辿り着きました。これなら動かせると。</p> <p> あとは実際にドット絵を自分で打って、UIを手探りで作ってを繰り返しながら、どうしても作れないイラスト周り、エフェクトを他の方に手伝って頂くことにしました。</p> <p> <strong>エンジン部を(ゲームが作りたい奴が)自分でいじれるなら、ゲームは完成できる。</strong></p> <p> 永らく抱えてたミスマッチ感を、これでようやく解消できた気がします。音楽の仕事は音楽の仕事。ゲーム開発はゲーム開発として切り離すことで、ピントをあわせることができた。</p> <h4>思ったこと</h4> <p> <strong>めっちゃ金がかかる</strong>。生活費です。<strong>ゲームを作ってる間は無収入</strong>なので。個人制作はちびちびとしか開発が進まない。結果、時間が半端なくかかる。一時期、貯金が底をついて、こいつはまずいな…と思ったこともありました。お金がないときの精神的重圧はやばいです。</p> <p> <strong>働きながらゲームを作るのは、かなりしんどい</strong>ですね。</p> <h4>今後の目標</h4> <p> これからやるべきことは、すこしでもいいから<strong>ゲームで収入を得て、ゲームを作りやすくする</strong>ことかなぁ…と。</p> <p> あと、<strong>ゲームの開発速度を上げる</strong>こと。時間がかかりすぎるのはキツイ。半年にひとつくらいのペースで出せるくらいのノウハウを作りたい。時間かかかると、お金もかかるので。</p> <p> だいたいそんな感じですね。ひとまず、今思ってることを記録に残しておきます。</p> Ashtarte 【ツクール・ウディタ・スマビル向け】oggファイルにループメタデータを書き込むラクな方法 hatenablog://entry/8599973812330923249 2017-12-28T19:13:41+09:00 2017-12-28T19:13:41+09:00 というわけで、今回は自分用のメモです。PC移植のときに設定方法を忘れて悩んだので、備忘録的に。 ツクール発祥のメタデータ「LOOPSTART / LOOPLENGTH」 サンプル単位でループできる便利な仕様のコレですが、oggにメタデータを書き込むのって、ちょっと面倒。SuperTagEditorでは指定されたメタデータしか埋め込めないですし。 foobarやいくつかの他のツールでも行けるんですが、「リスト化してループを取れない」という面倒さがあります。ファイルをひとつひとつ、専用のウィンドウを開いて手打ちしていく…めんどくさい! MP3TAG - コピペ一発埋め込みできる便利ツール それを解… <div class="entry-content"> <p> というわけで、今回は自分用のメモです。PC移植のときに設定方法を忘れて悩んだので、備忘録的に。</p> <h4>ツクール発祥の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>「LOOPSTART / LOOPLENGTH」</h4> <p> サンプル単位でループできる便利な仕様のコレですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ogg">ogg</a>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>を書き込むのって、ちょっと面倒。SuperTagEditorでは指定された<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>しか埋め込めないですし。</p> <p> foobarやいくつかの他のツールでも行けるんですが、「<strong>リスト化してループを取れない</strong>」という面倒さがあります。ファイルをひとつひとつ、専用のウィンドウを開いて手打ちしていく…めんどくさい!</p> <h4>MP3TAG - コピペ一発埋め込みできる便利ツール</h4> <p> それを解決するのが、<a href="https://www.gigafree.net/media/mu/mp3tag.html"><strong>MP3TAG</strong></a>です。あらゆるサウンドファイルの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>を自由に設定し、書き換えられる便利ツール。</p> <h4>使い方</h4> <p> 言葉で説明するより図で見せたほうが早いので、サンプルをのせます。</p> <p> 左側が「タグパネル」、右側がリストです。</p> <p align="center"><img class="hatena-fotolife" title="f:id:Ashtarte:20171228190652p:plain" src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20171228/20171228190652.png" alt="f:id:Ashtarte:20171228190652p:plain" /></p> <p align="center"><img class="hatena-fotolife" title="f:id:Ashtarte:20171228190718p:plain" src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20171228/20171228190718.png" alt="f:id:Ashtarte:20171228190718p:plain" /></p> <p align="center"><img class="hatena-fotolife" title="f:id:Ashtarte:20171228190741p:plain" src="https://cdn-ak.f.st-hatena.com/images/fotolife/A/Ashtarte/20171228/20171228190741.png" alt="f:id:Ashtarte:20171228190741p:plain" /></p> <h4>ポイント</h4> <p> カラム側はリストのカラム部分で「右クリック」→「カラムの表示項目を編集」でいけます。名前はカラムの表示名、値とフィールドは必ず<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%E5%B5%AD">上記</a>のように入力してください。<strong>小文字にすると、ツクール・ウディタ・スマイルゲームビルダー側では認識しません。</strong></p> <p> </p> <p> というわけで、ループポイントを取ったら、その値をそのまま<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>にコピペすれば一括参照・即登録できるようになる、mp3tagの紹介でした。</p> </div> Ashtarte 洋RPGに興味をもっている昨今 hatenablog://entry/8599973812299216171 2017-09-18T18:43:31+09:00 2017-09-18T18:43:31+09:00 あとあと忘れないように備忘録に。 ゲームを作っていて、やっぱり既存カテゴリ内でものづくりをしていると、「知っている範囲内でちょっと仕組みを入れ替えたもの」しか作れないな~という感じがしていて。 もう少し視野を広く取っておいたほうがのちのちのためになるであろう。と思って、色々調べ回った結果、「洋ゲーが面白そう」と。 もちろんオブリビオンとかスカイリム、Fallout3やNVなんかは遊んでたんですけど、それ以上調べようとしてなかったんですよね。なので、調べ直しました。 洋RPGには大別してオブリビオン型とバルダーズゲート型とディアブロ型がある 一人称視点でも三人称視点でも構いませんがオブリビオン型… <p> あとあと忘れないように備忘録に。</p> <p> ゲームを作っていて、やっぱり既存カテゴリ内でものづくりをしていると、「知っている範囲内でちょっと仕組みを入れ替えたもの」しか作れないな~という感じがしていて。</p> <p> もう少し視野を広く取っておいたほうがのちのちのためになるであろう。と思って、色々調べ回った結果、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%CE%A5%B2%A1%BC">洋ゲー</a>が面白そう」と。</p> <p> もちろん<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%EA%A5%D3%A5%AA%A5%F3">オブリビオン</a>とかスカイリム、Fallout3やNVなんかは遊んでたんですけど、それ以上調べようとしてなかったんですよね。なので、調べ直しました。</p> <h4>洋<a class="keyword" href="http://d.hatena.ne.jp/keyword/RPG">RPG</a>には大別して<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%EA%A5%D3%A5%AA%A5%F3">オブリビオン</a>型とバルダーズゲート型と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%A2%A5%D6%A5%ED">ディアブロ</a>型がある</h4> <p> 一人称視点でも三人称視点でも構いませんが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%EA%A5%D3%A5%AA%A5%F3">オブリビオン</a>型と、アイソメトリック(見下ろし型)視点でシミュレーション風戦闘のバルダーズゲート型、ガチアクションの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%A2%A5%D6%A5%ED">ディアブロ</a>型がある様子。</p> <p> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%EA%A5%D3%A5%AA%A5%F3">オブリビオン</a>型とバルダーズゲート型は、たぶん<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%EB%A5%C6%A5%A3%A5%DE">ウルティマ</a>7の影響がかなり色濃いのかな。突き放されてる、時間の概念、ク<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>ト請負型という部分で共通していて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%EA%A5%D3%A5%AA%A5%F3">オブリビオン</a>型は戦闘がアクション。バルダーズゲート型はそれにD&amp;D要素を強く足したシミュレーション風戦闘が加わって、高難易度の戦闘を工夫しながら打破していく…という形式なのかなーと。</p> <p> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%A2%A5%D6%A5%ED">ディアブロ</a>は突発的に生まれたようなイメージがあるんですけど、あの考え方は一体どこからきたんだろう。またおいおい調べたい。</p> <h4>確かに洋<a class="keyword" href="http://d.hatena.ne.jp/keyword/RPG">RPG</a>にはターン戦闘のシステムがほとんどない</h4> <p> そのかわり、リアルタイム<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%EF%C6%AE%C3%E6">戦闘中</a>に一時的に時間停止して仲間に命令するという、和<a class="keyword" href="http://d.hatena.ne.jp/keyword/RPG">RPG</a>だと<a class="keyword" href="http://d.hatena.ne.jp/keyword/FF12">FF12</a>(に近い)を想像すると理解しやすい仕組みが導入されてるみたい。</p> <p> バルダーズゲート、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%E9%A5%B4%A5%F3%A5%A8%A5%A4%A5%B8">ドラゴンエイジ</a>、ピラーズオブエタニティ的な、あのあたりで使われてるルールの様子。ルールの元ネタはD&amp;Dみたい。</p> <p> ターン戦闘は古いと言われて久しいですが、なるほど海外ではリアルタイム+ターン戦闘の間の子がメジャーなのかと。マイトアンドマジックも6あたりからリアルタイムとターン戦闘をオンオフで切り替えられるようになったらしいですし。</p> <p> 日本と大きく違うのは、距離の概念やマップ環境を利用した戦闘っていう要素がかなりフィーチャーされてるところなのかなあ。まだ実際にバルダーズゲート型のゲームを遊んだことがないので、このへんはちゃんと触ってからかな。</p> <h4>いま気になってるゲーム</h4> <h5>ピラーズオブエタニティ</h5> <p> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AD%A5%C3%A5%AF%A5%B9%A5%BF%A1%BC%A5%BF%A1%BC">キックスターター</a>で416万ドル集めたモンスタータイトル。バルダーズゲートの影響を色濃く受けたタイトルで、D&amp;D風戦闘システム、敵リポップなしなどの仕様も共通。</p> <p> レビューを見回った感じだと、バルダーズゲートより若干マイルドになってる…みたいな話が出て来るけど、どうなんだろう。</p> <p> 公式では日本語対応してないけど、有志が日本語化パッチを作ったらしいのでばっちり日本語で遊べるみたい。</p> <h5>ディヴィニティ オリジナルシン</h5> <p> すでに2がリリース済み。日本では去年、1の日本語版がリリースされたとか。こちらは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%CE%A5%B2%A1%BC">洋ゲー</a>あるあるのク<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>ト目標位置表示がなく、自分の足で情報を集めて、推測して攻略する、バルダーズゲート型のなかでもガチな部類のタイトルの様子。めっちゃ難しいらしい。</p> <h5>バルダーズゲート エンハンスドエディション</h5> <p> 13年頃にリメイク版が出たんですね。すごく難しいと聞くので、先にピラーズオブエタニティを遊んでからのほうが良いのかなぁ…などと考えつつ。</p> <p> 1は公式で日本語対応していて、2はパッチで日本語対応可とのこと。しかし、日本の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%CE%A5%B2%A1%BC">洋ゲー</a>マーの翻訳能力はすごい。</p> <h5>マイトアンドマジックXレガシー</h5> <p> 3Dダンジョン探索<a class="keyword" href="http://d.hatena.ne.jp/keyword/RPG">RPG</a>に、その場で戦闘する仕組みが加わったマイトアンドマジックシリーズの新作。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%A3%A5%B6%A1%BC%A5%C9%A5%EA%A5%A3">ウィザードリィ</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%EB%A5%C6%A5%A3%A5%DE">ウルティマ</a>はブランド的な血脈はほとんど止まってますけど、マイトアンドマジックは直系とストラテジーのヒーローズで続いてるんだなあ。</p> <p> バルダーズゲート型と違ってキャラクターの立ち位置が同じグリッド内なので、タンクを前列に立たせて防御を引き受けて後列から魔法…みたいな戦闘はできないみたい。</p> <h4>補記</h4> <p> もうずいぶん前の話になりますが、ウィッチャー3、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%E9%A5%B4%A5%F3%A5%A8%A5%A4%A5%B8">ドラゴンエイジ</a>インクイジションが面白すぎてびっくりしたんですよね。</p> <p> 最近だとホライゾンゼロドーンも凄まじかったですが、2013年以降、<a class="keyword" href="http://d.hatena.ne.jp/keyword/PS4">PS4</a>にシーンが移ってからあたりのタイトルは調べた限りハズレ無しみたいなので、趣味兼勉強用にバルダーズゲート一派もあそんでみようかな~と考えてる…という今日このごろなのでした。</p> Ashtarte