Unity初心者の俺が調べたことをメモするスレat GAMEDEV
Unity初心者の俺が調べたことをメモするスレ - 暇つぶし2ch63:名前は開発中のものです。
23/09/19 22:23:27.79 iPzaBk+A.net
ゲットコンポーネントは重くないでしょ
それは公式でも書いてると思うけど
Updateでやっちやあかんって

64:名前は開発中のものです。
23/09/20 03:37:28.78 ncaLFBeu.net
「Unityでよくある失敗」はコードを書く習慣がある層ならUnity初学者でも回避するよう内容が多いな
GetComponentとFindを周期処理のなかに書くなんぞ最たるもんだな

65:名前は開発中のものです。
23/09/20 22:16:05.72 6f4RNUvQ.net
>>63-64
必要ならキャッシュしておいた方がいい、との記述はあるものの
URLリンク(learn.microsoft.com)
色々な人の検証結果を見る限りはGetComponentを1フレーム内で数万回繰り返しても、処理時間はそれ自体ではぶっちゃけ殆ど差が出ないみたいだね
そう考えると実はUpdate内で毎度呼び出しても現実的なボトルネックにはならないんだろうね
ある意味「GetComponentは重いぞ神話」が独り歩きしている状況かもしれない
自分は基本的にその場限りで利用する場合以外はキャッシュするけども

66:名前は開発中のものです。
23/09/20 22:21:25.16 6f4RNUvQ.net
代わってGameObject.Find系は本当に看過できないほど重いようだ
ゲームオブジェクト全体を走査する系の処理は重いのは感覚的にもよく分かる
同じくゲームオブジェクト全体にメッセージを送信するSendMassageも滅茶苦茶重いらしくてMicrosoftのDocには
「SendMessage() と BroadcastMessage() は、どんな犠牲を払っても排除されるべきです。これらの関数は、直接関数呼び出しよりも約1000倍遅くなる可能性があります。」(google翻訳)
って書いてあって草
素直にUnityEventsかC#Eventを使うのが安心だな

67:名前は開発中のものです。
23/09/20 22:22:45.41 9mke4B6g.net
おそらくはまだCPUがショボい頃の事が今でも尾を引いてらのかもね

68:名前は開発中のものです。
23/09/20 22:30:35.83 6f4RNUvQ.net
>>67
あと可能性があるとしたら、TransformへのアクセスはUnityのバージョンアップで最適化がされたことがあるそうで、GetComponentもそうなのかもしれん(調べてない)
・今日の作業
今日の作業は昨日と変わらず、重い処理関係以外で特に何も調べたりはしなかった
引き続き設計思想の話としては、インスペクターから値・参照を設定・確認できるのは便利である一方で、Unityに慣れるにつれてインスペクターから設定しなくてはならないのはコードとインスペクターの双方を行き来する必要があって面倒だとも感じてきた
UnityにはEventTriggerなど便利なコンポーネントが存在しているが、一部は自分でスクリプトを組めば代替できるものもある
GameObject.Find系が推奨されないもう一つの理由として「制作途中の仕様変更に弱い」という指摘があるが、これにはコードとインスペクターだけではなくヒエラルキーも動作確認の際にチェック対象になってしまう煩雑さを回避したいという願いが暗に含まれていそうだ

69:名前は開発中のものです。
23/09/21 22:13:15.68 +9E6IOzm.net
今日は自作のインベントリシステムに並び替え機能の実装を始めた
List.Sortで自作クラスをソートするにはIComparableインターフェイスを継承してCompareTo関数を実装するか、又はラムダ式で直接ソート順を指定することでも可能となる
ラムダ式は匿名関数を作成するもので、内部的には最初に実行される時のみnewされて関数が生成されてそれ以降はコンパイラが自動的にそれを使い回してくれるそうなのでアロケーション面でも優しい
Unityでお世話になる時は大体ソート関係な気がする

70:名前は開発中のものです。
23/09/22 02:12:08.27 2ujM814X.net
Linp使えるからSQL的なSelect,Whereなんかも使ってもいいね

