Unity初心者の俺が調べたことをメモするスレ (99レス)
1-

17: 名前は開発中のものです。 [sage] 2023/09/05(火) 22:27:53.86 ID:1xAiAK3x(1) AAS
いまシステム面と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を通す設計をしているものが見つかった
無理やりな気もするけどどうなんだろうね
18
(2): 名前は開発中のものです。 [sage] 2023/09/05(火) 22:33:42.70 ID:Ts+LtVa/(1) AAS
UIやってるなら今ならちょうど

ユニティ・テクノロジーズ・ジャパンは、日本語の電子書籍『Unityにおけるユーザーインターフェースのデザインと実装』を無料で提供。専用ページから申し込めばダウンロードできるようになりました

てことで無料で見られるよ
Startを1frame待つのは理にかなってるんじゃないかな
Start関数は画面表示前の処理だし、1frameということは表示してからだから
確実だよね
19: 名前は開発中のものです。 [] 2023/09/05(火) 22:42:05.64 ID:JlRpf2nJ(1) AAS
>>18
マジか
良いこと聞いた
20: 名前は開発中のものです。 [sage] 2023/09/06(水) 22:29:47.35 ID:xeaBYfjk(1) AAS
>>18
情報サンクス
早速ダウンロードしてみたわ
UIToolKitはまだ全く手付かずだからどういうものか早く勉強しないとなあ

サンプルシーンで1f待ってるのはStartじゃなくてOnEnableね
そのサンプルはアイテム管理システムで、マネージャークラスがOnEnableでコルーチンで1f待機している間に、ゲーム開始後に道具メニューを開いた時に初めて生成されるアイテム表示用プレハブたちがStartで参照情報をマネージャーに渡してくる設計になっていた
マネージャーのOnEnableでプレハブの描画更新とイベントへのデリゲートの登録をやってるので、仮に1f待機がないとプレハブが生成される最初の1回目だけ参照情報をまだ受け取っておらずヌルリファが発生するからだと思われる

その5 「抽象クラスの個人開発における利点がよく分からない」
まとめというより疑問に近い。
抽象クラスのメリットを調べると、大抵のサイトや記事では「抽象化によって複数人の開発で統一が取れたコードが作成できる」といった内容が挙げられている。では、個人開発における抽象クラスの利点は何なのだろうか。
結論から言うと調べても自分にはあまり理解できなかった。「無い」や「殆ど無い」としている記事も散見される。
というのも、単に複数のクラスで共通したルールを実装したいなら純粋に基底クラスを継承して利用すればだいたい足りる気がする。
たしかに抽象クラスで関数の名称やシグネチャなどを設定して派生クラスにそれに沿った実装を強制するのは、コードの統一性を確保する上では有用ではあるが、個人開発だとコードを弄るのは基本的に自分だけなので、自分で注意すればよくない?という気も
まあC#に限らずヒューマンエラーを防げます系機能は究極的には全部「自分で注意すりゃよくない?」になるし、もちろん自分にそんな神みたいなこと無理なんで…(OnEnableとStartで何回もエラー引き起こす程の低い注意力)
自分としては抽象クラスは「インスタンスは絶対これで生成しないけど共通・統一された処理を実装したい」ケースでお守り的に使っていこうかなと思った(適当)
21: 名前は開発中のものです。 [sage] 2023/09/07(木) 23:01:59.92 ID:zzCLMbJH(1) AAS
眠いから雑なぼやき

