フリー版で開発したゲームは個人・法人を問わず追加のロイヤリティーなしで販売できます。 プラットフォームサポートはiPhone/iPod Touch/iPad、Mac、PC、Web、Wii、Xbox360、Android、PlayStation 3、PlayStation 4、PS Vita他
■注意事項
質問と答え以外は禁止
■Unity 2ch Wiki(まとめ、過去ログ、リンク集)
・http://www24.atwiki.jp/unity2ch/
●リンク
・Unity(日本公式サイト)
http://unity3d.com/jp
・マニュアル
http://docs.unity3d.com/ja/current/Manual/index.html
・チュートリアル
http://unity3d.com/jp/learn/tutorials
・スクリプトリファレンス
http://docs.unity3d.com/ja/current/ScriptReference/index.html
・FAQ
http://unity3d.com/jp/unity/faq
・MSDN
http://msdn.microsoft.com/ja-jp/ms348103←スクリプトのエラー番号をこれで検索すると原因が日本語で出てきます。
■前スレ
【ゲームエンジン】Unityなんでも質問スレpart11
https://mevius.5ch.net/test/read.cgi/gamedev/1691129256/l50
探検
【ゲームエンジン】Unityなんでも質問スレpart12
■ このスレッドは過去ログ倉庫に格納されています
2023/11/06(月) 16:50:23.83ID:aWH6Xwln
157名前は開発中のものです。
2023/11/25(土) 01:04:07.62ID:G6Qarke7 Unity製はどうこうみたいな風潮はあるけど実際Unityで作ってるわけだからなオレも隠す必要がないと思ってるよむしろUnityでこれだけのものを作ったぞと見せつけていけ
158名前は開発中のものです。
2023/11/25(土) 01:56:22.73ID:VScWYipM Unity使うのやめようかなって思うレベルでダサいよ
Unity6でUnityの個人ユーザーは間違いなく増えると思うわ
Unity6でUnityの個人ユーザーは間違いなく増えると思うわ
159名前は開発中のものです。
2023/11/25(土) 02:24:39.79ID:6mVYgNka 本命は起動時間の短縮
スプラッシュスクリーンの裏でアセットバンドルのロードを走らせられるなら別にいいんだけど
そうもいかないだろうから
スプラッシュスクリーンの裏でアセットバンドルのロードを走らせられるなら別にいいんだけど
そうもいかないだろうから
160名前は開発中のものです。
2023/11/25(土) 02:39:21.12ID:CP8hzqFB 個人の開発者の人って有料Assetどれくらい買ってる?
初めての開発なんだけどAsset Storeがセールしてたから必要そうなAssetを見繕ってみたら円換算でかなりの額になってしまった
赤字の未来しか見えなくて買うのが怖い
初めての開発なんだけどAsset Storeがセールしてたから必要そうなAssetを見繕ってみたら円換算でかなりの額になってしまった
赤字の未来しか見えなくて買うのが怖い
161名前は開発中のものです。
2023/11/25(土) 03:54:56.12ID:9rpRVGI9 前々からゲーム制作に興味あってそろそろ動きたいけど
PCは持ってない
どんなの買えばいい?
MacBook Airかproかで悩んでる
その中でも何種類かあるし
Airの13インチM1でも大丈夫かな?
メモリやSSDの容量もどれくらい必要?
今のところゲームは2DのRPG作りたい
PCは持ってない
どんなの買えばいい?
MacBook Airかproかで悩んでる
その中でも何種類かあるし
Airの13インチM1でも大丈夫かな?
メモリやSSDの容量もどれくらい必要?
今のところゲームは2DのRPG作りたい
162名前は開発中のものです。
2023/11/25(土) 04:28:44.23ID:mCFIcOWr パブリックでゲームオブジェクト変数を用意して、プレハブをドラッグ&ドロップしたんだけどなんか挙動がおかしい
同じゲームオブジェクト変数の用意のしかたで同じようにプレハブを入れても 最初に記述した4行のゲームオブジェクトは問題はないのに、それ以後に増やしたゲームオブジェクト変数は、プレハブのドラッグ&ドロップは問題ないのに、変数の中身を調べるとnullになっている(先に記述した4行の変数はプレハブが入っていると表示される)
現状自分では何も解らない状況です。
同じゲームオブジェクト変数の用意のしかたで同じようにプレハブを入れても 最初に記述した4行のゲームオブジェクトは問題はないのに、それ以後に増やしたゲームオブジェクト変数は、プレハブのドラッグ&ドロップは問題ないのに、変数の中身を調べるとnullになっている(先に記述した4行の変数はプレハブが入っていると表示される)
現状自分では何も解らない状況です。
163名前は開発中のものです。
2023/11/25(土) 08:14:12.34ID:DxkplgpG164名前は開発中のものです。
2023/11/25(土) 08:23:41.08ID:75MeFtBw165名前は開発中のものです。
2023/11/25(土) 09:33:18.15ID:tUq1KY+K >>161
どちらにせよ、16G以上にしないと辛いよ。
どちらにせよ、16G以上にしないと辛いよ。
166163
2023/11/25(土) 09:52:57.90ID:DxkplgpG RAM言い忘れてた
上に同じく16GBあった方がいいな
Proならもっと上もあるが自分はM1&16GBで軽いゲームなら開発できてるので参考までに
上に同じく16GBあった方がいいな
Proならもっと上もあるが自分はM1&16GBで軽いゲームなら開発できてるので参考までに
167名前は開発中のものです。
2023/11/25(土) 11:21:33.25ID:FGDWLLI7 すみません、2つ質問させてください。
1
乱数を返すRandom.Range();がありますよね?
これはこちらが最小値と最大値を決めて、返すわけですが
「0」が要らない場合、Random.Range(1,4);にすると
1,2,3のどれかを返す、という認識で間違い無いですか?
2
あと、最小値最大値の範囲ではなくて、
例えばこちらが数値をいくつか決めて
それのどれかを返す、みたいな関数ないですか?
例えば、「1か4を返す」とか「23か34か40を返す」とか
そんな感じです。
Random.Range(23,34,40);とかそんな感じの。
1
乱数を返すRandom.Range();がありますよね?
これはこちらが最小値と最大値を決めて、返すわけですが
「0」が要らない場合、Random.Range(1,4);にすると
1,2,3のどれかを返す、という認識で間違い無いですか?
2
あと、最小値最大値の範囲ではなくて、
例えばこちらが数値をいくつか決めて
それのどれかを返す、みたいな関数ないですか?
例えば、「1か4を返す」とか「23か34か40を返す」とか
そんな感じです。
Random.Range(23,34,40);とかそんな感じの。
168名前は開発中のものです。
2023/11/25(土) 11:28:32.02ID:6mVYgNka 1
public static int Range(int minInclusive, int maxExclusive);
なのでint型はmin以上max以下だから1〜3が欲しいならRandom.Range(1, 4)
ただしfloat型の場合
public static float Range(float minInclusive, float maxInclusive);
なのでmin以上max未満だから1.0f〜3.0fが欲しいならRandom.Range(1.0f, 3.0f)
2
特定の数値をList<int>にぶち込んでこれ呼び出せばランダムな値取ってきてくれる↓
public static T RandomPick<T>(IReadOnlyList<T> collection)
{
return collection[UnityEngine.Random.Range(0, collection.Count)];
}
public static int Range(int minInclusive, int maxExclusive);
なのでint型はmin以上max以下だから1〜3が欲しいならRandom.Range(1, 4)
ただしfloat型の場合
public static float Range(float minInclusive, float maxInclusive);
なのでmin以上max未満だから1.0f〜3.0fが欲しいならRandom.Range(1.0f, 3.0f)
2
特定の数値をList<int>にぶち込んでこれ呼び出せばランダムな値取ってきてくれる↓
public static T RandomPick<T>(IReadOnlyList<T> collection)
{
return collection[UnityEngine.Random.Range(0, collection.Count)];
}
169名前は開発中のものです。
2023/11/25(土) 11:29:41.02ID:6mVYgNka 誤)int型はmin以上max以下
正)int型はmin以上max未満
誤)float型はmin以上max未満
正)float型はmin以上max以下
正)int型はmin以上max未満
誤)float型はmin以上max未満
正)float型はmin以上max以下
170名前は開発中のものです。
2023/11/25(土) 12:21:04.16ID:FGDWLLI7 >>168
>特定の数値をList<int>にぶち込んでこれ呼び出せばランダムな値取ってきてくれる
おお、そのやり方があった、、、ありがとうございます。
あとひとつだけ質問させてください。
配列に入ってる各オブジェクトの中で、
自分の手前(自分より添え字が若い方)の情報を取りたいんですが
何かいい関数、または方法ってありますか?
オブジェクトの中で 配列[自分より一つ若い添字].ゲッター で変数の情報を見たいんです。
自分の現在の添え字を出す関数があれば、-1でひとつ若い添字が出せるかなと思ってるんですが
そんなのありますか?
>特定の数値をList<int>にぶち込んでこれ呼び出せばランダムな値取ってきてくれる
おお、そのやり方があった、、、ありがとうございます。
あとひとつだけ質問させてください。
配列に入ってる各オブジェクトの中で、
自分の手前(自分より添え字が若い方)の情報を取りたいんですが
何かいい関数、または方法ってありますか?
オブジェクトの中で 配列[自分より一つ若い添字].ゲッター で変数の情報を見たいんです。
自分の現在の添え字を出す関数があれば、-1でひとつ若い添字が出せるかなと思ってるんですが
そんなのありますか?
171名前は開発中のものです。
2023/11/25(土) 12:29:11.75ID:6mVYgNka for (int i = 0; i < 5; i++)
ならi-1で取れるとして、foreachなら1つ前の値を持つローカル変数を用意する
string prevValue = null;
foreach (string value in strList)
{
// 何か処理(ここでprevValueを参照すると1つ前の値が取れる)
prevValue = value;
}
あるいはIndexOfで自分の位置を特定してから-1する
List<string> strList = new List<string>() { "あ", "い", "う" };
int index = strList.IndexOf("う");
string prevValue = index != -1 && index >= 1 ? strList[index - 1] : null;
スマートにしたいならこれ↑をやってくれる関数を自作するとか
ならi-1で取れるとして、foreachなら1つ前の値を持つローカル変数を用意する
string prevValue = null;
foreach (string value in strList)
{
// 何か処理(ここでprevValueを参照すると1つ前の値が取れる)
prevValue = value;
}
あるいはIndexOfで自分の位置を特定してから-1する
List<string> strList = new List<string>() { "あ", "い", "う" };
int index = strList.IndexOf("う");
string prevValue = index != -1 && index >= 1 ? strList[index - 1] : null;
スマートにしたいならこれ↑をやってくれる関数を自作するとか
172名前は開発中のものです。
2023/11/25(土) 15:29:37.69ID:CP8hzqFB >>163,164
ありがとう やっぱり必要なものは必要だから仕方がないってことですかね
めちゃめちゃ苦労して大赤字で終了って辛い現実すぎる
ちなみに今すぐ買っておけっていうおすすめのAssetがあれば教えてください
ありがとう やっぱり必要なものは必要だから仕方がないってことですかね
めちゃめちゃ苦労して大赤字で終了って辛い現実すぎる
ちなみに今すぐ買っておけっていうおすすめのAssetがあれば教えてください
173名前は開発中のものです。
2023/11/25(土) 16:17:25.50ID:PO4/Hp6H おすすめなんかどんなの作りたいのか知らんのに無責任に勧められんやろ
174名前は開発中のものです。
2023/11/25(土) 16:31:59.02ID:75MeFtBw >>172
まず何はなくともdotween。これは無料
個人的に欠かせないのはAnimancer
アニメーションイベントの使い勝手がデフォルトのものよりいい
VeryAnimation
アニメは価格が高いので簡単なものは自分で作ったほうが早い
Arbor3
ゲームの仕様によってはどうしてもビジュアルプログラミングの
ほうが都合がいいケースがある
そのときに俺の見立てで一番いいビジュアルプログラミングシステムがこれ
自作スクリプトとの連携が圧倒的にいい
あと
https://assetstore.unity.com/publishers/8569
このデベロッパーのアーセナルシリーズ
とにかくエフェクトの質が高い
まず何はなくともdotween。これは無料
個人的に欠かせないのはAnimancer
アニメーションイベントの使い勝手がデフォルトのものよりいい
VeryAnimation
アニメは価格が高いので簡単なものは自分で作ったほうが早い
Arbor3
ゲームの仕様によってはどうしてもビジュアルプログラミングの
ほうが都合がいいケースがある
そのときに俺の見立てで一番いいビジュアルプログラミングシステムがこれ
自作スクリプトとの連携が圧倒的にいい
あと
https://assetstore.unity.com/publishers/8569
このデベロッパーのアーセナルシリーズ
とにかくエフェクトの質が高い
175名前は開発中のものです。
2023/11/25(土) 17:04:09.42ID:FGDWLLI7 >>171
すみません、
string prevValue = null;
foreach (string value in strList)
{
// 何か処理(ここでprevValueを参照すると1つ前の値が取れる)
prevValue = value;
}
このコードって相手がlistじゃ無くて配列でも使えますか?
あと目的の変数はintで、それぞれの変数の値がかぶっていないわけではないので
IndexOfで自分の位置を割り出すのは無理かと思います。
すみません、
string prevValue = null;
foreach (string value in strList)
{
// 何か処理(ここでprevValueを参照すると1つ前の値が取れる)
prevValue = value;
}
このコードって相手がlistじゃ無くて配列でも使えますか?
あと目的の変数はintで、それぞれの変数の値がかぶっていないわけではないので
IndexOfで自分の位置を割り出すのは無理かと思います。
176名前は開発中のものです。
2023/11/25(土) 17:11:03.39ID:FGDWLLI7 あと今配列を勉強してて新たに疑問に思うことがあるんですが
Array01 = new GameObject[10];
Array02 = new GameObject[10];
GameObject obj = (GameObject)Resources.Load("prefab_obj");
for (int i = 0; i < Array01.Length; i++)
{
Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity);
}
for (int i = 0; i < Array02.Length; i++)
{
Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity);
}
これで、prefab_objが詰まった配列のArray01とArray02が出来上がるんですが
それぞれのfor文の処理に配列のArray01とArray02を指定するコードがありませんよね?
なのになぜArray01とArray02にちゃんと入ったのか、不思議なんです。
というのも「Array01」「Array02」という記載は長さを返す「.Length」にしか使っていません。
それで配列まで指定したfor文になっているということでしょうか?
Array01 = new GameObject[10];
Array02 = new GameObject[10];
GameObject obj = (GameObject)Resources.Load("prefab_obj");
for (int i = 0; i < Array01.Length; i++)
{
Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity);
}
for (int i = 0; i < Array02.Length; i++)
{
Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity);
}
これで、prefab_objが詰まった配列のArray01とArray02が出来上がるんですが
それぞれのfor文の処理に配列のArray01とArray02を指定するコードがありませんよね?
なのになぜArray01とArray02にちゃんと入ったのか、不思議なんです。
というのも「Array01」「Array02」という記載は長さを返す「.Length」にしか使っていません。
それで配列まで指定したfor文になっているということでしょうか?
177名前は開発中のものです。
2023/11/25(土) 17:11:15.12ID:PO4/Hp6H 配列にしてダメだった時のエラー書きなよ
178名前は開発中のものです。
2023/11/25(土) 17:14:02.70ID:6mVYgNka179名前は開発中のものです。
2023/11/25(土) 17:25:23.98ID:FGDWLLI7 >>178
ですよね???
でも入ってるんです、ほんとに。
実行して、ちゃんと理想通りになってるんで
「なんで?」って思って質問させてもらいました。
厳密に記載すると
最初に定義もしてます。
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++)
{
Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity);
}
for (int i = 0; i < Array02.Length; i++)
{
Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity);
}
}
これです。
これでちゃんと入ってるんですよ。
なぜです????
ですよね???
でも入ってるんです、ほんとに。
実行して、ちゃんと理想通りになってるんで
「なんで?」って思って質問させてもらいました。
厳密に記載すると
最初に定義もしてます。
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++)
{
Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity);
}
for (int i = 0; i < Array02.Length; i++)
{
Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity);
}
}
これです。
これでちゃんと入ってるんですよ。
なぜです????
180名前は開発中のものです。
2023/11/25(土) 17:28:56.76ID:75MeFtBw >>179
おかしい
おかしい
181名前は開発中のものです。
2023/11/25(土) 17:30:05.57ID:6mVYgNka >>179
えぇ・・・
そのArray01とArray02に外部からアクセスしててそっちでオブジェクトを代入する処理をしてるとかかなあ
public GameObject[] Array01;
↓
[SerializeField]
private GameObject[] Array01;
でも同じ結果になったらお手上げ
えぇ・・・
そのArray01とArray02に外部からアクセスしててそっちでオブジェクトを代入する処理をしてるとかかなあ
public GameObject[] Array01;
↓
[SerializeField]
private GameObject[] Array01;
でも同じ結果になったらお手上げ
182名前は開発中のものです。
2023/11/25(土) 17:31:02.65ID:6mVYgNka あ、この場合[SerializeField]はなくてもOK
InspectorタブをDebugに切り替えればprivate変数の中身も見れる
InspectorタブをDebugに切り替えればprivate変数の中身も見れる
183名前は開発中のものです。
2023/11/25(土) 17:34:09.68ID:PO4/Hp6H そもそも入ってるかどうか何処でチェックしてる?
START関数の最後に確認したら?
START関数の最後に確認したら?
184名前は開発中のものです。
2023/11/25(土) 17:37:24.49ID:FGDWLLI7185名前は開発中のものです。
2023/11/25(土) 17:39:31.35ID:PO4/Hp6H それプレハブだけ見てて、配列見てないやろ
配列にあるか無いかのチェック入れてみろっての
for文終わったとこに
配列にあるか無いかのチェック入れてみろっての
for文終わったとこに
186名前は開発中のものです。
2023/11/25(土) 17:40:43.49ID:FGDWLLI7 >>183
再生したら、配列に突っ込んだオブジェクトが
10個ずつ描画(実際はfor文内でVector2の座標を増加させながら入れるんで)されてるんで、
これは全部ちゃんと入ってるってことじゃないですか?
そんなにおかしい状態ですか。。どういうことですか?
再生したら、配列に突っ込んだオブジェクトが
10個ずつ描画(実際はfor文内でVector2の座標を増加させながら入れるんで)されてるんで、
これは全部ちゃんと入ってるってことじゃないですか?
そんなにおかしい状態ですか。。どういうことですか?
187名前は開発中のものです。
2023/11/25(土) 17:43:34.87ID:CP8hzqFB188名前は開発中のものです。
2023/11/25(土) 17:44:12.12ID:PO4/Hp6H だから
for文の後にチェックコード書きなさい
それで分かるから
for文の後にチェックコード書きなさい
それで分かるから
189名前は開発中のものです。
2023/11/25(土) 17:44:46.17ID:FGDWLLI7190名前は開発中のものです。
2023/11/25(土) 17:45:32.79ID:PO4/Hp6H >>186
描画してんのはただ単にインスタントエイトしてるからやろ
描画してんのはただ単にインスタントエイトしてるからやろ
191名前は開発中のものです。
2023/11/25(土) 17:47:15.11ID:PO4/Hp6H array01の最初はプレハブですか?ヌルですか
あとはChatGPTに聴け
あとはChatGPTに聴け
192名前は開発中のものです。
2023/11/25(土) 17:53:33.30ID:PO4/Hp6H193名前は開発中のものです。
2023/11/25(土) 17:53:48.93ID:FGDWLLI7 >>191
あああああああああああああああああ
None、すなわちnullでした。。。
でもどういうことですか、、、
入ってないなら入ってないで、
なぜ座標がちゃんと入った
プレハブオブジェクトが配列の添字の数だけ並ぶんです?
あああああああああああああああああ
None、すなわちnullでした。。。
でもどういうことですか、、、
入ってないなら入ってないで、
なぜ座標がちゃんと入った
プレハブオブジェクトが配列の添字の数だけ並ぶんです?
194名前は開発中のものです。
2023/11/25(土) 18:00:39.82ID:6mVYgNka ちょっと待ってDebug.Log(array01[0].name);でヌルポじゃなくてNullなの・・・?
まぁ見なかったことにしよう
Instantiate(obj);はobjを複製してシーンに配置する関数
つまり、複製されたやつが画面上に配置されてたのを見ただけ
Array01にぶち込んだところまでは確認できていなかったということ
まぁ見なかったことにしよう
Instantiate(obj);はobjを複製してシーンに配置する関数
つまり、複製されたやつが画面上に配置されてたのを見ただけ
Array01にぶち込んだところまでは確認できていなかったということ
195名前は開発中のものです。
2023/11/25(土) 18:02:22.81ID:FGDWLLI7 でも、なんか納得できません。
for文の両方をコメントアウトして再生押すと
プレハブのオブジェクト自体の存在も無くなります。
for文の処理はプレハブを配列数分作るカギになってると思います。
どういうことでしょうか。。。。。。。
for文の両方をコメントアウトして再生押すと
プレハブのオブジェクト自体の存在も無くなります。
for文の処理はプレハブを配列数分作るカギになってると思います。
どういうことでしょうか。。。。。。。
196名前は開発中のものです。
2023/11/25(土) 18:06:36.44ID:FGDWLLI7197名前は開発中のものです。
2023/11/25(土) 18:08:56.88ID:6mVYgNka // ログに10回「うんち」と表示する
for (int i = 0; i < Array01.Length; i++)
{
Debug.Log("うんち");
}
// ログに10回「うんち」と表示して、うんちの末尾に0〜9を割り振る
for (int i = 0; i < Array01.Length; i++)
{
Debug.Log("うんち" + i);
}
// ログ「うんち0」
// ログ「うんち1」
// ログ「うんち2」
// 以下略
for (int i = 0; i < Array01.Length; i++)
{
Debug.Log("うんち");
}
// ログに10回「うんち」と表示して、うんちの末尾に0〜9を割り振る
for (int i = 0; i < Array01.Length; i++)
{
Debug.Log("うんち" + i);
}
// ログ「うんち0」
// ログ「うんち1」
// ログ「うんち2」
// 以下略
198名前は開発中のものです。
2023/11/25(土) 18:09:09.19ID:FGDWLLI7 Debug.Log(array01[0]);だと
Nullでした。
Nullでした。
199名前は開発中のものです。
2023/11/25(土) 18:09:10.13ID:6mVYgNka // 画面にobjの複製オブジェクトを10個作る(全部同じ座標)
for (int i = 0; i < Array01.Length; i++)
{
Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity);
}
// 画面にobjの複製オブジェクトを10個作る(少しずつ座標を変える)
for (int i = 0; i < Array01.Length; i++)
{
Instantiate(obj, new Vector2(i, 0.0f), Quaternion.identity);
}
// 画面にobjの複製オブジェクトを10個作って配列にぶち込み、複製オブジェクトの名前を「うんち&添え字」に変えて結果を確認する
for (int i = 0; i < Array01.Length; i++)
{
Array01[i] = Instantiate(obj, new Vector2(i, 0.0f), Quaternion.identity);
Array01[i].name = "うんち" + i;
}
Debug.Log(Array01[4].name); // ログ「うんち4」
for (int i = 0; i < Array01.Length; i++)
{
Instantiate(obj, new Vector2(0.0f, 0.0f), Quaternion.identity);
}
// 画面にobjの複製オブジェクトを10個作る(少しずつ座標を変える)
for (int i = 0; i < Array01.Length; i++)
{
Instantiate(obj, new Vector2(i, 0.0f), Quaternion.identity);
}
// 画面にobjの複製オブジェクトを10個作って配列にぶち込み、複製オブジェクトの名前を「うんち&添え字」に変えて結果を確認する
for (int i = 0; i < Array01.Length; i++)
{
Array01[i] = Instantiate(obj, new Vector2(i, 0.0f), Quaternion.identity);
Array01[i].name = "うんち" + i;
}
Debug.Log(Array01[4].name); // ログ「うんち4」
200名前は開発中のものです。
2023/11/25(土) 18:11:54.26ID:PO4/Hp6H ID:6mVYgNkaさん優しい
惚れそう
ドーンおじもこれくらいやれたらなぁ
惚れそう
ドーンおじもこれくらいやれたらなぁ
201名前は開発中のものです。
2023/11/25(土) 18:13:23.28ID:PO4/Hp6H まぁそもそも配列にぶち込むのと
生成処理を一緒にやろーなど
初心者にはラベルが高かったんや
生成処理を一緒にやろーなど
初心者にはラベルが高かったんや
202名前は開発中のものです。
2023/11/25(土) 18:15:56.11ID:3GSRLZ8G 言語自体をもう少し勉強したほうがいいレベルだな
203名前は開発中のものです。
2023/11/25(土) 18:19:16.69ID: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文を消せば、それぞれのプレハブも存在しないんです。
記述からして当然なんですけど。。。
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文を消せば、それぞれのプレハブも存在しないんです。
204名前は開発中のものです。
2023/11/25(土) 18:20:31.48ID:FGDWLLI7 あ、それぞれVector2(i, 0.0f)です。座標変えながらです。
205名前は開発中のものです。
2023/11/25(土) 18:21:55.95ID:Og5vMXyN unityでファミコンのスプライトオーバーの再現やった人いますか
206名前は開発中のものです。
2023/11/25(土) 18:22:49.76ID:6mVYgNka >>203
Instantiate(obj, new Vector2(i, 0.0f), Quaternion.identity);
↑これだけ
これだけで、「座標(0, 0)にobjを複製してシーンに配置する」までやってくれる
for文を消すというか、Instantiateしなければプレハブオブジェクトはシーンに生成・配置されないから並ばんよ
Instantiate(obj, new Vector2(i, 0.0f), Quaternion.identity);
↑これだけ
これだけで、「座標(0, 0)にobjを複製してシーンに配置する」までやってくれる
for文を消すというか、Instantiateしなければプレハブオブジェクトはシーンに生成・配置されないから並ばんよ
207名前は開発中のものです。
2023/11/25(土) 18:27:17.96ID:FGDWLLI7208名前は開発中のものです。
2023/11/25(土) 18:31:44.66ID: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にしたりして再生すりゃいい
それぞれ何処までも配列入るかみりゃわかるよ
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にしたりして再生すりゃいい
それぞれ何処までも配列入るかみりゃわかるよ
209名前は開発中のものです。
2023/11/25(土) 18:33:31.35ID:PO4/Hp6H ま配列やる場合、テスト的には少ないのでやるのが最初はオススメやね最低の数で
210名前は開発中のものです。
2023/11/25(土) 19:28:39.77ID:dzXcaoGO PS1のテクスチャとかSFCのドット絵くらいの解像度の画像をローポリ3Dモデルにタイリングで貼りたいんだけど、
タイルを一枚一枚を別の画像として取り込むのと、一枚の画像に詰め込んでシェーダー側で座標を指定して表示するのとでは、どっちのほうが動作時のパフォーマン良いですか?
staticを適用するモデルが99%になる予定で、タイリングはモデル側のUV展開で実装します
タイルを一枚一枚を別の画像として取り込むのと、一枚の画像に詰め込んでシェーダー側で座標を指定して表示するのとでは、どっちのほうが動作時のパフォーマン良いですか?
staticを適用するモデルが99%になる予定で、タイリングはモデル側のUV展開で実装します
211名前は開発中のものです。
2023/11/25(土) 19:30:09.75ID:dzXcaoGO212名前は開発中のものです。
2023/11/25(土) 19:31:29.25ID:tUq1KY+K 作られたオブジェクトのスクショが有ればすぐ判明したことでは?
213名前は開発中のものです。
2023/11/25(土) 20:16:45.79ID:c7/JKC6p こんにちは。
今まで一つのプロジェクトにマテリアルやらスクリプトを詰め込んで、複数のゲーム素材を一緒にしてたんですが
プロジェクトを分けようと思って、新規プロジェクトを開いてそこにスクリプトを移したらスクリプトクラスが見つからなくなってしまいました
原因は恐らくどこかでスクリプトクラス名が被っているファイルが点在しているからだと思うんですけど
別プロジェクトでも同じ名前のスクリプトは使えないのでしょうか?
unity側で被っているのか、VisualStudio側で被っているのかも検討つきません
今からまた調べますが何か対処法ありませんでしょうか
今まで一つのプロジェクトにマテリアルやらスクリプトを詰め込んで、複数のゲーム素材を一緒にしてたんですが
プロジェクトを分けようと思って、新規プロジェクトを開いてそこにスクリプトを移したらスクリプトクラスが見つからなくなってしまいました
原因は恐らくどこかでスクリプトクラス名が被っているファイルが点在しているからだと思うんですけど
別プロジェクトでも同じ名前のスクリプトは使えないのでしょうか?
unity側で被っているのか、VisualStudio側で被っているのかも検討つきません
今からまた調べますが何か対処法ありませんでしょうか
214名前は開発中のものです。
2023/11/25(土) 20:30:31.32ID:c7/JKC6p >>213
スクリプトクラスが見つかってないのは新規プロジェクト側でして
スクリプトの名前を変えるのは根本的な解決というか理解に至らないので出来ればやめようと思ってるんですけど。
ファイルがある場所をunityハブのプロジェクト名の横の3点リーダー…からファイルを開いて、新規プロジェクトのアセットのとこに直接ぶち込んだんですよね。
スクリプトクラスが見つかってないのは新規プロジェクト側でして
スクリプトの名前を変えるのは根本的な解決というか理解に至らないので出来ればやめようと思ってるんですけど。
ファイルがある場所をunityハブのプロジェクト名の横の3点リーダー…からファイルを開いて、新規プロジェクトのアセットのとこに直接ぶち込んだんですよね。
215名前は開発中のものです。
2023/11/25(土) 20:38:13.49ID:6mVYgNka >>213
(なんかわいのぶち込むって言い回しがこのスレ内で伝染してるな・・・)
UnityプロジェクトのAssetsフォルダ内に資産一式を配置することになると思うけど、この中でクラス名の重複は認められない
実質的にスクリプトファイル名の重複も認められてない
一応C#のnamespaceっていう仕組みを利用すれば重複可能になるけど、C#の理解が浅いうちは無暗に首ツッコまないほうがいいかも
ということでAssetsフォルダ内の全csファイルのクラス重複確認をすれば解決する・・・はず
(なんかわいのぶち込むって言い回しがこのスレ内で伝染してるな・・・)
UnityプロジェクトのAssetsフォルダ内に資産一式を配置することになると思うけど、この中でクラス名の重複は認められない
実質的にスクリプトファイル名の重複も認められてない
一応C#のnamespaceっていう仕組みを利用すれば重複可能になるけど、C#の理解が浅いうちは無暗に首ツッコまないほうがいいかも
ということでAssetsフォルダ内の全csファイルのクラス重複確認をすれば解決する・・・はず
216名前は開発中のものです。
2023/11/25(土) 20:48:46.18ID:c7/JKC6p >>215
返信ありがとうございます!
一応アセット内での被りは無さそうなんですよね。unityのウィンドウ内で出来る範囲とは別に、PC側のファイルの保存フォルダ側に問題あるのかなって気もしてます
ちなみにこのスレを開くのは初めてなので言い回しは残念ながら偶々です。
返信ありがとうございます!
一応アセット内での被りは無さそうなんですよね。unityのウィンドウ内で出来る範囲とは別に、PC側のファイルの保存フォルダ側に問題あるのかなって気もしてます
ちなみにこのスレを開くのは初めてなので言い回しは残念ながら偶々です。
217名前は開発中のものです。
2023/11/25(土) 21:04:25.66ID:9rpRVGI9218名前は開発中のものです。
2023/11/25(土) 21:22:04.21ID:tUq1KY+K >>217
SSDは持ち運びする&iPhoneなどのバックアップ入れるなら大目に。そうでなけりゃできれば512もあればよろし。
256にするとどうなるかはわかんないけど、最近のアプリを見るとちょっと心許なく。
SSDは持ち運びする&iPhoneなどのバックアップ入れるなら大目に。そうでなけりゃできれば512もあればよろし。
256にするとどうなるかはわかんないけど、最近のアプリを見るとちょっと心許なく。
219名前は開発中のものです。
2023/11/25(土) 21:24:36.25ID:tUq1KY+K プロとしてやっていくなら、もりもりでw
最初ちょろちょろ、あとモリモリでもいいけどそれが良いかは結果の後にわかる事なので、最初からモリモリなら本気度マックス、とか形からでw
最初ちょろちょろ、あとモリモリでもいいけどそれが良いかは結果の後にわかる事なので、最初からモリモリなら本気度マックス、とか形からでw
220名前は開発中のものです。
2023/11/25(土) 21:28:38.36ID:c7/JKC6p >>216
PC側のファイルフォルダを見てみたら2つのプロジェクトファイルが作成されてて同じスクリプトファイルが生成されてます
でもそれ以外に不審な点は見つからないですね。これがダメならプロジェクト別でもスクリプトクラスが被ったらダメってことなんですかね…?
VisualStudio側でプロジェクトが分けられていない?とかネットに書いてあったのでVisualStudioも見てみようかな…初心者だし手探りで頭が痛いよ…
PC側のファイルフォルダを見てみたら2つのプロジェクトファイルが作成されてて同じスクリプトファイルが生成されてます
でもそれ以外に不審な点は見つからないですね。これがダメならプロジェクト別でもスクリプトクラスが被ったらダメってことなんですかね…?
VisualStudio側でプロジェクトが分けられていない?とかネットに書いてあったのでVisualStudioも見てみようかな…初心者だし手探りで頭が痛いよ…
221名前は開発中のものです。
2023/11/25(土) 21:33:14.98ID:6mVYgNka >>220
Everythingっていうソフトおすすめ
「"C:\aaa" .cs」って検索するとC:\aaaフォルダの下にいる拡張子が.csのファイルを全部一覧表示してくれる
それで特定のプロジェクトフォルダ配下に名前ソートかけて同名のcsファイルが2ついないか見るとか
Everythingっていうソフトおすすめ
「"C:\aaa" .cs」って検索するとC:\aaaフォルダの下にいる拡張子が.csのファイルを全部一覧表示してくれる
それで特定のプロジェクトフォルダ配下に名前ソートかけて同名のcsファイルが2ついないか見るとか
222名前は開発中のものです。
2023/11/25(土) 21:53:05.91ID:c7/JKC6p223名前は開発中のものです。
2023/11/25(土) 22:15:04.00ID:c7/JKC6p224名前は開発中のものです。
2023/11/25(土) 22:19:21.88ID:9rpRVGI9 >>218
色々調べてるけど
新型の情報はないのかな?
まあ新型出ても初めは高いだろうし
MacBook AirM2かMacBook ProM3かで悩む
14インチと15インチ、16インチの違いはどう?
色々調べてるけど
新型の情報はないのかな?
まあ新型出ても初めは高いだろうし
MacBook AirM2かMacBook ProM3かで悩む
14インチと15インチ、16インチの違いはどう?
225名前は開発中のものです。
2023/11/25(土) 23:40:04.33ID:PO4/Hp6H SSD?
君たちまだストレージ保管してんの?
そんなンクラウドでええやん
君たちまだストレージ保管してんの?
そんなンクラウドでええやん
226名前は開発中のものです。
2023/11/26(日) 00:32:27.32ID:m41MARBn どこのクラウドがいいの?
227名前は開発中のものです。
2023/11/26(日) 05:23:57.71ID:ZwpA0qEM やめなよ
228名前は開発中のものです。
2023/11/26(日) 06:44:39.83ID:m41MARBn >>227
このハゲ!
このハゲ!
229名前は開発中のものです。
2023/11/26(日) 07:27:15.33ID: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;
}
}
これが機能するようにするために、何が足りないのか、教えてください。
配列[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;
}
}
これが機能するようにするために、何が足りないのか、教えてください。
230名前は開発中のものです。
2023/11/26(日) 07:46:45.71ID:ap8K17/p 文面から配列にはGameObjectが入っているものと推測する
それで変数Aや変数Bを定義してるコンポーネントはHogehogeクラスとする
この場合、配列はGameObject[]ではなくHogehoge[]でないといけない
あるいはGameObjectの配列の要素に対してGetComponentしてHogehogeを取得する
Hogehoge hooo = 配列[i].GetComponent<Hogehoge>();
GameObjectはGameObjectの情報しか持ってないので、Hogehogeの変数を参照しないとHogehogeの情報にはアクセスできない
それで変数Aや変数Bを定義してるコンポーネントはHogehogeクラスとする
この場合、配列はGameObject[]ではなくHogehoge[]でないといけない
あるいはGameObjectの配列の要素に対してGetComponentしてHogehogeを取得する
Hogehoge hooo = 配列[i].GetComponent<Hogehoge>();
GameObjectはGameObjectの情報しか持ってないので、Hogehogeの変数を参照しないとHogehogeの情報にはアクセスできない
231名前は開発中のものです。
2023/11/26(日) 08:27:07.96ID:m7xu9wcS エラー本文とコード見てないからわからんけど、書き方的にGameObjectからそのまま参照しようとしてそうだね
232名前は開発中のものです。
2023/11/26(日) 09:05:47.93ID: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」見たくなる感じですか?
>文面から配列には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」見たくなる感じですか?
233名前は開発中のものです。
2023/11/26(日) 09:27:49.83ID:qtPMCWA8 独自クラスをchatGPTで、聞いてね
234名前は開発中のものです。
2023/11/26(日) 09:29:50.22ID:qtPMCWA8 変数Aを定義したC#よファイルに名前付けたでしょ?
それな、クラス名やぞ
それな、クラス名やぞ
235名前は開発中のものです。
2023/11/26(日) 09:47:00.82ID:J5rQpI/4236名前は開発中のものです。
2023/11/26(日) 10:01:19.86ID: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]);」と記載してもエラーが出ます。
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]);」と記載してもエラーが出ます。
237名前は開発中のものです。
2023/11/26(日) 10:02:55.92ID: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;
// B
private void Start()
{
int aaa = this.objects[0].変数A; // @
int bbb = this.objects[0].GetComponent<Hogehoge>().変数A; // A
}
}
GameManagerの@はthis.objects[0]を見ている=GameObjectクラスを見ているので、GameObjectに変数Aがなくてエラーになる
Aはthis.objects[0](GameObject)からHogehogeクラスを取得してHogehogeクラスを見ているので、Hogehogeの変数Aを見てエラーにならない
ただしGetComponentはコストが高い処理なので、毎フレーム実行する必要がある場合などはクラス変数(B)にHogehogeの変数を定義しておきそれにアクセスするほうが低コスト
public Hogehoge[] hogehoges;
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;
// B
private void Start()
{
int aaa = this.objects[0].変数A; // @
int bbb = this.objects[0].GetComponent<Hogehoge>().変数A; // A
}
}
GameManagerの@はthis.objects[0]を見ている=GameObjectクラスを見ているので、GameObjectに変数Aがなくてエラーになる
Aはthis.objects[0](GameObject)からHogehogeクラスを取得してHogehogeクラスを見ているので、Hogehogeの変数Aを見てエラーにならない
ただしGetComponentはコストが高い処理なので、毎フレーム実行する必要がある場合などはクラス変数(B)にHogehogeの変数を定義しておきそれにアクセスするほうが低コスト
public Hogehoge[] hogehoges;
238名前は開発中のものです。
2023/11/26(日) 10:30:50.60ID:sKe5WX7u239名前は開発中のものです。
2023/11/26(日) 10:32:30.63ID:ap8K17/p 教えすぎないほうがいいのかなあ
240名前は開発中のものです。
2023/11/26(日) 10:39:04.38ID:J5rQpI/4 >>239
>教えすぎないほうがいいのかなあ
そんなことありません。
正解を教えて頂いたあと理解するため自分で何度も理解する様努めますし。
もちろん、理解しないままでいいやって人もいるでしょうけど
自分は次から自分のものにしないと意味がないとわかっているので
答えを知ったら終わりのつもりありません。
ただ、自力で答えにたどり着くには独学や人の限られたブログなどでは
行き着けない場合もあるんです。
そんな時、あなたの様にスパッと答えを教えて頂けるのは非常にありがたいと思っています。
ありがとうございます。
すみません、
>Hogehogeの変数を定義しておきそれにアクセスするほうが低コスト
>public Hogehoge[] hogehoges;
について、もう少し具体的に解説お願いできないでしょうか。
>教えすぎないほうがいいのかなあ
そんなことありません。
正解を教えて頂いたあと理解するため自分で何度も理解する様努めますし。
もちろん、理解しないままでいいやって人もいるでしょうけど
自分は次から自分のものにしないと意味がないとわかっているので
答えを知ったら終わりのつもりありません。
ただ、自力で答えにたどり着くには独学や人の限られたブログなどでは
行き着けない場合もあるんです。
そんな時、あなたの様にスパッと答えを教えて頂けるのは非常にありがたいと思っています。
ありがとうございます。
すみません、
>Hogehogeの変数を定義しておきそれにアクセスするほうが低コスト
>public Hogehoge[] hogehoges;
について、もう少し具体的に解説お願いできないでしょうか。
241名前は開発中のものです。
2023/11/26(日) 10:48:37.62ID:J5rQpI/4 >毎フレーム実行する必要がある場合などは
>GameManager.csのクラス変数に
>Hogehogeの変数を定義
public Hogehoge[] hogehoges;
これでHogehoge型の配列を作っても
hogehogesはまだ空の状態ですよね?
hogehoges = new Hogehoge[10];みたいなのやんないと
アクセスできませんか?
>GameManager.csのクラス変数に
>Hogehogeの変数を定義
public Hogehoge[] hogehoges;
これでHogehoge型の配列を作っても
hogehogesはまだ空の状態ですよね?
hogehoges = new Hogehoge[10];みたいなのやんないと
アクセスできませんか?
242名前は開発中のものです。
2023/11/26(日) 10:59:45.33ID: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の使用回数を最小限に減らすと
C#というかUnityと付き合っていけばいずれパフォーマンスの最適化という壁にぶち当たる日が来る
そうなった時、というかそうなった時には大抵手遅れだから、同じ結果が得られるならコストが低い処理を極力使ったほうがいい
GameObject obj1; という変数があるとして、このobj1にアタッチされたHogehogeコンポーネントにアクセスしたい場合
Hogehoge hooo1 = obj1.GetComponent<Hogehoge>();
でアクセスすることは可能
ただしGetComponentを1回実行すると、GC.Allocというメモリ上のゴミが発生する上にこれ自体の所要時間も結構なものだから、GetComponentはコストが高い
「私1フレーム内でGetComponentを10回使ってるんですよ〜」とか言ったら吐き気を催される
なのでGetComponentの使用回数は最小限に減らさなければいけない
1つのプレハブを複製するというのが要件にあるようだから、それを加味したうえでGetCompoenentの使用回数を最小限に減らすと
243名前は開発中のものです。
2023/11/26(日) 11:00:07.84ID: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; みたいに自分で作成したコンポーネントやクラスの傘下に定義された変数や関数なら低コスト
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; みたいに自分で作成したコンポーネントやクラスの傘下に定義された変数や関数なら低コスト
244名前は開発中のものです。
2023/11/26(日) 11:18:12.87ID: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傘下の変数なので・・・あとは分かるだろうか
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傘下の変数なので・・・あとは分かるだろうか
245名前は開発中のものです。
2023/11/26(日) 11:24:49.94ID:sKe5WX7u ホビーストクリエイターならコストとか処理遅いとか気にしなくてもいいよ
ここに来るのはそういうのが大半でしょ
本格的な売り物なら別にだけどね
ここに来るのはそういうのが大半でしょ
本格的な売り物なら別にだけどね
246名前は開発中のものです。
2023/11/26(日) 12:29:20.67ID:RHrCXnE8 ホビー云々関係なく、気になる問題は潰した方が将来のためだよ
不要なAPIコール抑えるのはプログラミングの基本
処理負荷気にしないプログラマは仕事でも品質悪いコードを書く
不要なAPIコール抑えるのはプログラミングの基本
処理負荷気にしないプログラマは仕事でも品質悪いコードを書く
247名前は開発中のものです。
2023/11/26(日) 12:33:35.93ID:RHrCXnE8248名前は開発中のものです。
2023/11/26(日) 12:39:02.58ID:ap8K17/p あああ配列を生成するためのGCが発生してんのか
nameとかtagみたいにアクセスするだけでGCが発生する組だと思ってた
UpdateでGetComponentするなは割とよく言われてる気がする
https://www.google.com/search?q=getcomponent+update
nameとかtagみたいにアクセスするだけでGCが発生する組だと思ってた
UpdateでGetComponentするなは割とよく言われてる気がする
https://www.google.com/search?q=getcomponent+update
249名前は開発中のものです。
2023/11/26(日) 12:44:50.43ID:sKe5WX7u それの一発目のテラのやつは問題ありませんキリッって、書いてるが
まぁ大してとかある程度とかの体感記事などほとんどがスペック、時間という物を提示しないで、遅いとか重いとか言ってるとこのをベースに広まってるよね
所詮ハードが1年進化するだけでも重さなんか気にするほどじゃねーよ
まぁ大してとかある程度とかの体感記事などほとんどがスペック、時間という物を提示しないで、遅いとか重いとか言ってるとこのをベースに広まってるよね
所詮ハードが1年進化するだけでも重さなんか気にするほどじゃねーよ
250名前は開発中のものです。
2023/11/26(日) 13:06:00.31ID:RHrCXnE8 まじで他人の意見を鵜呑みにしてはいけないとはこのことw
自分はプロファイラ載せてる記事だけ見るようにしてる
ただ、UpdateでGetComponentは無駄なので、キャッシュするに越したことはないとは思ってる
Componentなんてほぼ静的だし
自分はプロファイラ載せてる記事だけ見るようにしてる
ただ、UpdateでGetComponentは無駄なので、キャッシュするに越したことはないとは思ってる
Componentなんてほぼ静的だし
251名前は開発中のものです。
2023/11/26(日) 13:13:11.53ID:kOB5vzh5 要するに他のスクリプトにアクセスするのにGetComponent使わないと
いけないことを知らないだけだな
いけないことを知らないだけだな
252名前は開発中のものです。
2023/11/26(日) 13:33:35.58ID: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);
}
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);
}
253名前は開発中のものです。
2023/11/26(日) 13:35:36.82ID:ap8K17/p ついでに2022.3.10f1で検証してきた
https://i.imgur.com/itDtIfy.png
この差を気にするか気にしないかはきのこたけのこ張りの宗教戦争なので、きのこが好きかたけのこが好きかによって意見が真っ二つやね
https://i.imgur.com/itDtIfy.png
この差を気にするか気にしないかはきのこたけのこ張りの宗教戦争なので、きのこが好きかたけのこが好きかによって意見が真っ二つやね
254名前は開発中のものです。
2023/11/26(日) 13:49:05.74ID:sKe5WX7u まぁ初心者のときにやることとして
アップデートでprintするとメチャログ埋まるやん
それを見て、あっやべーアップデートでそういう事しちゃあかんなと思えればいいんでねーかな
printですらこんなに沢山なんだから他の処理やったら大変だ!と思えればキャッシュしてやろーって思わないなら向いてね~ってことで(笑)
アップデートでprintするとメチャログ埋まるやん
それを見て、あっやべーアップデートでそういう事しちゃあかんなと思えればいいんでねーかな
printですらこんなに沢山なんだから他の処理やったら大変だ!と思えればキャッシュしてやろーって思わないなら向いてね~ってことで(笑)
255名前は開発中のものです。
2023/11/26(日) 14:08:31.06ID:kOB5vzh5 俺がGetComponetするのはStartかAwakeの中
それと何かと衝突した時とかの特定のイベント時くらいかな
Updateの中で常時使わないね
それと何かと衝突した時とかの特定のイベント時くらいかな
Updateの中で常時使わないね
256名前は開発中のものです。
2023/11/26(日) 14:13:45.97ID:J5rQpI/4 神々が言い争ってるみたいですが、
結局、私はupdate()内でGetComponent() を記載しまくっても
さほど問題にはならないということでしょうか?
結局、私はupdate()内でGetComponent() を記載しまくっても
さほど問題にはならないということでしょうか?
257名前は開発中のものです。
2023/11/26(日) 14:17:57.98ID:RHrCXnE8 例えどんなにマシンのスペックが上がったとしても
要求される表現のハードルが上がるだけなので宗教もクソもない
無駄な負荷のかからない「当たり前」のコードを書く習慣をつけておけばいいだけ
PS5やPCゲーム主流の現在でも、何故パフォーマンスチューニングなるものが必要なのか考えればわかる話
要求される表現のハードルが上がるだけなので宗教もクソもない
無駄な負荷のかからない「当たり前」のコードを書く習慣をつけておけばいいだけ
PS5やPCゲーム主流の現在でも、何故パフォーマンスチューニングなるものが必要なのか考えればわかる話
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★4 [BFU★]
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す [蚤の市★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★3 [ぐれ★]
- 「内政干渉」という言葉が大好きなネトウヨが高市にこれを言わない理由 [931948549]
- 【悲報】ネトウヨ「なんで高市が謝るんだよ!岡田が謝れ!😡」 [359965264]
- 【実況】博衣こよりのえちえち歌枠🧪★2
- 【緊急】佳子さま、コロナ感染!高市発言なんかより非常事態※最新画像 [219241683]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 【雑談】暇人集会所part18