71:名前は開発中のものです。
23/09/22 02:14:29.74 2ujM814X.net
すまんLinqだスマホだから打ち間違えた
そしてpもqもパッと見見分けつかんからそのまま送信してしまった

72:名前は開発中のものです。
23/09/22 21:58:51.05 TT/FNhBR.net
>>70
LINQは便利そうな機能が一通り揃ってるのね
ただ前に使ってみた時に(どの関数かは忘れた)素直にForやForeachでやるのと比べて凄い量のアロケーションが出てたから使うのやめちゃってたわ
インベントリ内アイテムの並び替えみたいな、そう頻繁に行われない処理にはLINQの使用を再検討してみようかな
直接並び替え用の式を書くと後で見た時に大抵「何だっけこれ…」ってなるから…(まずコード上の注釈を再読む所から始まる)

今日も並び替え機能の実装を進めた
そういえばクラス間の情報のやり取りで静的イベント(public static event Action<>~)はよく使っているけど、Funcはまだどこにも利用してないと思った
がChatGPTによるとFuncはリスナーが複数いる場合に戻り値にどのリスナーからの値を使用すべきが不明瞭になるから使っちゃいけないらしい
よく意味が分からなかったので明日以降検証したい そもそもこの疑問が浮かんだのが作業が終了してからなのでVisualStudio上でコード自体が適切にコンパイルできるのかすら試してない

73:名前は開発中のものです。
23/09/22 22:10:05.72 1GHnfQ7l.net
適切にコンパイルされたか否かって何かToolとかあるんです?

74:名前は開発中のものです。
23/09/23 13:04:32.12 pGEksIgm.net
>>72
たしかにLinqは便利な分最適化には程遠いかも

75:名前は開発中のものです。
23/09/23 17:27:46.55 bmDBxj8t.net
>>73
いや分からない(知らない)
コンパイルすら通らないのかコンパイルは通るけど使い方間違えると実行時エラーでるのかが分からないからそう書いただけ
>>74
便利だけどゲームだと使い道が難しそうな印象があるなあ
今日の作業で久しぶりにLINQ使ってみたけど、FindAllしたら新しいList<T>インスタンスが戻り値として生成されるみたいで結構な量のアロケーションが発生しちゃった
Forで要素0からループで走査して条件一致する度にグローバルな使い回し用リストにAddするとアロケーション無しになる
ただインベントリのアイテム内を並び替えるだけの処理で戦闘中とかフレームレートが必要な場面で呼び出されることは想定してないから、まあ実際にプレイに影響は出ないとは思うけどね

76:名前は開発中のものです。
23/09/23 17:50:57.84 bmDBxj8t.net
そういえば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;
}
}

77:名前は開発中のものです。
23/09/23 17:51:54.28 bmDBxj8t.net
改行と文字数の限界でコード貼るのは無理か
結論としては
? 変数に代入される戻り値は一番最後に登録されたリスナーのものになる
? 最後のリスナーのみがプロパティをコールする。リスナーは3人いるのにプロパティは1回しかコールされなかった(リスナーは3人ともデバックログが出たが、プロパティは1回しか出なかった)
? nullはnullじゃない文字列と連結しようとすると空白になるが、単体又はnullと連結しようとすると文字列はNullになる

まあリスナーの管理が面倒だからたしかにChatGPTの言う通りFuncはイベントで扱うべきじゃないのかも?

78:名前は開発中のものです。
23/09/24 22:38:55.38 S8roHB1T.net
今日の作業はクラスの設計を考えた
「カプセル化」をすることでクラスを他の処理にも再利用できるので、静的イベントやインターフェースを駆使して様々な「選択」が必要なUI画面で利用できる独自セレクタブルを作りたい

79:名前は開発中のものです。
23/09/25 21:40:56.58 Lma5XPF1.net
今日はグラフィック関係をやっていてコードにあまり触れてないので調べ物はナシ!
enumのSwitch式だかSwitch文だかをもう少し書きやすくする方法ないかなとは思ったり

