Unity初心者の俺が調べたことをメモするスレ (99レス)
Unity初心者の俺が調べたことをメモするスレ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
15: 名前は開発中のものです。 [sage] 2023/09/04(月) 22:59:12.23 ID:8vO4bi2+ 書こうと思ったけどTMP・文字列・GCの復習をしていたら時間がなくなったから今日は終わり! http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/15
16: 名前は開発中のものです。 [sage] 2023/09/04(月) 23:14:20.64 ID:DD6FCi8L てかUnityというより C#の仕様 http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/16
17: 名前は開発中のものです。 [sage] 2023/09/05(火) 22:27:53.86 ID:1xAiAK3x いまシステム面とUIを重点的に作ってるからどうしてもC#寄りになるね その5はまとめられてないからUnityのマジックメソッドについて少し StartやUpdateといったUnity独自の関数はランタイムによってゲーム実行時 (?)だったかに呼び出しリストが作成される Unityの内部クラスが呼んでる訳ではないのでこれらのマジックメソッドはprivateでも呼び出しが行われる 逆にこれが原因なのか、通常の関数より呼び出しコストが高い Update100個より1個のUpdateが100個の独自アプデ関数呼ぶ方がコール回数が1回多いはずなのに動作が軽いのは有名な話(らしい) 加えてawake OnEnable startの呼び出し順には多少注意が必要かもしれない 具体的にはStartよりOnEnableの方が早いので、Startで外部参照の設定するコードを書いてると先にOnEnableが呼ばれてヌルリファだったり意図しない挙動が起きがち メニュー画面などのUI要素をGameObject.SetActiveで有効無効を切り替えてその際にOnEnable/OnDisableで初期化や再設定を行う設計を採っている時は扱いに注意(n敗) ちなみにアセットのサンプル見てたら、OnEnableでコルーチン呼んで1f待機することで先に確実にStartを通す設計をしているものが見つかった 無理やりな気もするけどどうなんだろうね http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/17
18: 名前は開発中のものです。 [sage] 2023/09/05(火) 22:33:42.70 ID:Ts+LtVa/ UIやってるなら今ならちょうど ユニティ・テクノロジーズ・ジャパンは、日本語の電子書籍『Unityにおけるユーザーインターフェースのデザインと実装』を無料で提供。専用ページから申し込めばダウンロードできるようになりました てことで無料で見られるよ Startを1frame待つのは理にかなってるんじゃないかな Start関数は画面表示前の処理だし、1frameということは表示してからだから 確実だよね http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/18
19: 名前は開発中のものです。 [] 2023/09/05(火) 22:42:05.64 ID:JlRpf2nJ >>18 マジか 良いこと聞いた http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/19
20: 名前は開発中のものです。 [sage] 2023/09/06(水) 22:29:47.35 ID:xeaBYfjk >>18 情報サンクス 早速ダウンロードしてみたわ UIToolKitはまだ全く手付かずだからどういうものか早く勉強しないとなあ サンプルシーンで1f待ってるのはStartじゃなくてOnEnableね そのサンプルはアイテム管理システムで、マネージャークラスがOnEnableでコルーチンで1f待機している間に、ゲーム開始後に道具メニューを開いた時に初めて生成されるアイテム表示用プレハブたちがStartで参照情報をマネージャーに渡してくる設計になっていた マネージャーのOnEnableでプレハブの描画更新とイベントへのデリゲートの登録をやってるので、仮に1f待機がないとプレハブが生成される最初の1回目だけ参照情報をまだ受け取っておらずヌルリファが発生するからだと思われる その5 「抽象クラスの個人開発における利点がよく分からない」 まとめというより疑問に近い。 抽象クラスのメリットを調べると、大抵のサイトや記事では「抽象化によって複数人の開発で統一が取れたコードが作成できる」といった内容が挙げられている。では、個人開発における抽象クラスの利点は何なのだろうか。 結論から言うと調べても自分にはあまり理解できなかった。「無い」や「殆ど無い」としている記事も散見される。 というのも、単に複数のクラスで共通したルールを実装したいなら純粋に基底クラスを継承して利用すればだいたい足りる気がする。 たしかに抽象クラスで関数の名称やシグネチャなどを設定して派生クラスにそれに沿った実装を強制するのは、コードの統一性を確保する上では有用ではあるが、個人開発だとコードを弄るのは基本的に自分だけなので、自分で注意すればよくない?という気も まあC#に限らずヒューマンエラーを防げます系機能は究極的には全部「自分で注意すりゃよくない?」になるし、もちろん自分にそんな神みたいなこと無理なんで…(OnEnableとStartで何回もエラー引き起こす程の低い注意力) 自分としては抽象クラスは「インスタンスは絶対これで生成しないけど共通・統一された処理を実装したい」ケースでお守り的に使っていこうかなと思った(適当) http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/20
21: 名前は開発中のものです。 [sage] 2023/09/07(木) 23:01:59.92 ID:zzCLMbJH 眠いから雑なぼやき シングルトンを初めて自分のゲームに導入してみた。理由はどういうものか使ってみたかったから。 戦闘システム管理クラスをシングルトンにした。戦闘キャラクラスからたくさんアクセスする。 これが密結合か? グローバル変数化を目的として作っちゃいけないという話は聞いたことあるけど、これもその一つかもしれない。 この辺のコード作成のパターンの理念について何も知らないからそろそろ勉強するときかなあ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/21
22: 名前は開発中のものです。 [sage] 2023/09/08(金) 22:50:45.01 ID:whCfvpks GCalloc(ヒープメモリアロケーション)にまとめたいけどまだ理解が足りていない 今日は有料アセットのGCalloc潰しを中心に作業をしたが、フィールドのList<構造体>をSortする箇所でアロケーションが発生する理由がイマイチよく分からなかった 引数としてデリゲートを渡すとアロケーションが発生するのはその都度コンパイラがnewしてしまうからで、「デリゲートの代わりにメンバを参照しないラムダ式を利用する」と初回のみのアロケーションで済むらしい 実際ラムダ式に変えたら毎フレームのGCallocが消えたのだが、「IComparerを実装したクラスのインスタンスを利用する」という方法もあると聞き、こちらも試してみたところGCallocは消えないどころか増えた なんかボックス化というものが絡んでいるような気もするがよく分からないので今日はこれで終わり http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/22
23: 名前は開発中のものです。 [sage] 2023/09/09(土) 23:03:59.62 ID:DhDPacVH GCalloc潰し二日目 昨日IComparerでGCallocが防止出来なかった理由については未だに分かっていない(というか殆ど調べていない) 「ラムダ式でメンバを参照する」コードを複数の有料アセットで見かける GCalloc対策の話題でまず槍玉に上がる点だと思うのだが、あまり気にされていない・自分が気にしすぎなのだろうか? http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/23
24: 名前は開発中のものです。 [sage] 2023/09/09(土) 23:10:00.18 ID:O6P9FobY えーと 研究者なら気にしてもいいかと アプリ開発するなら今のハード考えると気にし過ぎじゃね てか気にする必要ないでしょ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/24
25: 名前は開発中のものです。 [sage] 2023/09/09(土) 23:34:12.06 ID:DhDPacVH >>24 やっぱり気にし過ぎかなあ 特に今作っているゲームはPC向けだから尚更処理落ちやクラッシュはし辛いだろうし 一応自分でコード書く時はアロケーションは基本的に避けるようにしてるけど、有料アセットまで潰して回る必要はないか http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/25
26: 名前は開発中のものです。 [] 2023/09/09(土) 23:46:32.90 ID:tG9qh3d0 ガベージコレクションなんかC#の基本なんだから気にしなくていいだろ そんなに嫌ならBurstCompilerでもJobSystemでもECSでも使えば良い http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/26
27: 名前は開発中のものです。 [sage] 2023/09/10(日) 00:04:42.69 ID:u9L0A1tk 結構規模の大きいものを作ってるから可能な限り潰しておきたい感はあるのよね 数時間のプレイに堪えられるような設計にしたい http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/27
28: 名前は開発中のものです。 [] 2023/09/10(日) 00:11:59.35 ID:nCKHuG8g >>27 ECS,BurstCompiler使えよ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/28
29: 名前は開発中のものです。 [sage] 2023/09/10(日) 09:03:38.32 ID:hFRQptHY >>23 かける労力と得られるものが釣り合ってると思えるならそれぞれの判断でいいと思うけどね 今自分の作ってるやつはインクリメンタルGCついてても数分に一回3~7msくらいのGC Collectが発生してて シューティングゲームなんでもう少しGCAlloc潰したほうがいいだろうなと思ってる http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/29
30: 名前は開発中のものです。 [sage] 2023/09/10(日) 15:42:12.07 ID:j4PqFMUR あかん、行こう http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/30
31: 名前は開発中のものです。 [sage] 2023/09/10(日) 21:59:14.98 ID:u9L0A1tk >>28 ECSは全然理解してないし有料アセットとの兼ね合いが悪い(自分で調整できない/作業量多すぎ)だから導入するつもりは現状ないかなあ アセット開発者がDiscordで今からECS対応は難しいって言っているのも見かけたし >>29 どういうコードがGCalloc発生するのか自分で見て覚えていきたいってのもあるし、しばらくは続けようかな シューティングゲームって弾幕GameObjectのinitialize/Destroyやオブジェクトプール行き来のDisable/Enableで最適化が大変そうだなあ 差し支えなければ教えてほしいんだけど重い処理を行っている時ってフレーム毎にどのくらいGCalloc発生してますか? >>30 ? 今日はNPC(アセットのコンポーネント)のUpdate30個をOnUpdateに変えるお試し軽量化をしてみた 0.5msぐらいの改善が見られた 他にも自分のゲームに使用しない無駄な機能がついていたりするから削っていこう アセットに更新があった時に面倒だが、勉強道具にしたり自分で色々と改造したりできるから完全なC#コードが提供されているものは便利(DLLで提供されているものがあるか知らんけど) アセットとC#の話で一つ複雑だなと思うのは、AssemblyDefinitionによってアセンブリが定義・分割されているとアセット側からこちらの自作コードにそのままではアクセスできない点。コード弄り始めた頃は原因が分からなくて四苦八苦した。 自作コードにAssemblyDefinitionsを設定していない場合は自動的にAssembly-Csharpに配置されるが、このAssembly-Csharpと他アセンブリのアクセスは一方通行の関係にある。すなわち、Assembly-Csharpから他アセンブリにはアクセスできるが、他アセンブリからAssembly-Csharpにアクセスすることはできない。 なので自分のコードに弄ったアセット側からアクセスしたい場合は、自分のコードをアセンブリ定義・分割して参照設定を追加するか、自分のコードをアセット側のアセンブリ内に入れる必要がある。 まあむしろアセットでアセンブリ定義・分割されてない方が色々と問題らしいので自分の経験は初心者特有の躓きって感じだな http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/31
32: 名前は開発中のものです。 [sage] 2023/09/10(日) 22:01:38.99 ID:pyk4erDp ところでヌシはタイトルには初心者って書いてるけど 所持がガベージとか気にしないよね? ナニモン? http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/32
33: 名前は開発中のものです。 [sage] 2023/09/10(日) 22:01:57.78 ID:pyk4erDp 所持ちゃう、初心者 http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/33
34: 29 [sage] 2023/09/11(月) 07:46:22.08 ID:2rYAG6dH >>31 大量にオブジェクト扱う部分は全部Burst使ってるから重い部分ではGCAllocは発生してないし、まだ開発序盤で一時的にお試しで入れてるコードやシューティングと関係ないアセットなんかでGCAllocが出てるだけなので参考になりそうな数字は持ってないよ、申し訳ない http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/34
35: 名前は開発中のものです。 [sage] 2023/09/11(月) 21:22:14.79 ID:GchgKIS7 >>34 なるほどありがとう 自分のゲームはだいぶ時間かかりそうだからその間にECSやバーストコンパイラーの仕様や情報が充実するといいなあ >>32 Unity歴5ヵ月弱の初心者だよ 今日はあまり何もしなかった 自作インベントリの検索機能を少し弄ったけど何となく前の仕様の方が使い勝手が良かった気がして結局コードを元に戻した 検索機能を処理する複数のクラスが絡み合っているので(密結合とはこういう状態?)、今後の保守や改良に備えてコードを見直した方がいいかもしれないと思った 自作スクロールの描画処理については既に一部をインターフェースや抽象クラスにしてあるので、検索機能も(今のところ予定はないけど)インベントリ以外に流用することを考えると同じように改良したい ただこの辺はコーディングや設計の思想について先に学ばないと結局グダりそうだね http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/35
36: 名前は開発中のものです。 [sage] 2023/09/11(月) 21:58:09.05 ID:dpI1L58C 歴5ヶ月でインタフェースや抽象クラスとか Unityは浅いけどC#は長い? http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/36
37: 名前は開発中のものです。 [sage] 2023/09/11(月) 22:31:07.12 ID:GchgKIS7 Unity歴とC#歴は同じ プログラミングはキッズの頃にキッズ向け言語とRPGツクールのRGSS(Ruby)を少しやった程度 ただRubyはもう全く覚えてない http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/37
38: 名前は開発中のものです。 [sage] 2023/09/12(火) 22:16:09.67 ID:Agu+xwh8 ジェネリックについての勉強を少し始めた 自作のスクロールを拡張する上で複数の型を扱うことになるかもしれないので、スクロールの抽象クラスに一部ジェネリックの抽象プロパティや抽象メソッドを実装して今後のコーディングを統一的にするのが目的 ジェネリックな関数には制約条件というものが付けられるそうなので、これでスクロールに渡すべき型に特定のインターフェースの実装を要求すればコーディングのミスも減りそう 逆に言うとこれも個人開発だとミスの防止という点以外の利点が分からん…もっと勉強が必要そうだ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/38
39: 名前は開発中のものです。 [sage] 2023/09/12(火) 22:30:53.89 ID:DqJC+Tye すごいなぁ 自分はUnity半年あたりはやっと3DでUnityちゃんが動いて喜んでたわ それで満足してた(笑) http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/39
40: 名前は開発中のものです。 [] 2023/09/13(水) 08:16:34.64 ID:zrU2QrrP 俺も歴同じくらいでほぼほぼchatGPTに聞きながらやってるけど>>1ほど理解せずに進めちゃってる キャラクターをステートマシンで動かしてるんだけど、抽象クラスとジェネリック使う機会あってほー便利だなあって思った気がするな http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/40
41: 名前は開発中のものです。 [sage] 2023/09/13(水) 22:19:12.03 ID:b/7dbaPf >>39 自分は2Dはスキップしてるからその分は早いかもしれないね 2Dの学習が必要かをUnity始める前に少し調べたけど、どちらかというと否定的な見解が多い印象で、UIの制作でどうせその辺やC#を扱う必要も出てくるだろうから最初から3Dで始めた >>40 ChatGPT便利だよなあ 厳密には自分はBingの会話AI(GPT4.0をウェブ検索用にチューニングしたやつ)を使ってるけど(無料だから) 無料版の3.5も試したけどBingと比べて誤情報や変なコードの出現率が高いから断念した ステートマシンって現在の状況をノードで繋いだステートを行き来して色々とするものだっけ?(無知) UnityのAnimator(mecanim)がステートマシンらしいからいずれ覚える必要があるし、自分の作ってるUIも段々と状況設定がゴチャゴチャになってきたからそういうのを勉強して整理しなきゃなあ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/41
42: 名前は開発中のものです。 [sage] 2023/09/13(水) 22:19:25.85 ID:b/7dbaPf 今日やった作業は主に二つ ?ディザ抜きを利用した障害物の透過 シェーダーアセットの基本機能を設定しただけ。キャラクターがワールド上の設置物の影に隠れて見えなくなってしまわないように、カメラ距離でディザリングを行うことで透けて見えるようにした。カスタムシェーダーにも対応してるアセットなので、勉強が進んだらキャラクターを隠しているか等の判定も加えてより高性能なものにしていきたい。 ?UIを実装するクラスの整理 一昨日から引き続きUIのコードを整理した。アイテム欄クラスと検索欄クラスでそれぞれ大体同じ処理を実装しているので、既に継承させていた抽象クラス(基底クラス)を拡張して派生クラスで実装していたコードを半分ぐらい移植した。アイテム欄クラスと検索欄クラスでは扱うコレクションの型が違っていたので(アイテム欄クラスはアイテムのインスタンス、検索欄クラスはintを扱っていた)、この二つのクラスにコレクションを渡すインターフェースをジェネリックを使って<T>にすることで抽象クラス(基底クラス)で処理を統一できた。これを実現するためにジェネリックを調べていたようなものなのでひとまず満足。 ただ渡されたコレクションから描画すべき情報を取得する処理はまだ統一できていないので明日以降に挑戦してみる。 ところでUI(でも何でも)作り始める前にはちゃんと設計図を作成しないとダメだね 検索システムに「ミニメニューを開いて利用するから〜」というテキト−な理由でMiniMenuUIってクラス名つけたんだけど、ふとミニメニューにアイテム並び替え機能も欲しくなって「MiniMenuUI = 検索システム」じゃなくなってしまったから、クラス名を付け直しになった 付け直し自体はVisualStudioのフォルダ全体置換機能を使ってすぐに終わったんだけど(異なるクラスでもフィールド名を統一しておいたのが功を奏した)、純粋に面倒だし変更し忘れが残っていたらどんなエラー吐くかも分からんし設計はちゃんとすべきだと思いました http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/42
43: 名前は開発中のものです。 [sage] 2023/09/13(水) 22:27:45.47 ID:HTnl4o+9 UIは何を使ってますん? UnityUIやMeshプロは将来無くなるとかで 自分はUIToolkitを勉強してます http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/43
44: 名前は開発中のものです。 [] 2023/09/14(木) 06:44:41.69 ID:A6Ctx0a0 >>41 4.0も誤情報多いんで自分でも調べながらやってます 全く知らん分野に手を付けるとき基本的なアイデア提供してくれるのはありがたいっすね unityのアニメーターみたいなビジュアルスクリプト?もあるしコードでのステートマシンもあります 移動ステートクラスみたいなのを作って、それを抽象クラスにして敵用移動ステートとプレイヤー移動ステートみたいに作ってましたね でも冷静に考えると確かに抽象クラスじゃなくてまんま内容コピペして新しいクラス作ってもよくね?って思いましたね コードの冗長性はなくて読みやすくはなるかもだけど… http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/44
45: 名前は開発中のものです。 [sage] 2023/09/14(木) 21:12:02.73 ID:BQP80pEG >>43 普通のGUIだね GUIは将来無くなる訳じゃないよレガシー行きはするかもしれないけど UItoolKitにTMPが再整備されるまでまだ時間はかかるだろうしUItoolKitは学習コストに見合った性能や作りやすさはなさそうなんでしばらくはスルーするかな >>44 対話式AIはあとコード丸投げして処理追わせたり注釈つけさせるのも便利だね あと自分がちょっと慣れてきた分野で誤情報を見抜けると感動する() ビジュアルスクリプティングは有料アセットのもの? 今後のメンテも考えると共通事項はなるべく基底クラスにまとめておいた方がよいのかなとは思ってる 抽象クラスは今のところ個人開発だと「うっかりインスタンス化」「派生クラス毎に処理が大きく異なるメンバを実装強制して、うっかり実装し忘れ防止」の2つが主な利点なんだろうなあと考えている 単に共通事項まとめるだけから普通の基底クラスでもいいしね http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/45
46: 名前は開発中のものです。 [sage] 2023/09/14(木) 21:34:26.80 ID:BQP80pEG 今日の作業は相変わらずのUI実装クラスの整理 何かUnity Runtime Fee関係でだいぶキナ臭い動きが出てるから、当面は有料アセット購入はせずにUIとゲームシステム面の実装をするつもり 今後の同行次第で(有名なアセット撤退とか自分が覗いてる5ch外のコミュニティ閉鎖とか)ワンチャン3Dゲーからワールドマップのない2Dゲー(ゲームジャンル名が分からん)に目標変えて比較的短期でリリースして別エンジンに移行するかも ただ仮に言語が変わっても設計を考えておくのは絶対に役立つと思うから、ゲームシステムはUnityで完成させたい 今日の作業で気になった点 ①MonoBehaviourの必要性 UIにしろ何にせよ今のところ自分は大抵のクラスにMonoBehaviourを継承させてゲームオブジェクトにアタッチさせて使っているが、全部アタッチする必要性ってあるの?っていう単純な疑問が生じた というのもMonoBehaviourを利用しないデザインが~みたいな話をしばしば耳にするので… MonoBehaviourはAwakeやUpdateみたいなマジックメソッドを利用できるようになる利点はたしかにありがたいのだが、ゲームオブジェクトやクラスが増えてくると管理が面倒になってくるので、特定のゲームオブジェクトのライフサイクルと一蓮托生ではない・又は便宜的にゲームオブジェクトと一体になっていると分かりやすい(例えばキャラクターと所持アイテムみたいに)クラスのインスタンスはnewで作ったほうがいいんじゃないか?と感じたり 今後ゲームシステムを作っていく上では更にMonoBehaviourの機能を使わないクラスも増えてきそうなので、この機会に少し調べてみた方がいいかなと思った http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/46
47: 名前は開発中のものです。 [sage] 2023/09/14(木) 21:45:06.99 ID:BQP80pEG ②クラスのインスタンスのメモリ使用量 自作のアイテムクラス(のインスタンス)はint型フィールドを複数持っている 最大で1万個はアイテムを所持できる想定なので、メモリ圧迫やセーブデータの軽量化を考えるとまあなるべくインスタンスのサイズも小さくしておきたいとは考えている そこで前にフィールドのint型(4バイト)をShort型(2バイト)に変えてみたのだが、プロファイラで雑に確認した限りではメモリ使用量に変化はなかった 数値の型のメモリは単純に半分になったのに変化しないのは何故だろう?と当時は思っていたが、どうもクラスのフィールドとして数値が入っているので、クラスのインスタンスをヒープメモリに配置する時に取りだしやすいよつにサイズが整理されてその際に単純計算したメモリ使用量と比べてサイズが拡張されるらしい これかもしれない(ちゃんと調べてない) http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/47
48: 名前は開発中のものです。 [sage] 2023/09/14(木) 21:51:03.03 ID:t6pji0Zs レガシー行きって何か怖いのよね(笑) 自分はUIToolkitにしてウェブみたいな作り出来るから画面サイズ気にしなくて楽になりました メモリ関連はよーわからんけど宅さんあるときはdictionaryかなぁ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/48
49: 名前は開発中のものです。 [sage] 2023/09/15(金) 21:07:15.26 ID:Fj2wueol >>48 Dictionaryは個別の値へのアクセスは早いけど高性能な分メモリ使用量は多いよ 配列やリストはメモリ使用量は少なめでIndexでのアクセスは早いけど、個別の値の検索や削除が要素数に比例して遅くなるから多数のアイテムを管理するシステムには不向きな印象がある 明日は久しぶりにコレクションについてまとめてみるか 今日は抽象クラスの整理はひとまず終わったので次に作るUIの設計を考えた クラス間の結合を弱めるにはインターフェースやZenject(外部ライブラリ)が有効だそうだが、導入には一手間かかりそうだなという印象 インターフェースはUnityの標準機能じゃインスペクターから設定できない(オーディンインスペクターという有料アセットや外部ライブラリを利用すれば一応可能)のが残念 それとインスペクターで参照を設定するのだと結局ゲームオブジェクト(MonoBehaviour)同士の結合は緩められてない気がする 「クラスAに機能を追加・修正・削除したから、クラスBの該当部分も直して~」っていう作業から抜けたいなあ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/49
50: 名前は開発中のものです。 [sage] 2023/09/15(金) 21:24:06.03 ID:hZKK5Ca7 因みに今のパソコンでそのディクショナリのはやさとかメモリとかどれだけ影響あるのでしょうか? 最後の文章見ると個人開発じゃなくてグループ? このメモは一体、、、 http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/50
51: 名前は開発中のものです。 [sage] 2023/09/15(金) 21:52:15.68 ID:Fj2wueol 個人開発だよ 「直して〜」の「〜」は呼びかけじゃなくて以下ループとかそういうニュアンスのつもりだった 大量のデータを扱うコレクション(配列とかリストとかディクショナリ)の場合はどのコレクションを選択するかで処理速度は顕著な差が出るね 前に実験したことあるけど、1万個の所持アイテム用インスタンスを格納した?List<自作クラス>と?Dictionary<int,自作クラス>で一番最初に入手したアイテム(ListではIndex0、Dictionaryではint型キーを連番になるように制御して格納しているのでこれもキー0になる)を削除する処理を行った場合 ?Listだと500msぐらいかかる一方で、?Dictionaryだと0.1msで終わる これはListでは内部的には配列に特殊な処理を加えて自由に挿入・削除のできるコレクションに仕立てているから、削除関数であるRemoveAt()を実行すると削除した要素Indexの後ろに並んでいる要素たちを全部1つずつコピーして前に詰める作業が内部的に行われると全体の要素数が増えるにしたがってクッソ重くなる 一方でDictionaryは内部ではハッシュテーブルを利用していて、与えられたキーをハッシュに変換する作業がある代わりに基本的に要求された要素だけを参照しに行くから、全体の要素数が増えても処理速度に対して影響は出ない メモリ使用量についてはモバイル端末想定じゃなきゃまあ誤差だとは思うけど可能な限りは軽くしたいね http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/51
52: 名前は開発中のものです。 [sage] 2023/09/16(土) 21:40:31.42 ID:OFNct1/O コレクションについてまとめようと思ったけど別のことして忘れてた とりあえず今日はメニュー画面の作成を進めた 今日から作成を始めたメインメニューはクラス間のシリアライズによる参照は使わずに、イベントとリスナー登録で情報のやり取りをしようと考えている 一般的にイベントでやり取りをする方法は、クラス間でお互いの内部実装に無関心で済むため(イベントの発火がされなければ待機しているだけで、引数を受け取ってどう使うかも自由)、疎結合に分類されるらしい まあシリアライズの代わりにデリゲートへの関数のキャッシュとリスナーの登録をコードで行う必要があって、更に複数のリスナーが存在する場合は実行順序の制御も別所で必要になるので、インスペクターからシリアライズで参照設定をしてグチャっと処理コードを書いた方が短期的には楽に見えるのはナイショ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/52
53: 名前は開発中のものです。 [sage] 2023/09/16(土) 22:33:48.81 ID:GeGtMKJg やべぇー なんか、高度すぎて 分からん http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/53
54: 名前は開発中のものです。 [sage] 2023/09/17(日) 22:58:20.80 ID:SjciO0EV 基本的に実装したい処理が思い浮かんだ時に必要そうな処理を基礎からその都度調べているだけよ 地道にUnityやっていけば必ず到達できるレベルでしかないからガンバレ 本日の作業もメニュー作り 静的イベントを利用してクラス間のやり取りをするうちに気になったのが、イベントとゲームオブジェクトのライフサイクルとの関係性 メインメニュー → 「装備」ボタンを押すと静的イベントを発火 → リッスンした装備メニューのマネージャークラスが装備メニューをSetActive といった流れを実装したかったが、テストプレイすると「装備」ボタンを押しても装備メニューが起動しない 原因は、装備メニューのマネージャークラスがアタッチされたゲームオブジェクトが無効化されていたためっぽい 無効化されたゲームオブジェクトの関数を外部からコールすることは可能だが、無効化中にはイベントのリスナーとしてコールバックを行うことはできないようだ 確かにゲームオブジェクトにアタッチされたクラスはUpdateなどのマジックメソッドが呼び出されないが、厳密にはこれらもランタイムから呼び出されている訳で、外部からコールされている状態に近いように思える イベントのリスナーとしてのコールバックもEventHandler?が呼び出しているらしいので、「ゲームオブジェクト」のライフサイクルにはこれらの仕様を変更する(というか、制限された仕様のインスタンスをUnityが提供している?)ようだ まあ面倒な理屈はともかく、イベントでやり取りするクラスは発火前にゲームオブジェクトを有効化しておくか、MonoBehaviourを利用しないクラスとして設計しましょう、というのが今日得た結論となる http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/54
55: 名前は開発中のものです。 [sage] 2023/09/17(日) 23:04:46.48 ID:aXQbPdAS それセットアクティブじゃなくて Enableでは? http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/55
56: 名前は開発中のものです。 [sage] 2023/09/17(日) 23:08:19.89 ID:SjciO0EV いやイベントのリスナーになっているクラス(コンポーネント)がアタッチされているゲームオブジェクトが無効化されているとコールバックが行われないっぽのよね コンポーネントじゃなくてゲームオブジェクトだからSetActiveの話 http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/56
57: 名前は開発中のものです。 [] 2023/09/18(月) 12:08:45.30 ID:RKiVL9Tq l_i_t_e(邪魔という方は左記をNGお願いします) 更にご家族に教えて加えて¥4000×人数をGETできます! https://i.imgur.com/l61BDyt.jpg http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/57
58: 名前は開発中のものです。 [sage] 2023/09/18(月) 13:39:48.69 ID:YQ8UtnvT >>57 もう現金に換えてアンインストした http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/58
59: 名前は開発中のものです。 [sage] 2023/09/18(月) 16:11:22.17 ID:ylIv/p+P 普通なら削除依頼出しとけよって定型文貼られるようなスレだけど 技術者多い板の性質と真面目な内容が組み合わさって技術メモブログのように存在を許されている http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/59
60: 名前は開発中のものです。 [] 2023/09/18(月) 16:34:27.70 ID:GrWZQeuh 絵描き板とかである個スレみたいなもんでしょ 過疎板にはよくある http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/60
61: 名前は開発中のものです。 [sage] 2023/09/18(月) 22:31:41.35 ID:+Uz7sHbq アウトプットも兼ねて覚えたこと書き殴りたくなる機会がたまにあるんだけど、Unityの制作面中心の雑談スレが見当たらなかったからノリで立てちゃったのよねすまん 代わりに毎日何かしらは作業する・調べるように努力してます 今日気になったこと ・ジェネリックの扱い方 ジェネリックと抽象クラスを利用してUI関係の整理を続けていたが、独自セレクタブルたちが引数の型の異なるRefresh関数(描画情報を更新するために管理クラス側からコールされるpublicな関数)をそれぞれ持っており、これをどうやって統一するか悩む 統一すること自体は抽象クラスにRefresh関数自体をジェネリック<T>で抽象メソッドとして宣言すれば簡単にできるのだが、そうすると同時セレクタブルたちの型が抽象クラスとしても異なってしまうため、管理クラス側から独自セレクタブルたちの配列を扱う時にその型(内部実装)を知る必要性が出てきてしまうように思える インターフェースでよくないか?とも思ったのだが、インターフェースはUnityの標準機能ではシリアライズ化できないし、キャストしたりGetComponentで具体的な型を指定しないと多分Transform等にもアクセスができないしどうしたものか 抽象クラスの基底に更に抽象クラスを宣言すれば何とかなるのかな…明日以降検証してみる ちなみにコレクションの復習はまだ出来ていない というかUIのクラスとレイアウト周りの整理が中心で、検索システムとか内部面は一段落したので暫くコード書くときにコレクションに触れてない アイテム合成とか敵からのドロップテーブル等を実装する時にまた考えるかな(10月以降) http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/61
62: 名前は開発中のものです。 [sage] 2023/09/19(火) 22:19:31.36 ID:CqPMq7Md 今日の作業 ・独自の派生セレクタブルの処理を抽象化するためにRefresh関数の引数をint型に統一することに決定する。int型以外を引数とするクラスはコード全体を見直す必要が出てきたので数か月前の設計のガバさのツケが回ってきた形。 ・MonoBehaviourを継承しないクラスに[Serializable]を付けて、このクラスをフィールドとして保有するMonoBehaviour継承クラスのインスペクターから値を弄れるようにしてみた 基本的な使い方だけどスクリプタブルオブジェクト以外で[Serializable]を利用してこなかったのでちょっと感動 ・ノーコード系ゲーム制作アセットの戦闘システムに自作の拡張機能を追加した。攻撃時に攻撃者と被害者をそれぞれ独自戦闘システムインターフェース型でGetComponentしてダメージ計算など色々な処理をスクリプトから行う 有料アセットのテンプレートは便利だけど、個人的にはノーコード系のノードやリスト形式の命令処理は何となく苦手 VisualStudioで素直にC#書いた方が楽だし処理も追いやすい気がしてならない ・「今日の疑問」について調べている時にDictionaryのTryGetValueを使えばキーの存在確認と値のチェックを両方できることを知った というか前に調べて覚えたつもりだったけど忘れていた 嫌な予感がして自分のコード見てみたらContansKeyとDictionary[]を両方使って二重にDictionaryを走査している箇所が案の定見つかった out系の使い方がよく分からなくて昔は見かけてもスルーしていた記憶がある(RayCastとかTryGetComponentでもoutはしばしば出てくる。何なら3D空間上の計算をするゲームでは頻繁に見かけそう) ちゃんとやり方覚えなきゃなあと思いました 今日の疑問 ・GetComponentはしばしば重いと言われるが実際問題どの程度使うとボトルネックになるのだろうか?1フレームに30回程度じゃプロファイラーを見る限りでは全く問題にならない程度の負担しかない まあキャッシュしておけばいいものを毎度取得しに行くコードの存在自体が不適切な印象は否めないが http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/62
63: 名前は開発中のものです。 [sage] 2023/09/19(火) 22:23:27.79 ID:iPzaBk+A ゲットコンポーネントは重くないでしょ それは公式でも書いてると思うけど Updateでやっちやあかんって http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/63
64: 名前は開発中のものです。 [sage] 2023/09/20(水) 03:37:28.78 ID:ncaLFBeu 「Unityでよくある失敗」はコードを書く習慣がある層ならUnity初学者でも回避するよう内容が多いな GetComponentとFindを周期処理のなかに書くなんぞ最たるもんだな http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/64
65: 名前は開発中のものです。 [sage] 2023/09/20(水) 22:16:05.72 ID:6f4RNUvQ >>63-64 必要ならキャッシュしておいた方がいい、との記述はあるものの https://learn.microsoft.com/en-us/windows/mixed-reality/develop/unity/performance-recommendations-for-unity?tabs=openxr 色々な人の検証結果を見る限りはGetComponentを1フレーム内で数万回繰り返しても、処理時間はそれ自体ではぶっちゃけ殆ど差が出ないみたいだね そう考えると実はUpdate内で毎度呼び出しても現実的なボトルネックにはならないんだろうね ある意味「GetComponentは重いぞ神話」が独り歩きしている状況かもしれない 自分は基本的にその場限りで利用する場合以外はキャッシュするけども http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/65
66: 名前は開発中のものです。 [sage] 2023/09/20(水) 22:21:25.16 ID:6f4RNUvQ 代わってGameObject.Find系は本当に看過できないほど重いようだ ゲームオブジェクト全体を走査する系の処理は重いのは感覚的にもよく分かる 同じくゲームオブジェクト全体にメッセージを送信するSendMassageも滅茶苦茶重いらしくてMicrosoftのDocには 「SendMessage() と BroadcastMessage() は、どんな犠牲を払っても排除されるべきです。これらの関数は、直接関数呼び出しよりも約1000倍遅くなる可能性があります。」(google翻訳) って書いてあって草 素直にUnityEventsかC#Eventを使うのが安心だな http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/66
67: 名前は開発中のものです。 [sage] 2023/09/20(水) 22:22:45.41 ID:9mke4B6g おそらくはまだCPUがショボい頃の事が今でも尾を引いてらのかもね http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/67
68: 名前は開発中のものです。 [sage] 2023/09/20(水) 22:30:35.83 ID:6f4RNUvQ >>67 あと可能性があるとしたら、TransformへのアクセスはUnityのバージョンアップで最適化がされたことがあるそうで、GetComponentもそうなのかもしれん(調べてない) ・今日の作業 今日の作業は昨日と変わらず、重い処理関係以外で特に何も調べたりはしなかった 引き続き設計思想の話としては、インスペクターから値・参照を設定・確認できるのは便利である一方で、Unityに慣れるにつれてインスペクターから設定しなくてはならないのはコードとインスペクターの双方を行き来する必要があって面倒だとも感じてきた UnityにはEventTriggerなど便利なコンポーネントが存在しているが、一部は自分でスクリプトを組めば代替できるものもある GameObject.Find系が推奨されないもう一つの理由として「制作途中の仕様変更に弱い」という指摘があるが、これにはコードとインスペクターだけではなくヒエラルキーも動作確認の際にチェック対象になってしまう煩雑さを回避したいという願いが暗に含まれていそうだ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/68
69: 名前は開発中のものです。 [sage] 2023/09/21(木) 22:13:15.68 ID:+9E6IOzm 今日は自作のインベントリシステムに並び替え機能の実装を始めた List.Sortで自作クラスをソートするにはIComparableインターフェイスを継承してCompareTo関数を実装するか、又はラムダ式で直接ソート順を指定することでも可能となる ラムダ式は匿名関数を作成するもので、内部的には最初に実行される時のみnewされて関数が生成されてそれ以降はコンパイラが自動的にそれを使い回してくれるそうなのでアロケーション面でも優しい Unityでお世話になる時は大体ソート関係な気がする http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/69
70: 名前は開発中のものです。 [sage] 2023/09/22(金) 02:12:08.27 ID:2ujM814X Linp使えるからSQL的なSelect,Whereなんかも使ってもいいね http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/70
71: 名前は開発中のものです。 [sage] 2023/09/22(金) 02:14:29.74 ID:2ujM814X すまんLinqだスマホだから打ち間違えた そしてpもqもパッと見見分けつかんからそのまま送信してしまった http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/71
72: 名前は開発中のものです。 [sage] 2023/09/22(金) 21:58:51.05 ID:TT/FNhBR >>70 LINQは便利そうな機能が一通り揃ってるのね ただ前に使ってみた時に(どの関数かは忘れた)素直にForやForeachでやるのと比べて凄い量のアロケーションが出てたから使うのやめちゃってたわ インベントリ内アイテムの並び替えみたいな、そう頻繁に行われない処理にはLINQの使用を再検討してみようかな 直接並び替え用の式を書くと後で見た時に大抵「何だっけこれ…」ってなるから…(まずコード上の注釈を再読む所から始まる) 今日も並び替え機能の実装を進めた そういえばクラス間の情報のやり取りで静的イベント(public static event Action<>〜)はよく使っているけど、Funcはまだどこにも利用してないと思った がChatGPTによるとFuncはリスナーが複数いる場合に戻り値にどのリスナーからの値を使用すべきが不明瞭になるから使っちゃいけないらしい よく意味が分からなかったので明日以降検証したい そもそもこの疑問が浮かんだのが作業が終了してからなのでVisualStudio上でコード自体が適切にコンパイルできるのかすら試してない http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/72
73: 名前は開発中のものです。 [sage] 2023/09/22(金) 22:10:05.72 ID:1GHnfQ7l 適切にコンパイルされたか否かって何かToolとかあるんです? http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/73
74: 名前は開発中のものです。 [sage] 2023/09/23(土) 13:04:32.12 ID:pGEksIgm >>72 たしかにLinqは便利な分最適化には程遠いかも http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/74
75: 名前は開発中のものです。 [sage] 2023/09/23(土) 17:27:46.55 ID:bmDBxj8t >>73 いや分からない(知らない) コンパイルすら通らないのかコンパイルは通るけど使い方間違えると実行時エラーでるのかが分からないからそう書いただけ >>74 便利だけどゲームだと使い道が難しそうな印象があるなあ 今日の作業で久しぶりにLINQ使ってみたけど、FindAllしたら新しいList<T>インスタンスが戻り値として生成されるみたいで結構な量のアロケーションが発生しちゃった Forで要素0からループで走査して条件一致する度にグローバルな使い回し用リストにAddするとアロケーション無しになる ただインベントリのアイテム内を並び替えるだけの処理で戦闘中とかフレームレートが必要な場面で呼び出されることは想定してないから、まあ実際にプレイに影響は出ないとは思うけどね http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/75
76: 名前は開発中のものです。 [sage] 2023/09/23(土) 17:50:57.84 ID:bmDBxj8t そういえばFuncでリスナー複数いるとどうなるの?問題についてちょっと検証してみたそういえばFuncでリスナー複数いるとどうなるの?問題についてちょっと検証してみた using System; using UnityEngine; public class TestClass : MonoBehaviour { // 静的アクション public static event Func<int,int> testFuncEvents; // シリアライズフィールド [Header("Funcテスト")] public bool startFuncTest; public int FuncTestArg; public int Returnvalue; public int? Result { get => Returnvalue; set { Debug.Log("Resultプロパティが呼ばれました 戻り値は"+value); if(value.HasValue) Returnvalue = value.Value; } } http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/76
77: 名前は開発中のものです。 [sage] 2023/09/23(土) 17:51:54.28 ID:bmDBxj8t 改行と文字数の限界でコード貼るのは無理か 結論としては ? 変数に代入される戻り値は一番最後に登録されたリスナーのものになる ? 最後のリスナーのみがプロパティをコールする。リスナーは3人いるのにプロパティは1回しかコールされなかった(リスナーは3人ともデバックログが出たが、プロパティは1回しか出なかった) ? nullはnullじゃない文字列と連結しようとすると空白になるが、単体又はnullと連結しようとすると文字列はNullになる まあリスナーの管理が面倒だからたしかにChatGPTの言う通りFuncはイベントで扱うべきじゃないのかも? http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/77
78: 名前は開発中のものです。 [sage] 2023/09/24(日) 22:38:55.38 ID:S8roHB1T 今日の作業はクラスの設計を考えた 「カプセル化」をすることでクラスを他の処理にも再利用できるので、静的イベントやインターフェースを駆使して様々な「選択」が必要なUI画面で利用できる独自セレクタブルを作りたい http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/78
79: 名前は開発中のものです。 [sage] 2023/09/25(月) 21:40:56.58 ID:Lma5XPF1 今日はグラフィック関係をやっていてコードにあまり触れてないので調べ物はナシ! enumのSwitch式だかSwitch文だかをもう少し書きやすくする方法ないかなとは思ったり http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/79
80: 名前は開発中のものです。 [sage] 2023/09/26(火) 21:52:51.98 ID:2Scqx0S0 制作が軌道に乗ってくるとメモすることがなくなるんだよな 既に調べた知識で作り続けるだけだから だいぶ先になるけど有料アセットのうちFinalIKとEasySaveは詳しく使い方を覚えたいし覚えたら書くかねえ 特にFinalIKはUnity標準のメカニムとどのくらい共用できるのか知りたい http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/80
81: 名前は開発中のものです。 [sage] 2023/09/28(木) 22:06:34.28 ID:dc32lg9p 製作順調なら製作進捗でもいいんだよ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/81
82: 名前は開発中のものです。 [sage] 2023/09/29(金) 19:51:15.97 ID:4YW0vA30 >>81 それはアリだねただ一応秘密で作ってるんでどこまで内容書くかは悩みどころだが 今やってるのはアイテム合成システムの設計 合成時に素材の特殊能力を引き継ぐのだが、異なる特殊能力同士が合体して新たな特殊能力に変わるシステムをどうやって実装するか考えている 一番手っ取り早そうなのは、 ①素材アイテムの特殊能力をコレクションに格納する→②コガネブログからお借りした組み合わせ列挙拡張メソッドを使って事前に指定した合体組み合わせに該当するか調べる→③合体組み合わせが不存在になるまで繰り返す かなと思っている http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/82
83: 名前は開発中のものです。 [] 2023/09/30(土) 07:12:12.43 ID:HN5eRe95 俺もちょうど合成システム作ってるとこでビビった 俺は2つのarrayをソートして、比較する単純なものだけど… http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/83
84: 名前は開発中のものです。 [sage] 2023/09/30(土) 22:25:15.09 ID:AozLAQh5 >>83 合成が合成システムを実行したその1回しか行われないならそのやり方の方が楽そう 自分のは合成して特殊能力が合体した際に次レベルの合体条件も満たしていたら順次合体を繰り返していく機能を想定しているから、配列やリストを何回も走査すると重いかもなあという懸念がある ただコガネブログのも合体成立時に何回も呼び出すと重そうなので、素材アイテムの持つ特殊能力の管理番号全てをHashSetに入れて、差集合とAddを使って合体組み合わせを探していくのもアリかも こればっかりは自分の設計に合わせて複数のコードを組んで検証してみるしかないね http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/84
85: 名前は開発中のものです。 [sage] 2023/10/04(水) 01:17:36.07 ID:1pamoYKo おや?停滞? 良スレかと思ってたが、中途半端に投げ出す感じな http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/85
86: 名前は開発中のものです。 [sage] 2023/10/04(水) 17:41:48.36 ID:DAn/y1Is 今は既に調べておいた知識でゆっくり作っている状況だから特に書くことが無いのよね グラフィックス関係の勉強もしてるんでそっちに多く時間を割いてるのもある 一応調べたことの備忘のスレのつもりなんで、何も調べてないのに毎日作業内容を報告するのもなんか違うと思うし あと単純に最近安定して5chが見られなくないか? 基本的にメモは作業用ではないPCのEdgeで書いてレスしてるけど、今もまたスレが開けなくて内容ドライブ経由でコピーしてスマホからレスした 今やってる作業はアイテム合成システムのクラス設計、メニュー画面・装備画面UIの作成あたりかな ゲームシステムについての最近考えている事は ・アイテムの購入・売却の実装 既にエクセルデータをスクリプタブルオブジェクト化して売値・買値等のデータを取り込んである & プレイヤー以外もアイテムを所持できるようにプレイヤー・NPCの共通基底キャラクタークラスに所持品クラスのフィールドと取得用インターフェースを実装済み、装備画面UIの作成時に抽象クラスとインターフェースを利用して割と再利用性を高めてある(つもり)なので、作成自体はそこまで難しくなさそう。 アイテム売る商人の持つアイテムデータは、アイテムインスタンスクラスに[Serializable]を付けてキャラクタークラス→所持品クラス→アイテムインスタンスで開いてインスペクターから直接設定するか、又は何らかのコレクションで値だけインスペクターから設定してStart関数でアイテムクラスのインスタンスをnewしてコンストラクタにその値を渡してやればよさそう ただそもそもゲーム内に商人を実装するかは未定 ・3Dのゲーム性を採用するか 購入済みのノーコード系アセットがパフォーマンスの向上目指して改修されるそうなんでやっぱり使ってみたい感がある(気持ちの問題)。 あとこのアセットがasync/await使ってる所為でアセットの機能にアクセスするとそれなりにGC発生するんだけど、将来的にはUnityにも.NET5のAsyncValueTaskが導入されたら更にパフォーマンス向上するかも(非同期処理のこと全然分かってないので自分でアセットのコアコードをUniTaskに置き換えるのはまだ怖い) http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/86
87: 名前は開発中のものです。 [sage] 2023/10/04(水) 17:42:01.17 ID:DAn/y1Is C#・Unityの勉強としては ・非同期処理 上でも書いたがよく分かってない。今作っている範囲だと用途は少なそうだけど、唯一「アイテムを大量に捨てる場合」に役立ちそうな気がしている。 というのもアイテムを捨てる際には自作のアイテム管理クラスのアイテム破棄の関数をコールするのだが、検索システムに備えて入手時にコレクションへの登録を沢山しているので破棄時には逆にコレクションからの削除を行う必要がある アイテム捨てる処理は入手処理と違って新たなインスタンスはほぼ生成しないのでGCの問題はないが、単純にコレクションへのアクセスが多いのと、プレイヤーが何百・何千個ものアイテムを一気に捨てることができるUIを組んでしまったので大量にアイテム破棄を行うと余裕で60fps割ってしまう。また所持品管理ディクショナリーの参照が切れるのでアイテムインスタンス自体もガベコレの対象になるのでガベコレによるスパイク発生の危険性も高くなる。 そこで非同期処理を用いてフレームを分散してアイテムの破棄を行えば、捨てる処理自体のスパイクは軽減できるかなと思った プレイヤーは1f単位で処理を認識している訳ではないので、内部的には数fに分離しても多分気が付かない(あまりに重い場合は「アイテムを捨てています」等の進捗を画面に表示した方がよさそうだけど) 非同期処理はコルーチン、async/await、UniTaskあたりが有名なのかな?性能でいえばUniTask一択なんだろうけどまずはコルーチンから試してみようと思っている(GCは知らない) http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/87
88: 名前は開発中のものです。 [sage] 2023/10/07(土) 18:13:33.15 ID:zKcOYlJC 自分はインボーク、インボークリピートをもっぱら使うなぁ http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/88
89: 名前は開発中のものです。 [sage] 2023/10/07(土) 21:08:01.13 ID:AbV00O8h >>88 InvokeやInvoke.RepeatingはMonoBehaviourの機能だから個人的にあまり使いたくないなあと思ったり(他のクラスに移植したり仕様変更する際に面倒そうなので…) 引数にstring型使うからアロケーションも心配 ただアタッチ先ゲームオブジェクトだけで完結する処理ならそれが手っ取り早そうだね http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/89
90: 名前は開発中のものです。 [sage] 2023/10/07(土) 21:19:34.52 ID:iuLYjSS8 でも引数はメソッドの名称だからアロケーション発生しないんじゃね? http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/90
91: 名前は開発中のものです。 [sage] 2023/10/07(土) 22:01:39.06 ID:AbV00O8h >>90 エディタ上でテストプレイしてみたけど。確かにMonoJIT以外でのアロケーションは発生しないね 原因について雑に調べたけど、もしかしたら文字列リテラルだからコンパイル時に生成・メモリに格納されて一致する限りは使い回しがされるからっぽい http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/91
92: 名前は開発中のものです。 [sage] 2023/10/07(土) 22:01:43.61 ID:AbV00O8h >>90 エディタ上でテストプレイしてみたけど。確かにMonoJIT以外でのアロケーションは発生しないね 原因について雑に調べたけど、もしかしたら文字列リテラルだからコンパイル時に生成・メモリに格納されて一致する限りは使い回しがされるからっぽい http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/92
93: 名前は開発中のものです。 [sage] 2023/10/07(土) 22:23:13.50 ID:ABeNJcDO 潔癖症みたいやねそこまで気にするのって http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/93
94: 名前は開発中のものです。 [] 2023/10/08(日) 09:30:28.99 ID:raa6/Dtd 非同期処理はコルーチンしか使ったことないや http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/94
95: 名前は開発中のものです。 [sage] 2023/10/08(日) 21:22:41.79 ID:9d1oOF7A >>93 GCallocは削れば削るだけ良いからね 自分はECSを使うのは現状では無理そうだから削減可能な場所は全て対応するようにしている >>94 MonoBehaviourで非同期処理を扱うならコルーチンが入門な感じがあるね 返し値を扱うのが面倒そうなのが難点だけどそれでもUniTaskよりはとっつきやすそう(偏見) http://mevius.5ch.net/test/read.cgi/gamedev/1693399963/95
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 4 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.028s