[過去ログ]
【ゲームエンジン】Unityなんでも質問スレpart12 (1002レス)
【ゲームエンジン】Unityなんでも質問スレpart12 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
201: 名前は開発中のものです。 [sage] 2023/11/25(土) 18:13:23.28 ID:PO4/Hp6H まぁそもそも配列にぶち込むのと 生成処理を一緒にやろーなど 初心者にはラベルが高かったんや http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/201
202: 名前は開発中のものです。 [sage] 2023/11/25(土) 18:15:56.11 ID:3GSRLZ8G 言語自体をもう少し勉強したほうがいいレベルだな http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/202
203: 名前は開発中のものです。 [] 2023/11/25(土) 18:19:16.69 ID:FGDWLLI7 とりあえず、これで↓配列内にはプレハブが入ってくれました。 記述からして当然なんですけど。。。 public GameObject[] Array01; public GameObject[] Array02; void Start() { Array01 = new GameObject[10]; Array02 = new GameObject[10]; GameObject obj = (GameObject)Resources.Load("prefab_obj"); for (int i = 0; i < Array01.Length; i++) { Array01[i]=Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity); } for (int i = 0; i < Array02.Length; i++) { Array02[i]=Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity); } } ただ、自分が知りたかったのは Array01,Array02を指定しなくても座標が変わりながらの ちゃんとArray01,Array02の添字分、 プレハブオブジェクトが並んだことです。。 for文を消せば、それぞれのプレハブも存在しないんです。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/203
204: 名前は開発中のものです。 [] 2023/11/25(土) 18:20:31.48 ID:FGDWLLI7 あ、それぞれVector2(i, 0.0f)です。座標変えながらです。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/204
205: 名前は開発中のものです。 [sage] 2023/11/25(土) 18:21:55.95 ID:Og5vMXyN unityでファミコンのスプライトオーバーの再現やった人いますか http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/205
206: 名前は開発中のものです。 [] 2023/11/25(土) 18:22:49.76 ID:6mVYgNka >>203 Instantiate(obj, new Vector2(i, 0.0f), Quaternion.identity); ↑これだけ これだけで、「座標(0, 0)にobjを複製してシーンに配置する」までやってくれる for文を消すというか、Instantiateしなければプレハブオブジェクトはシーンに生成・配置されないから並ばんよ http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/206
207: 名前は開発中のものです。 [] 2023/11/25(土) 18:27:17.96 ID:FGDWLLI7 >>206 ああ、つまり配列には入れないけど、 プレハブオブジェクトの生成はしてるってことですね。 ありがとうございます。 相手してくださった皆さまもありがとうございました。 これからも勉強します。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/207
208: 名前は開発中のものです。 [sage] 2023/11/25(土) 18:31:44.66 ID:PO4/Hp6H もし気になるなら for (int i = 0; i < Array01.Length; i++) { Array01[i]=Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity); } ちゃんとArray01,Array02の添字分、 プレハブオブジェクトが並んだことです。。 このfor文のArray01.Lengthを9にしたり、11にしたりして再生すりゃいい それぞれ何処までも配列入るかみりゃわかるよ http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/208
209: 名前は開発中のものです。 [sage] 2023/11/25(土) 18:33:31.35 ID:PO4/Hp6H ま配列やる場合、テスト的には少ないのでやるのが最初はオススメやね最低の数で http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/209
210: 名前は開発中のものです。 [sage] 2023/11/25(土) 19:28:39.77 ID:dzXcaoGO PS1のテクスチャとかSFCのドット絵くらいの解像度の画像をローポリ3Dモデルにタイリングで貼りたいんだけど、 タイルを一枚一枚を別の画像として取り込むのと、一枚の画像に詰め込んでシェーダー側で座標を指定して表示するのとでは、どっちのほうが動作時のパフォーマン良いですか? staticを適用するモデルが99%になる予定で、タイリングはモデル側のUV展開で実装します http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/210
211: 名前は開発中のものです。 [sage] 2023/11/25(土) 19:30:09.75 ID:dzXcaoGO >>210 staticを適用するのはシェーダーで座標指定をしない場合の話です staticにするとシェーダーによる座標していが効かなくなるので http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/211
212: 名前は開発中のものです。 [sage] 2023/11/25(土) 19:31:29.25 ID:tUq1KY+K 作られたオブジェクトのスクショが有ればすぐ判明したことでは? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/212
213: 名前は開発中のものです。 [] 2023/11/25(土) 20:16:45.79 ID:c7/JKC6p こんにちは。 今まで一つのプロジェクトにマテリアルやらスクリプトを詰め込んで、複数のゲーム素材を一緒にしてたんですが プロジェクトを分けようと思って、新規プロジェクトを開いてそこにスクリプトを移したらスクリプトクラスが見つからなくなってしまいました 原因は恐らくどこかでスクリプトクラス名が被っているファイルが点在しているからだと思うんですけど 別プロジェクトでも同じ名前のスクリプトは使えないのでしょうか? unity側で被っているのか、VisualStudio側で被っているのかも検討つきません 今からまた調べますが何か対処法ありませんでしょうか http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/213
214: 名前は開発中のものです。 [] 2023/11/25(土) 20:30:31.32 ID:c7/JKC6p >>213 スクリプトクラスが見つかってないのは新規プロジェクト側でして スクリプトの名前を変えるのは根本的な解決というか理解に至らないので出来ればやめようと思ってるんですけど。 ファイルがある場所をunityハブのプロジェクト名の横の3点リーダー…からファイルを開いて、新規プロジェクトのアセットのとこに直接ぶち込んだんですよね。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/214
215: 名前は開発中のものです。 [] 2023/11/25(土) 20:38:13.49 ID:6mVYgNka >>213 (なんかわいのぶち込むって言い回しがこのスレ内で伝染してるな・・・) UnityプロジェクトのAssetsフォルダ内に資産一式を配置することになると思うけど、この中でクラス名の重複は認められない 実質的にスクリプトファイル名の重複も認められてない 一応C#のnamespaceっていう仕組みを利用すれば重複可能になるけど、C#の理解が浅いうちは無暗に首ツッコまないほうがいいかも ということでAssetsフォルダ内の全csファイルのクラス重複確認をすれば解決する・・・はず http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/215
216: 名前は開発中のものです。 [] 2023/11/25(土) 20:48:46.18 ID:c7/JKC6p >>215 返信ありがとうございます! 一応アセット内での被りは無さそうなんですよね。unityのウィンドウ内で出来る範囲とは別に、PC側のファイルの保存フォルダ側に問題あるのかなって気もしてます ちなみにこのスレを開くのは初めてなので言い回しは残念ながら偶々です。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/216
217: 名前は開発中のものです。 [] 2023/11/25(土) 21:04:25.66 ID:9rpRVGI9 >>166 SSDはどれくらいあればいいの? 何とかも初心者やから分からんけど ゲーム作るのにSSD容量は結構大事なの? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/217
218: 名前は開発中のものです。 [sage] 2023/11/25(土) 21:22:04.21 ID:tUq1KY+K >>217 SSDは持ち運びする&iPhoneなどのバックアップ入れるなら大目に。そうでなけりゃできれば512もあればよろし。 256にするとどうなるかはわかんないけど、最近のアプリを見るとちょっと心許なく。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/218
219: 名前は開発中のものです。 [sage] 2023/11/25(土) 21:24:36.25 ID:tUq1KY+K プロとしてやっていくなら、もりもりでw 最初ちょろちょろ、あとモリモリでもいいけどそれが良いかは結果の後にわかる事なので、最初からモリモリなら本気度マックス、とか形からでw http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/219
220: 名前は開発中のものです。 [] 2023/11/25(土) 21:28:38.36 ID:c7/JKC6p >>216 PC側のファイルフォルダを見てみたら2つのプロジェクトファイルが作成されてて同じスクリプトファイルが生成されてます でもそれ以外に不審な点は見つからないですね。これがダメならプロジェクト別でもスクリプトクラスが被ったらダメってことなんですかね…? VisualStudio側でプロジェクトが分けられていない?とかネットに書いてあったのでVisualStudioも見てみようかな…初心者だし手探りで頭が痛いよ… http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/220
221: 名前は開発中のものです。 [] 2023/11/25(土) 21:33:14.98 ID:6mVYgNka >>220 Everythingっていうソフトおすすめ 「"C:\aaa" .cs」って検索するとC:\aaaフォルダの下にいる拡張子が.csのファイルを全部一覧表示してくれる それで特定のプロジェクトフォルダ配下に名前ソートかけて同名のcsファイルが2ついないか見るとか http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/221
222: 名前は開発中のものです。 [] 2023/11/25(土) 21:53:05.91 ID:c7/JKC6p >>221 ありがとうございます!他に手立てがないんで一旦試してみようかと思います。 ちなみにVisualStudio側はプロジェクト分けられてるっぽいですね。じゃあ何がダメなんだろう http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/222
223: 名前は開発中のものです。 [] 2023/11/25(土) 22:15:04.00 ID:c7/JKC6p >>221 検索かけてみましたら、先述したファイルに被りがあるのみ。これ以上時間もかけたくないのでスクリプトクラス名を新しくしようと思います。笑 ありがとうございました! http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/223
224: 名前は開発中のものです。 [] 2023/11/25(土) 22:19:21.88 ID:9rpRVGI9 >>218 色々調べてるけど 新型の情報はないのかな? まあ新型出ても初めは高いだろうし MacBook AirM2かMacBook ProM3かで悩む 14インチと15インチ、16インチの違いはどう? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/224
225: 名前は開発中のものです。 [sage] 2023/11/25(土) 23:40:04.33 ID:PO4/Hp6H SSD? 君たちまだストレージ保管してんの? そんなンクラウドでええやん http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/225
226: 名前は開発中のものです。 [] 2023/11/26(日) 00:32:27.32 ID:m41MARBn どこのクラウドがいいの? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/226
227: 名前は開発中のものです。 [sage] 2023/11/26(日) 05:23:57.71 ID:ZwpA0qEM やめなよ http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/227
228: 名前は開発中のものです。 [] 2023/11/26(日) 06:44:39.83 ID:m41MARBn >>227 このハゲ! http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/228
229: 名前は開発中のものです。 [] 2023/11/26(日) 07:27:15.33 ID:J5rQpI/4 完全につまずいてしまいました。どうかお知恵を貸してください。 配列[10]に詰め込んだオブジェクトの中に変数aがあります。 ゲームマネージャーの方で毎回for文で配列の要素内の変数aを確認して、 該当した場合にそのオブジェクトの変数bにtureを代入する。 ということをやりたいです。 文字で説明するとしごく単純な作業なんですが、これがうまくいきません。 自分の考え方としては、ゲームマネージャーの方で配列内を確認するために for (int i = 0; i < 10; i++) { if(配列[i].変数A < 2) { 配列[i].変数B = true; } } してやるだけなはずなんですが、、、、 この配列はゲームマネージャーで最初宣言したもので、 配列内の変数は各オブジェクトがもっているものです。 各オブジェクトには読み書きできるメソッドは作ってます。 public int 変数A{ get { return 変数a; } set { 変数a = value; } } public bool 変数B{ get { return 変数b; } set { 変数b = value; } } でも、下記のままでは「GameObject」には「変数A」の定義が含まれておらず〜」とエラーが出ます。 for (int i = 0; i < 10; i++) { if(配列[i].変数A < 2) { 配列[i].変数B = true; } } これが機能するようにするために、何が足りないのか、教えてください。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/229
230: 名前は開発中のものです。 [] 2023/11/26(日) 07:46:45.71 ID:ap8K17/p 文面から配列にはGameObjectが入っているものと推測する それで変数Aや変数Bを定義してるコンポーネントはHogehogeクラスとする この場合、配列はGameObject[]ではなくHogehoge[]でないといけない あるいはGameObjectの配列の要素に対してGetComponentしてHogehogeを取得する Hogehoge hooo = 配列[i].GetComponent<Hogehoge>(); GameObjectはGameObjectの情報しか持ってないので、Hogehogeの変数を参照しないとHogehogeの情報にはアクセスできない http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/230
231: 名前は開発中のものです。 [] 2023/11/26(日) 08:27:07.96 ID:m7xu9wcS エラー本文とコード見てないからわからんけど、書き方的にGameObjectからそのまま参照しようとしてそうだね http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/231
232: 名前は開発中のものです。 [] 2023/11/26(日) 09:05:47.93 ID:J5rQpI/4 >>230 >文面から配列にはGameObjectが入っているものと推測する その通りです。 >それで変数Aや変数Bを定義してるコンポーネントはHogehogeクラスとする Hogehogeクラスとします。 >この場合、配列はGameObject[]ではなくHogehoge[]でないといけない ここの意味が理解できません。 ゲームマネージャークラス内で宣言した配列に、オブジェクトを入れています。 Hogehogeという名の配列はどこにも存在していません。 それでもHogehoge[]を記述できるんですか? でも for (int i = 0; i < 28; i++) { if(Hogehoge[i].変数A < 2){ Hogehoge[i].変数B = true; } } ではエラーになりました。 「「Hogehoge」はタイプです。指定されたコンテキストでは無効です」というエラーです。 Hogehoge hooo = 配列[i].GetComponent<Hogehoge>();を使う場合だと 「型または名前空間名 'Hogehoge' が見つかりませんでした」とエラーになります。 >GameObjectはGameObjectの情報しか持ってないので、 >Hogehogeの変数を参照しないとHogehogeの情報にはアクセスできない ここの理屈は理解できます。。。 記述するとき「配列[1].Hogehoge.変数A」見たくなる感じですか? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/232
233: 名前は開発中のものです。 [sage] 2023/11/26(日) 09:27:49.83 ID:qtPMCWA8 独自クラスをchatGPTで、聞いてね http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/233
234: 名前は開発中のものです。 [sage] 2023/11/26(日) 09:29:50.22 ID:qtPMCWA8 変数Aを定義したC#よファイルに名前付けたでしょ? それな、クラス名やぞ http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/234
235: 名前は開発中のものです。 [] 2023/11/26(日) 09:47:00.82 ID:J5rQpI/4 >>234 理解しています。 ここではHogehogeと記載してますが ちゃんと変数Aを記載しているクラス名を コードの方では書いてるんです。 それでも>>232に書いたエラーになります。 シングルトンしてないとダメとか、 ゲームマネージャーのスクリプトのusingに記載しないといけないとか 別にないですよね?? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/235
236: 名前は開発中のものです。 [] 2023/11/26(日) 10:01:19.86 ID:J5rQpI/4 <gamemanager.cs>←空のオブジェクトにくっつけてます public GameObject[] Array01; void Start(){ Array01 = new GameObject[10]; GameObject obj = (GameObject)Resources.Load("プレハブ名"); for (int i = 0; i < Array01.Length; i++) {Array0[i] = Instantiate(obj, new Vector2(i,0.0f), Quaternion.identity);} } <prefab_object.cs>←プレハブ化したオブジェクトにくっつけてます public int variable_a = 0; public int Variable_a{ get { return variable_a; } set { variable_a = value; } } 簡易版で説明しますと、↑この状況なだけです。 これで、<gamemanager.cs>のvoid Update()の中で<prefab_object.cs>のVariable_aを利用したいんです。 <gamemanager.cs>内に 「Debug.Log(Array01[0].Variable_a);」と記載したらエラーが出ます。 「Debug.Log(prefab_object[0].Variable_a);」と記載したらエラーが出ます。 「Debug.Log(Array01[0]);」と記載してもエラーが出ます。 「Debug.Log(prefab_object[0]);」と記載してもエラーが出ます。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/236
237: 名前は開発中のものです。 [] 2023/11/26(日) 10:02:55.92 ID:ap8K17/p // Hogehoge.cs public class Hogehoge : MonoBehaviour { public int 変数A{ get { return 変数a; } set { 変数a = value; } } public bool 変数B{ get { return 変数b; } set { 変数b = value; } } } // GameManager.cs public class GameManager : MonoBehaviour { public GameObject[] objects; // ? private void Start() { int aaa = this.objects[0].変数A; // ? int bbb = this.objects[0].GetComponent<Hogehoge>().変数A; // ? } } GameManagerの?はthis.objects[0]を見ている=GameObjectクラスを見ているので、GameObjectに変数Aがなくてエラーになる ?はthis.objects[0](GameObject)からHogehogeクラスを取得してHogehogeクラスを見ているので、Hogehogeの変数Aを見てエラーにならない ただしGetComponentはコストが高い処理なので、毎フレーム実行する必要がある場合などはクラス変数(?)にHogehogeの変数を定義しておきそれにアクセスするほうが低コスト public Hogehoge[] hogehoges; http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/237
238: 名前は開発中のものです。 [sage] 2023/11/26(日) 10:30:50.60 ID:sKe5WX7u >>235 理解してないからGameobjectの配列作ってるんでしょ、と書こうとしたら >>237さんが、答え イケメン 手取り足取りでみんな優しい これで理解もしないクソプログラマーが生まれる http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/238
239: 名前は開発中のものです。 [] 2023/11/26(日) 10:32:30.63 ID:ap8K17/p 教えすぎないほうがいいのかなあ http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/239
240: 名前は開発中のものです。 [] 2023/11/26(日) 10:39:04.38 ID:J5rQpI/4 >>239 >教えすぎないほうがいいのかなあ そんなことありません。 正解を教えて頂いたあと理解するため自分で何度も理解する様努めますし。 もちろん、理解しないままでいいやって人もいるでしょうけど 自分は次から自分のものにしないと意味がないとわかっているので 答えを知ったら終わりのつもりありません。 ただ、自力で答えにたどり着くには独学や人の限られたブログなどでは 行き着けない場合もあるんです。 そんな時、あなたの様にスパッと答えを教えて頂けるのは非常にありがたいと思っています。 ありがとうございます。 すみません、 >Hogehogeの変数を定義しておきそれにアクセスするほうが低コスト >public Hogehoge[] hogehoges; について、もう少し具体的に解説お願いできないでしょうか。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/240
241: 名前は開発中のものです。 [] 2023/11/26(日) 10:48:37.62 ID:J5rQpI/4 >毎フレーム実行する必要がある場合などは >GameManager.csのクラス変数に >Hogehogeの変数を定義 public Hogehoge[] hogehoges; これでHogehoge型の配列を作っても hogehogesはまだ空の状態ですよね? hogehoges = new Hogehoge[10];みたいなのやんないと アクセスできませんか? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/241
242: 名前は開発中のものです。 [] 2023/11/26(日) 10:59:45.33 ID:ap8K17/p >>240 C#というかUnityと付き合っていけばいずれパフォーマンスの最適化という壁にぶち当たる日が来る そうなった時、というかそうなった時には大抵手遅れだから、同じ結果が得られるならコストが低い処理を極力使ったほうがいい GameObject obj1; という変数があるとして、このobj1にアタッチされたHogehogeコンポーネントにアクセスしたい場合 Hogehoge hooo1 = obj1.GetComponent<Hogehoge>(); でアクセスすることは可能 ただしGetComponentを1回実行すると、GC.Allocというメモリ上のゴミが発生する上にこれ自体の所要時間も結構なものだから、GetComponentはコストが高い 「私1フレーム内でGetComponentを10回使ってるんですよ〜」とか言ったら吐き気を催される なのでGetComponentの使用回数は最小限に減らさなければいけない 1つのプレハブを複製するというのが要件にあるようだから、それを加味したうえでGetCompoenentの使用回数を最小限に減らすと http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/242
243: 名前は開発中のものです。 [] 2023/11/26(日) 11:00:07.84 ID:ap8K17/p こうなる↓ public class GameManager : MonoBehaviour { GameObject prefab; Hogehoge[] hogehoges; private void Start() { hogehoges = new Hogehoge[10]; for (int i = 0; i < hogehoges.Length; i++) { GameObject obj = Instantiate(prefab); // プレハブから複製オブジェクトを生成・配置する hogehoges[i] = obj.GetComponent<Hogehoge>(); // 複製オブジェクトからHogehogeコンポーネントを取得して、配列hogehogesにぶち込む obj.localPosition = new Vector3(i, 0f, 0f); // 位置を変更 obj.localPosition = Quaternion.identity; // 角度を変更 } } private void Update() { for (int i = 0; i < hogehoges.Length; i++) { hogehoges[i].変数A = hogehoges[i].変数A + 1; // 【A】 } } } こうすれば毎フレームのHogehogeのアクセスはクラス変数にキャッシュした値へのアクセスになるので、パフォーマンスは最適化されたことになる GetComponentもそうだしInstantiateもそうだけど、UnityEngine傘下で定義された変数や関数は高コストという認識でおk Hogehoge[] hogehoges; みたいに自分で作成したコンポーネントやクラスの傘下に定義された変数や関数なら低コスト http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/243
244: 名前は開発中のものです。 [] 2023/11/26(日) 11:18:12.87 ID:ap8K17/p あ、>>243 obj.localPosition = new Vector3(i, 0f, 0f); // 位置を変更 obj.localPosition = Quaternion.identity; // 角度を変更 は obj.transform.localPosition = new Vector3(i, 0f, 0f); // 位置を変更 obj.transform.localPosition = Quaternion.identity; // 角度を変更 が正しい でも、このobj.transformもUnityEngine傘下の変数なので・・・あとは分かるだろうか http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/244
245: 名前は開発中のものです。 [sage] 2023/11/26(日) 11:24:49.94 ID:sKe5WX7u ホビーストクリエイターならコストとか処理遅いとか気にしなくてもいいよ ここに来るのはそういうのが大半でしょ 本格的な売り物なら別にだけどね http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/245
246: 名前は開発中のものです。 [sage] 2023/11/26(日) 12:29:20.67 ID:RHrCXnE8 ホビー云々関係なく、気になる問題は潰した方が将来のためだよ 不要なAPIコール抑えるのはプログラミングの基本 処理負荷気にしないプログラマは仕事でも品質悪いコードを書く http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/246
247: 名前は開発中のものです。 [sage] 2023/11/26(日) 12:33:35.93 ID:RHrCXnE8 >>242 GetComponentはGC発生しないよ 発生するのはGetComponentsなどの配列返すほう あと、GetComponentは意外とそこまで遅くない プロファイラを見るとわかる http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/247
248: 名前は開発中のものです。 [] 2023/11/26(日) 12:39:02.58 ID:ap8K17/p あああ配列を生成するためのGCが発生してんのか nameとかtagみたいにアクセスするだけでGCが発生する組だと思ってた UpdateでGetComponentするなは割とよく言われてる気がする https://www.google.com/search?q=getcomponent+update http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/248
249: 名前は開発中のものです。 [sage] 2023/11/26(日) 12:44:50.43 ID:sKe5WX7u それの一発目のテラのやつは問題ありませんキリッって、書いてるが まぁ大してとかある程度とかの体感記事などほとんどがスペック、時間という物を提示しないで、遅いとか重いとか言ってるとこのをベースに広まってるよね 所詮ハードが1年進化するだけでも重さなんか気にするほどじゃねーよ http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/249
250: 名前は開発中のものです。 [sage] 2023/11/26(日) 13:06:00.31 ID:RHrCXnE8 まじで他人の意見を鵜呑みにしてはいけないとはこのことw 自分はプロファイラ載せてる記事だけ見るようにしてる ただ、UpdateでGetComponentは無駄なので、キャッシュするに越したことはないとは思ってる Componentなんてほぼ静的だし http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/250
251: 名前は開発中のものです。 [] 2023/11/26(日) 13:13:11.53 ID:kOB5vzh5 要するに他のスクリプトにアクセスするのにGetComponent使わないと いけないことを知らないだけだな http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/251
252: 名前は開発中のものです。 [] 2023/11/26(日) 13:33:35.58 ID:ap8K17/p 2022/8/15 サイバーエージェントのパフォーマンスチューニングバイブル https://github.com/CyberAgentGameEntertainment/UnityPerformanceTuningBible 9.3 コンポーネントの取得 同じ GameObject にアタッチされている他のコンポーネントを取得する GetComponent() も注意が必要な 1 つです。 前節の tag プロパティや name プロパティ同様にネイティブコードで実装された処理を呼び出していることもそうですが、指定した型のコンポーネントを「検索する」コストがかかることにも気をつけなければなりません。 下記サンプルコードでは毎フレーム Rigidbody コンポーネントを検索するコストがかかることになります。頻繁にアクセスする場合は、あらかじめキャッシュしたものを使い回すようにしましょう。 毎フレーム GetComponent() するコード void Update() { Rigidbody rb = GetComponent<Rigidbody>(); rb.AddForce(Vector3.up * 10f); } http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/252
253: 名前は開発中のものです。 [] 2023/11/26(日) 13:35:36.82 ID:ap8K17/p ついでに2022.3.10f1で検証してきた https://i.imgur.com/itDtIfy.png この差を気にするか気にしないかはきのこたけのこ張りの宗教戦争なので、きのこが好きかたけのこが好きかによって意見が真っ二つやね http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/253
254: 名前は開発中のものです。 [sage] 2023/11/26(日) 13:49:05.74 ID:sKe5WX7u まぁ初心者のときにやることとして アップデートでprintするとメチャログ埋まるやん それを見て、あっやべーアップデートでそういう事しちゃあかんなと思えればいいんでねーかな printですらこんなに沢山なんだから他の処理やったら大変だ!と思えればキャッシュしてやろーって思わないなら向いてね~ってことで(笑) http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/254
255: 名前は開発中のものです。 [] 2023/11/26(日) 14:08:31.06 ID:kOB5vzh5 俺がGetComponetするのはStartかAwakeの中 それと何かと衝突した時とかの特定のイベント時くらいかな Updateの中で常時使わないね http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/255
256: 名前は開発中のものです。 [] 2023/11/26(日) 14:13:45.97 ID:J5rQpI/4 神々が言い争ってるみたいですが、 結局、私はupdate()内でGetComponent() を記載しまくっても さほど問題にはならないということでしょうか? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/256
257: 名前は開発中のものです。 [sage] 2023/11/26(日) 14:17:57.98 ID:RHrCXnE8 例えどんなにマシンのスペックが上がったとしても 要求される表現のハードルが上がるだけなので宗教もクソもない 無駄な負荷のかからない「当たり前」のコードを書く習慣をつけておけばいいだけ PS5やPCゲーム主流の現在でも、何故パフォーマンスチューニングなるものが必要なのか考えればわかる話 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/257
258: 名前は開発中のものです。 [] 2023/11/26(日) 14:21:07.35 ID:ap8K17/p その当たり前の物差しが万人共通であればの話ね http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/258
259: 名前は開発中のものです。 [sage] 2023/11/26(日) 14:24:26.35 ID:aCF9jYUz GCのスパイクは塵積だし、いざ原因を探そうって時に心当たりが山盛りあったら手に負えなくね? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/259
260: 名前は開発中のものです。 [] 2023/11/26(日) 14:29:32.88 ID:J5rQpI/4 現状、 <GameManager.cs> void Update() { for (int i = 0; i < Array01.Length; i++) { if(i == 10){ this.objects[0].GetComponent<Hogehoge>().変数B = this.objects[I].GetComponent<Hogehoge>().変数A; }else{ this.objects[i+1].GetComponent<Hogehoge>().変数B = this.objects[I].GetComponent<Hogehoge>().変数A; } } で正しく動いてくれました。 で、>>243さんのご指摘にある「GetComponentをupload()に書くのは好ましくない」というご意見から 今、>>243さんの記述してくれたコードを理解して それを実装して、これと同じことを再現しようとしています。 ただ、this.objects[添字].GetComponent<Hogehoge>().変数名;という1文だけで 済んでいる現状で問題ないなら分かりやすいこの記述方法で行きたいなあというのが正直なところです。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/260
261: 名前は開発中のものです。 [sage] 2023/11/26(日) 14:33:47.06 ID:RHrCXnE8 少なくとも関数コールの結果をキャッシュして無駄な計算を減らすと良いのは プログラミングとして当たり前の概念 たとえばsin,cosなどの関数は引数に対して結果が同じだから、 キャッシュしておくと高速化できる 可読性を落としてまでGetComponentケチれとは言わないが Updateで毎回コールするくらいなら変数にキャッシュすれば済むので手間じゃないだろう あと、 GetComponent<Hoge>.Fuga(); GetComponent<Hoge>.Piyo(); みたいに続けざまに書くのもヤメレw http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/261
262: 名前は開発中のものです。 [] 2023/11/26(日) 14:38:54.57 ID:ap8K17/p まあ今はUnity勉強中で動けばなんでもOKだろうから毎フレームGetComponentでも別に問題ないよ ただ259みたいな宗派もいることは頭の片隅に置いといてね http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/262
263: 名前は開発中のものです。 [sage] 2023/11/26(日) 14:43:48.07 ID:RHrCXnE8 UpdateでGetComponentはまだわかるがUpdateでGCは流石にないw 過去にこう言うコード書く奴が居て >>259 のような悪夢が襲って大変な目に遭ったことがあったんよ プレイしてると何故か引っかかった動きをするんだもん Incremental GCもフレーム分散するだけだからUpdateでGCには効果なし http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/263
264: 名前は開発中のものです。 [] 2023/11/26(日) 14:48:03.88 ID:J5rQpI/4 >動けばなんでもOKだろうから いや、そこまで妥協したいというわけでも無いです。。。 その、>>243にあるコードって、 現在自分が書いてる<gamemanager.cs> public GameObject[] Array01; void Start(){ Array01 = new GameObject[10]; GameObject obj = (GameObject)Resources.Load("プレハブ名"); for (int i = 0; i < Array01.Length; i++) {Array0[i] = Instantiate(obj, new Vector2(i,0.0f), Quaternion.identity);} } で、いうと、 GameObject型の配列じゃなく、prefabのクラス型で配列を宣言して、 あとは同じことをしてその配列に突っ込みなさいって感じですか? で、prefabのクラス型で配列で作ったら、いちいちGetComponentしなくてもいいよって 理解で正しいですか? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/264
265: 名前は開発中のものです。 [sage] 2023/11/26(日) 14:57:45.07 ID:o5cSag8H いつになくスレがまともだ。。。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/265
266: 名前は開発中のものです。 [] 2023/11/26(日) 14:58:57.43 ID:ap8K17/p >>264 それで大丈夫 ちなみに今ここには《動けばいい派 >>245》《コードに無駄が無ければいい派 >>261》《可読性を落としてでも速度を最重視したい派 ワイ》がおるでな Unityへの理解が深まれば宗派も二転三転すると思うけど頑張って http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/266
267: 名前は開発中のものです。 [sage] 2023/11/26(日) 15:05:48.10 ID:uqB1fo0P GetComponentをUpdateの中で呼ぶにしても先にnullチェックするだけで効率化されるのにUpdate毎にGetComponent呼ぶのは流石にアホのすること http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/267
268: 名前は開発中のものです。 [sage] 2023/11/26(日) 15:10:57.38 ID:RHrCXnE8 そんな時はTryGetComponentを使うのがおすすめ nullチェック相当も全部これで間に合う http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/268
269: 名前は開発中のものです。 [sage] 2023/11/26(日) 15:15:03.57 ID:RHrCXnE8 ああ間違ったキャッシュ変数のnullチェックのことね それならどっち道必要だわごめん http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/269
270: 名前は開発中のものです。 [] 2023/11/26(日) 15:25:20.80 ID:ap8K17/p Unity2019辺りで GameObject obj = Instantiate(prefab); DestroyImmediate(obj); Debug.Log(obj?.name); みたいなコード書いたらヌルポだったんだけど、Unity2022辺りは改善されたのかな こういう細かい仕様って今日みたいな機会でもないとわざわざ調べる気にならんのよね・・・ http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/270
271: 名前は開発中のものです。 [] 2023/11/26(日) 15:33:06.23 ID:J5rQpI/4 >>266 ありがとうございます。がんばります!! 絶対Unityから逃げません! 今作ってる処女作が完成したら、ここで皆さんに配布させてください! 絶対「面白い」って言わせてみせます! (それまでに何度かまた障害にぶつかると思うんでまた相談させてください) http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/271
272: 名前は開発中のものです。 [sage] 2023/11/26(日) 16:00:34.31 ID:sKe5WX7u 宗派かぁ 癌になるから肉食わない ビーガンなので肉食わない ビールも酒も飲む 宗教で禁止されてるから飲まない どれもすんげー長生きするとかしてないじゃん、これで二百年生きますならそれすればいいけど、二百年生きてヨボヨボじゃね パソコンもソフトも変わらんよ OSはますます肥大化してるんだし いくらアプリの細かいところをやったところでね 処女作ならサクッと完成品作って動く喜び味わうのがいいよ 動かしてみて引っかかるとかの現象が起きればそれは改良するチャンス 次に活かせばいいだけや まずは完成品やで http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/272
273: 名前は開発中のものです。 [] 2023/11/26(日) 17:30:21.75 ID:J5rQpI/4 すみません、 >>243さんのコード試してみてるのですが GameObject obj = Instantiate(prefab); // プレハブから複製オブジェクトを生成・配置する で、 「インスタンス化したいオブジェクトが null です」とエラーが出ます。 自分もコードみてて気になってたんですが、 自分が書いてたコードの時でいうところの GameObject obj = (GameObject)Resources.Load("プレハブの名前");みたいに どこかでプレハブ化しているオブジェクトの名前を記述しなければならない気がするんですが 違いますか? 例えば、 public GameObject prefab; void Start() { GameObject obj = Instantiate(prefab); } これでは、prefabにはなにも入っていません。 記述漏れかな?とか。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/273
274: 名前は開発中のものです。 [sage] 2023/11/26(日) 17:37:44.06 ID:sKe5WX7u パブリックなんだからインスペクタで指定してるんでしょきっと http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/274
275: 名前は開発中のものです。 [] 2023/11/26(日) 17:49:39.47 ID:ap8K17/p >>273 MonoBehaviourを継承したスクリプトがアタッチされたオブジェクトが予めシーンのどこかに配置されてる前提になるけど、このオブジェクトを選択するとInspectorにpublicの変数が表示されてそこにオブジェクトを指定したりできるようになる 243はその前提のコードになってる http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/275
276: 名前は開発中のものです。 [] 2023/11/26(日) 17:56:54.74 ID:wJ4Ewbd+ (0,0,0)にあるオブジェクトの情報を取得する方法が知りたいんですが、 レイを飛ばすのとコライダーを使う以外に手っ取り早い方法ってないのでしょうか? オブジェクトを(0,0,0)ちょうどに置くので余計なことをしないでgameobject関数に入れたいのですが… http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/276
277: 名前は開発中のものです。 [] 2023/11/26(日) 18:17:53.87 ID:J5rQpI/4 >>275 ほんとだ、ゲームマネージャーのスクリプトのインスペクタに prefabの枠ができてました! 初歩的なことかもしれませんが プレハブ化したオブジェクトをその枠にドラッグしようとしたら プレハブクリックしたらプレハブのインスペクタに切り替わっちゃうんですが これ、どうすればいいんですか?^^; http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/277
278: 名前は開発中のものです。 [] 2023/11/26(日) 18:19:48.20 ID:J5rQpI/4 あー、すみません。 ドラッグじゃなくて、枠のほうで選べるんですね すみません。解決しました。 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/278
279: 名前は開発中のものです。 [] 2023/11/26(日) 18:21:25.49 ID:nqSny9Yy みんなはどんなPCでゲーム制作してるの? MacBookかWindowsPCかで悩むわ どっちにしてもデスクトップは置き場ないから ノートPCになる http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/279
280: 名前は開発中のものです。 [sage] 2023/11/26(日) 18:21:35.61 ID:sKe5WX7u >>276 シーンにあるobjectを一覧にしてそのトランスフォームが原点か否か見ればよくね? http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/280
281: 名前は開発中のものです。 [] 2023/11/26(日) 18:32:14.78 ID:J5rQpI/4 うおおおおおおおおおおおおお!!! すごいっす!!!! >>243さん、すごいっす!!! update()内にGetComponent無しで 完全に一緒の状況になりました!!! これで前より軽くなってるってことですよね! すごいっす!感動です! http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/281
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 721 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.019s