シングルトンを初めて自分のゲームに導入してみた。理由はどういうものか使ってみたかったから。
戦闘システム管理クラスをシングルトンにした。戦闘キャラクラスからたくさんアクセスする。
これが密結合か?
グローバル変数化を目的として作っちゃいけないという話は聞いたことあるけど、これもその一つかもしれない。
この辺のコード作成のパターンの理念について何も知らないからそろそろ勉強するときかなあ
22: 名前は開発中のものです。 [sage] 2023/09/08(金) 22:50:45.01 ID:whCfvpks(1) AAS
GCalloc(ヒープメモリアロケーション)にまとめたいけどまだ理解が足りていない
今日は有料アセットのGCalloc潰しを中心に作業をしたが、フィールドのList<構造体>をSortする箇所でアロケーションが発生する理由がイマイチよく分からなかった
引数としてデリゲートを渡すとアロケーションが発生するのはその都度コンパイラがnewしてしまうからで、「デリゲートの代わりにメンバを参照しないラムダ式を利用する」と初回のみのアロケーションで済むらしい
実際ラムダ式に変えたら毎フレームのGCallocが消えたのだが、「IComparerを実装したクラスのインスタンスを利用する」という方法もあると聞き、こちらも試してみたところGCallocは消えないどころか増えた
なんかボックス化というものが絡んでいるような気もするがよく分からないので今日はこれで終わり
23
(1): 名前は開発中のものです。 [sage] 2023/09/09(土) 23:03:59.62 ID:DhDPacVH(1/2) AAS
GCalloc潰し二日目
昨日IComparerでGCallocが防止出来なかった理由については未だに分かっていない(というか殆ど調べていない)
「ラムダ式でメンバを参照する」コードを複数の有料アセットで見かける
GCalloc対策の話題でまず槍玉に上がる点だと思うのだが、あまり気にされていない・自分が気にしすぎなのだろうか?
24
(1): 名前は開発中のものです。 [sage] 2023/09/09(土) 23:10:00.18 ID:O6P9FobY(1) AAS
えーと
研究者なら気にしてもいいかと
アプリ開発するなら今のハード考えると気にし過ぎじゃね
てか気にする必要ないでしょ
25: 名前は開発中のものです。 [sage] 2023/09/09(土) 23:34:12.06 ID:DhDPacVH(2/2) AAS
>>24
やっぱり気にし過ぎかなあ
特に今作っているゲームはPC向けだから尚更処理落ちやクラッシュはし辛いだろうし
一応自分でコード書く時はアロケーションは基本的に避けるようにしてるけど、有料アセットまで潰して回る必要はないか
26: 名前は開発中のものです。 [] 2023/09/09(土) 23:46:32.90 ID:tG9qh3d0(1) AAS
ガベージコレクションなんかC#の基本なんだから気にしなくていいだろ
そんなに嫌ならBurstCompilerでもJobSystemでもECSでも使えば良い
27
(1): 名前は開発中のものです。 [sage] 2023/09/10(日) 00:04:42.69 ID:u9L0A1tk(1/2) AAS
結構規模の大きいものを作ってるから可能な限り潰しておきたい感はあるのよね
数時間のプレイに堪えられるような設計にしたい
28
(1): 名前は開発中のものです。 [] 2023/09/10(日) 00:11:59.35 ID:nCKHuG8g(1) AAS
>>27
ECS,BurstCompiler使えよ
29
(2): 名前は開発中のものです。 [sage] 2023/09/10(日) 09:03:38.32 ID:hFRQptHY(1) AAS
>>23
かける労力と得られるものが釣り合ってると思えるならそれぞれの判断でいいと思うけどね
今自分の作ってるやつはインクリメンタルGCついてても数分に一回3~7msくらいのGC Collectが発生してて
シューティングゲームなんでもう少しGCAlloc潰したほうがいいだろうなと思ってる
30
(1): 名前は開発中のものです。 [sage] 2023/09/10(日) 15:42:12.07 ID:j4PqFMUR(1) AAS
あかん、行こう
31
(1): 名前は開発中のものです。 [sage] 2023/09/10(日) 21:59:14.98 ID:u9L0A1tk(2/2) AAS
>>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にアクセスすることはできない。
なので自分のコードに弄ったアセット側からアクセスしたい場合は、自分のコードをアセンブリ定義・分割して参照設定を追加するか、自分のコードをアセット側のアセンブリ内に入れる必要がある。
まあむしろアセットでアセンブリ定義・分割されてない方が色々と問題らしいので自分の経験は初心者特有の躓きって感じだな
32
(1): 名前は開発中のものです。 [sage] 2023/09/10(日) 22:01:38.99 ID:pyk4erDp(1/2) AAS
ところでヌシはタイトルには初心者って書いてるけど
所持がガベージとか気にしないよね?

ナニモン?
33: 名前は開発中のものです。 [sage] 2023/09/10(日) 22:01:57.78 ID:pyk4erDp(2/2) AAS
所持ちゃう、初心者
34
(1): 29 [sage] 2023/09/11(月) 07:46:22.08 ID:2rYAG6dH(1) AAS
>>31
大量にオブジェクト扱う部分は全部Burst使ってるから重い部分ではGCAllocは発生してないし、まだ開発序盤で一時的にお試しで入れてるコードやシューティングと関係ないアセットなんかでGCAllocが出てるだけなので参考になりそうな数字は持ってないよ、申し訳ない
35: 名前は開発中のものです。 [sage] 2023/09/11(月) 21:22:14.79 ID:GchgKIS7(1/2) AAS
>>34
なるほどありがとう
自分のゲームはだいぶ時間かかりそうだからその間にECSやバーストコンパイラーの仕様や情報が充実するといいなあ

