[過去ログ]
【ゲームエンジン】Unityなんでも質問スレpart12 (1002レス)
【ゲームエンジン】Unityなんでも質問スレpart12 http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
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
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
239: 名前は開発中のものです。 [] 2023/11/26(日) 10:32:30.63 ID:ap8K17/p 教えすぎないほうがいいのかなあ http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/239
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
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
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
258: 名前は開発中のものです。 [] 2023/11/26(日) 14:21:07.35 ID:ap8K17/p その当たり前の物差しが万人共通であればの話ね http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/258
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
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
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
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
289: 名前は開発中のものです。 [] 2023/11/26(日) 20:39:15.05 ID:ap8K17/p Physics.Raycastを嫌う理由がGC発生によるパフォーマンスの低下だとするなら、Physics.RaycastNonAllocを使えばいい 使ったことないけどOverlapSphereも同様らしい GC発生を嫌ってるわけではないとなると目的が不明瞭なので適切な提案ができない http://mevius.5ch.net/test/read.cgi/gamedev/1699257023/289
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.032s