80:名前は開発中のものです。
23/09/26 21:52:51.98 2Scqx0S0.net
制作が軌道に乗ってくるとメモすることがなくなるんだよな
既に調べた知識で作り続けるだけだから
だいぶ先になるけど有料アセットのうちFinalIKとEasySaveは詳しく使い方を覚えたいし覚えたら書くかねえ
特にFinalIKはUnity標準のメカニムとどのくらい共用できるのか知りたい

81:名前は開発中のものです。
23/09/28 22:06:34.28 dc32lg9p.net
製作順調なら製作進捗でもいいんだよ

82:名前は開発中のものです。
23/09/29 19:51:15.97 4YW0vA30.net
>>81
それはアリだねただ一応秘密で作ってるんでどこまで内容書くかは悩みどころだが
今やってるのはアイテム合成システムの設計
合成時に素材の特殊能力を引き継ぐのだが、異なる特殊能力同士が合体して新たな特殊能力に変わるシステムをどうやって実装するか考えている
一番手っ取り早そうなのは、
①素材アイテムの特殊能力をコレクションに格納する→②コガネブログからお借りした組み合わせ列挙拡張メソッドを使って事前に指定した合体組み合わせに該当するか調べる→③合体組み合わせが不存在になるまで繰り返す
かなと思っている

83:名前は開発中のものです。
23/09/30 07:12:12.43 HN5eRe95.net
俺もちょうど合成システム作ってるとこでビビった
俺は2つのarrayをソートして、比較する単純なものだけど…

84:名前は開発中のものです。
23/09/30 22:25:15.09 AozLAQh5.net
>>83
合成が合成システムを実行したその1回しか行われないならそのやり方の方が楽そう
自分のは合成して特殊能力が合体した際に次レベルの合体条件も満たしていたら順次合体を繰り返していく機能を想定しているから、配列やリストを何回も走査すると重いかもなあという懸念がある
ただコガネブログのも合体成立時に何回も呼び出すと重そうなので、素材アイテムの持つ特殊能力の管理番号全てをHashSetに入れて、差集合とAddを使って合体組み合わせを探していくのもアリかも
こればっかりは自分の設計に合わせて複数のコードを組んで検証してみるしかないね

85:名前は開発中のものです。
23/10/04 01:17:36.07 1pamoYKo.net
おや?停滞?

良スレかと思ってたが、中途半端に投げ出す感じな

86:名前は開発中のものです。
23/10/04 17:41:48.36 DAn/y1Is.net
今は既に調べておいた知識でゆっくり作っている状況だから特に書くことが無いのよね
グラフィックス関係の勉強もしてるんでそっちに多く時間を割いてるのもある
一応調べたことの備忘のスレのつもりなんで、何も調べてないのに毎日作業内容を報告するのもなんか違うと思うし
あと単純に最近安定して5chが見られなくないか?
基本的にメモは作業用ではないPCのEdgeで書いてレスしてるけど、今もまたスレが開けなくて内容ドライブ経由でコピーしてスマホからレスした

今やってる作業はアイテム合成システムのクラス設計、メニュー画面・装備画面UIの作成あたりかな
ゲームシステムについての最近考えている事は
・アイテムの購入・売却の実装
既にエクセルデータをスクリプタブルオブジェクト化して売値・買値等のデータを取り込んである & プレイヤー以外もアイテムを所持できるようにプレイヤー・NPCの共通基底キャラクタークラスに所持品クラスのフィールドと取得用インターフェースを実装済み、装備画面UIの作成時に抽象クラスとインターフェースを利用して割と再利用性を高めてある(つもり)なので、作成自体はそこまで難しくなさそう。
アイテム売る商人の持つアイテムデータは、アイテムインスタンスクラスに[Serializable]を付けてキャラクタークラス→所持品クラス→アイテムインスタンスで開いてインスペクターから直接設定するか、又は何らかのコレクションで値だけインスペクターから設定してStart関数でアイテムクラスのインスタンスをnewしてコンストラクタにその値を渡してやればよさそう
ただそもそもゲーム内に商人を実装するかは未定
・3Dのゲーム性を採用するか
購入済みのノーコード系アセットがパフォーマンスの向上目指して改修されるそうなんでやっぱり使ってみたい感がある(気持ちの問題)。
あとこのアセットがasync/await使ってる所為でアセットの機能にアクセスするとそれなりにGC発生するんだけど、将来的にはUnityにも.NET5のAsyncValueTaskが導入されたら更にパフォーマンス向上するかも(非同期処理のこと全然分かってないので自分でアセットのコアコードをUniTaskに置き換えるのはまだ怖い)