>>32
Unity歴5ヵ月弱の初心者だよ

今日はあまり何もしなかった
自作インベントリの検索機能を少し弄ったけど何となく前の仕様の方が使い勝手が良かった気がして結局コードを元に戻した
検索機能を処理する複数のクラスが絡み合っているので(密結合とはこういう状態?)、今後の保守や改良に備えてコードを見直した方がいいかもしれないと思った
自作スクロールの描画処理については既に一部をインターフェースや抽象クラスにしてあるので、検索機能も(今のところ予定はないけど)インベントリ以外に流用することを考えると同じように改良したい
ただこの辺はコーディングや設計の思想について先に学ばないと結局グダりそうだね
36: 名前は開発中のものです。 [sage] 2023/09/11(月) 21:58:09.05 ID:dpI1L58C(1) AAS
歴5ヶ月でインタフェースや抽象クラスとか

Unityは浅いけどC#は長い?
37: 名前は開発中のものです。 [sage] 2023/09/11(月) 22:31:07.12 ID:GchgKIS7(2/2) AAS
Unity歴とC#歴は同じ
プログラミングはキッズの頃にキッズ向け言語とRPGツクールのRGSS(Ruby)を少しやった程度
ただRubyはもう全く覚えてない
38: 名前は開発中のものです。 [sage] 2023/09/12(火) 22:16:09.67 ID:Agu+xwh8(1) AAS
ジェネリックについての勉強を少し始めた
自作のスクロールを拡張する上で複数の型を扱うことになるかもしれないので、スクロールの抽象クラスに一部ジェネリックの抽象プロパティや抽象メソッドを実装して今後のコーディングを統一的にするのが目的
ジェネリックな関数には制約条件というものが付けられるそうなので、これでスクロールに渡すべき型に特定のインターフェースの実装を要求すればコーディングのミスも減りそう
逆に言うとこれも個人開発だとミスの防止という点以外の利点が分からん…もっと勉強が必要そうだ
39
(1): 名前は開発中のものです。 [sage] 2023/09/12(火) 22:30:53.89 ID:DqJC+Tye(1) AAS
すごいなぁ

自分はUnity半年あたりはやっと3DでUnityちゃんが動いて喜んでたわ

それで満足してた(笑)
40
(1): 名前は開発中のものです。 [] 2023/09/13(水) 08:16:34.64 ID:zrU2QrrP(1) AAS
俺も歴同じくらいでほぼほぼchatGPTに聞きながらやってるけど>>1
1(1): 名前は開発中のものです。 [sage] 2023/08/30(水) 21:52:43.22 ID:zQtYmNBI(1/3) AAS
ちなスペックは
コード作成は生成AI頼り・基礎的なコンポーネントの使い方すら理解してない・C#の経験皆無
こういうレベル
ほど理解せずに進めちゃってる
キャラクターをステートマシンで動かしてるんだけど、抽象クラスとジェネリック使う機会あってほー便利だなあって思った気がするな
41
(1): 名前は開発中のものです。 [sage] 2023/09/13(水) 22:19:12.03 ID:b/7dbaPf(1/2) AAS
>>39
自分は2Dはスキップしてるからその分は早いかもしれないね
2Dの学習が必要かをUnity始める前に少し調べたけど、どちらかというと否定的な見解が多い印象で、UIの制作でどうせその辺やC#を扱う必要も出てくるだろうから最初から3Dで始めた

>>40
ChatGPT便利だよなあ 厳密には自分はBingの会話AI(GPT4.0をウェブ検索用にチューニングしたやつ)を使ってるけど(無料だから)
無料版の3.5も試したけどBingと比べて誤情報や変なコードの出現率が高いから断念した
ステートマシンって現在の状況をノードで繋いだステートを行き来して色々とするものだっけ?(無知)
UnityのAnimator(mecanim)がステートマシンらしいからいずれ覚える必要があるし、自分の作ってるUIも段々と状況設定がゴチャゴチャになってきたからそういうのを勉強して整理しなきゃなあ
1-
あと 58 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.008s