87:名前は開発中のものです。
23/10/04 17:42:01.17 DAn/y1Is.net
C#・Unityの勉強としては
・非同期処理
上でも書いたがよく分かってない。今作っている範囲だと用途は少なそうだけど、唯一「アイテムを大量に捨てる場合」に役立ちそうな気がしている。
というのもアイテムを捨てる際には自作のアイテム管理クラスのアイテム破棄の関数をコールするのだが、検索システムに備えて入手時にコレクションへの登録を沢山しているので破棄時には逆にコレクションからの削除を行う必要がある
アイテム捨てる処理は入手処理と違って新たなインスタンスはほぼ生成しないのでGCの問題はないが、単純にコレクションへのアクセスが多いのと、プレイヤーが何百・何千個ものアイテムを一気に捨てることができるUIを組んでしまったので大量にアイテム破棄を行うと余裕で60fps割ってしまう。また所持品管理ディクショナリーの参照が切れるのでアイテムインスタンス自体もガベコレの対象になるのでガベコレによるスパイク発生の危険性も高くなる。
そこで非同期処理を用いてフレームを分散してアイテムの破棄を行えば、捨てる処理自体のスパイクは軽減できるかなと思った
プレイヤーは1f単位で処理を認識している訳ではないので、内部的には数fに分離しても多分気が付かない(あまりに重い場合は「アイテムを捨てています」等の進捗を画面に表示した方がよさそうだけど)
非同期処理はコルーチン、async/await、UniTaskあたりが有名なのかな?性能でいえばUniTask一択なんだろうけどまずはコルーチンから試してみようと思っている(GCは知らない)

88:名前は開発中のものです。
23/10/07 18:13:33.15 zKcOYlJC.net
自分はインボーク、インボークリピートをもっぱら使うなぁ

89:名前は開発中のものです。
23/10/07 21:08:01.13 AbV00O8h.net
>>88
InvokeやInvoke.RepeatingはMonoBehaviourの機能だから個人的にあまり使いたくないなあと思ったり(他のクラスに移植したり仕様変更する際に面倒そうなので…)
引数にstring型使うからアロケーションも心配
ただアタッチ先ゲームオブジェクトだけで完結する処理ならそれが手っ取り早そうだね

90:名前は開発中のものです。
23/10/07 21:19:34.52 iuLYjSS8.net
でも引数はメソッドの名称だからアロケーション発生しないんじゃね?

91:名前は開発中のものです。
23/10/07 22:01:39.06 AbV00O8h.net
>>90
エディタ上でテストプレイしてみたけど。確かにMonoJIT以外でのアロケーションは発生しないね
原因について雑に調べたけど、もしかしたら文字列リテラルだからコンパイル時に生成・メモリに格納されて一致する限りは使い回しがされるからっぽい

92:名前は開発中のものです。
23/10/07 22:01:43.61 AbV00O8h.net
>>90
エディタ上でテストプレイしてみたけど。確かにMonoJIT以外でのアロケーションは発生しないね
原因について雑に調べたけど、もしかしたら文字列リテラルだからコンパイル時に生成・メモリに格納されて一致する限りは使い回しがされるからっぽい

93:名前は開発中のものです。
23/10/07 22:23:13.50 ABeNJcDO.net
潔癖症みたいやねそこまで気にするのって

94:名前は開発中のものです。
23/10/08 09:30:28.99 raa6/Dtd.net
非同期処理はコルーチンしか使ったことないや

95:名前は開発中のものです。
23/10/08 21:22:41.79 9d1oOF7A.net
>>93
GCallocは削れば削るだけ良いからね
自分はECSを使うのは現状では無理そうだから削減可能な場所は全て対応するようにしている
>>94
MonoBehaviourで非同期処理を扱うならコルーチンが入門な感じがあるね
返し値を扱うのが面倒そうなのが難点だけどそれでもUniTaskよりはとっつきやすそう(偏見)

96:名前は開発中のものです。
23/10/08 21:32:09.46 RWVJHt61.net
今のパソコンというか環境でも
やはりけづれる物は削る方がいい?

初心者とかそこまで考える必要はあるのかな?

97:名前は開発中のものです。
23/10/09 14:29:55.33 rvC4W/MI.net
>>96
明らかなボトルネックや安定した後の最適化ならともかく、開発中はできるだけ素直でメンテナンスしやすいコードの方が良いよ

98:名前は開発中のものです。
23/10/25 17:52:32.75 lBkP/TA2.net
進捗どうですか?

99:名前は開発中のものです。
23/11/15 23:27:25.96 Qaq3TktU.net
エタったか
無駄なスレ建ててまで書くなよ

100:名前は開発中のものです。
23/12/08 13:29:57.09 UU5wTPU9R
国会でいい感じに質問してる優秀な議員を見かけて維新かと思ったら立憲だったわ
立憲は憲法の下の平等も世代による公平もガン無視の児童給付だの税金泥棒主張をやめて藤岡隆雄氏みたいなのだけにしろよ
子を育てられるだけの金もないのに孑を産み落としたら遺棄罪で逮捕懲役.日当5千円て゛塀の中から子に送金させるのが筋だろうに
犯罪者に追い銭とかモラルハザ-ドいい加減にしとけ、風俗で働いて子育てしてる自立した女なんていくらでもいるだろうにそんな女と
陳情寄生蟲女と温室効果ガスに騒音にコロナにとまき散らして他人の権利を強奪して儲けてる空飛ぶ強盗殺人女、クズっぷり比較しろ
国が介入するならひとり産み落とすこ゛とに数千万課税して払える見込みがなければ逮捕懲役にしたり親権廃止するくらいだろ
1か月も男と暮らしてた某JKなんて家出だろうに問答無用で逮捕されたんだろな哀れ、その男が充分な金を持ってて責任を持てるなら
毒親と居るより幸せなのは明らかなんだし親を捨てて余裕ある家に行くことを合法化するのか゛税金泥棒より理に適ってるのは明白
(羽田]TURLリンク(www.call4.jp)<)
〔成田)TТps://n-souonhigaisosyoudan.amеbaownd.Сom/
[テロ組織)тtps://i.imgur.com/hnli1ga.jpeg

101:名前は開発中のものです。
25/01/03 23:56:22.95 K8DLSojOa
労働者階級から大企業資本家階級に富を推移させて経済ぶっ壊しながら見かけの株価吊り上げて社会に治安にと破壊し続けてる自民公明だが
今頃気づいて過半数割れさせてももはや手遅れ、JALた゛のANΑた゛のクソアイヌドゥた゛の斉藤鉄夫だの国土破壊省だのクソポリ遊覧ヘリだのに
莫大な温室効果カ゛スに騷音にとまき散らさせて氣候変動、災害連発させて人殺しまくって私腹を肥やして業務妨害まて゛させながら凄まじい
損害を受けてる住民に補償すらせず生活困窮させてナマポまでシメまくって年100万にも満たない金のために平均年収700万のクソ公務員の
ご機嫌取りしてクルマまで取り上げられるくらいなら闇バイト強盗詐欺のほうが合理的た゛わな
例えは゛ミャンマ一には1兆圓以上日本の税金投入して住民殺しまくりクーデター軍の利益になってるが自民癒着大企業がその事業受注してるし
莫大な公共事業名目の金くらって年収1000万超だらけの社会の寄生虫大企業に奪われまくり零細個人にはインボヰスだの銀行口座厳格化だの
強権狂乱政治によって収入壊滅させてもはや気候変動同様、社会崩壞のティッピングポイントを超えて体感治安なんて次元じゃなくなるぞ
(ref.] ttps://www.сall4.jp/info.Ρhp?тypе=itеms&id=I0000062
URLリンク(han)<)
ttps://n-souonhigaisosyoudan.amеbaownd.com/


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch