[過去ログ] 【ゲームエンジン】Unity初心者質問スレBuild2 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1(3): ageteoff [ageteoff] 2019/05/08(水)14:35 ID:VDHuk8YT(1/2) AAS
ゲームエンジンUnityを楽しむ初心者による初心者の為のスレ
その為「アセットを購入しましょう」「チュートリアルやれ」「ググレカス」等禁止
初心者が親身になって初心者に教える。
又ググレの場合、何のキーワードでググるのか書いてね
●リンク
・Unity(日本公式サイト)
外部リンク:unity3d.com
省10
922: 2020/01/06(月)12:26 ID:MVMM0EnC(1) AAS
課金ボタンだけ反応しねえ!
923: 2020/01/07(火)16:39 ID:N6ynwaTL(1/2) AAS
反応したと思ったら失敗表示しか出ねえ!
924(1): 2020/01/07(火)18:44 ID:oElcyruO(1/2) AAS
>>919
ありがとう。PostProcess は試したんだけど、モバイルでは激重で使えなかったんだ。
>>920
クライアントに30fpsは死守せよと命じられたからね。まあクライアントも開発者も自分だけど…
プロファイラみたら、結構スクリプトで処理食ってるんで UniRX で Update() と FixedUpdate() を
置き換えた。Start() に UpdateAsObservable とかで全部書くやつ。
結果、あんまり変わんない、自分の使い方が悪いのか…
925: 2020/01/07(火)18:46 ID:zmI8ipko(1/4) AAS
インスペクターにセットしないで他のクラスを使うスクリプトの記述方法ってあるのでしょうか?
926(1): 2020/01/07(火)18:53 ID:N6ynwaTL(2/2) AAS
クラス継承じゃなくて?
927: 2020/01/07(火)19:11 ID:zmI8ipko(2/4) AAS
>>926
なるほど!早速試してみます!
継承というのは: MonoBehaviorの部分を好きなクラス名に変えれば良いんですよね?
継承するクラスは一つしか選べないのでしょうか?
928: 2020/01/07(火)19:15 ID:zmI8ipko(3/4) AAS
C# 継承 複数で検索したら一応解決しました!
調べればすぐ分かることを聞いてしまってごめんなさい。
ありがとうございました!
929(1): 2020/01/07(火)19:34 ID:mTxkaJC9(1) AAS
聞く方もわかっていなければ、答える方も分かっていない典型だな
930: 2020/01/07(火)20:11 ID:uM5ClZyr(1) AAS
質問失礼します
3人などの複数人で開発する場合に自分のみが有料アセットを所有しておりそれを使いたい場合のプロジェクトの管理方法はどうするのが一般的ですか?
931(1): 2020/01/07(火)20:25 ID:d7S3IRng(1) AAS
>>924
Updateの呼び出しじゃなくて中身が重たいんだと思われ
deep profile すれば具体的なメソッド名まで追えるから、まずはそれで負荷の高い処理を特定しましょう
932: 2020/01/07(火)21:31 ID:oElcyruO(2/2) AAS
>>931
アドバイスありがとう。
詳細プロファイルみたら、どうやら処理の中身で gameObject.name.Contains("Hoge") とか
多用してるとこが処理コストが高いっぽい。
地道にプロファイラ見て、重そうな箇所をつぶしていくしかなさそうだね。
自分の使い方がこなれてないので、UniRX 自体は良さそうだと思った。
933(1): 2020/01/07(火)22:21 ID:zmI8ipko(4/4) AAS
>>929
確かにわかっていないので今まで通りpublicかシリアライズでインスペクターに表示して他のクラスを貼り付けたオブジェクトを入れています。
なにかこの作業を省略出来る方法はあるのでしょうか?
継承について聞けて調べた事は今後活かせる事もありそうなので感謝しています!
934: 2020/01/08(水)00:37 ID:Hvk3XDsR(1) AAS
Updateの中でFindはさすがにStartでやってキャッシュしないとそりゃそうなるな……
935(3): 2020/01/08(水)04:02 ID:yDUxVkXo(1) AAS
Unityを触り始めた時、プレイヤーやエネミーなど、画面に表示するキャラクターは、GameObjectを継承した子クラスとして作るのかと思っていたのですが、そうではないですよね。
この様なプログラムに初めて触れるので今でも違和感があるのですが、何故この様な仕様になっているのでしょうか?
また、この様な実装方法は、デザインパターンで言うと、何パターンになるのでしょうか?
ご存知の方、いらっしゃいましたら、教えて頂けると嬉しいです。
お願い致します。
936: 2020/01/08(水)04:34 ID:7cplqCOI(1) AAS
>>933
ゲットコンポーネントすればわざわざインスペクタで指定しなくていい
基本他のクラスファイルはそのまま使える
またネームスペース指定してるならusingで指定すれば使えるよ
>>935
ユニティはすべてコンポーネントからの継承
強いて言うならコンポーネントデザインだよ
省1
937: 2020/01/08(水)07:12 ID:STEsEzVT(1) AAS
継承が嫌ならインターフェース定義すればいいじゃない
938: 2020/01/08(水)21:12 ID:c/TDM3Pm(1/5) AAS
>>935
MonoBehaviour を継承して、Update() とか FixedUpdate() とか様々なフックハンドラを実装してく作法だよ。
しいて言えば、GoFのObserver パターンに近いんじゃない。Unity 内部の実装は違うらしけど。
GameObject を継承するんじゃなくて、GameObject に上記の MonoBehaviour 継承クラスを紐づけて動作をさせる。
この仕様だと、GameObject が "複数"の MonoBehaviour 継承クラスの動作を行うことが出来る。
C# は多重継承出来ないでしょ、Unity よく考えられてるシステムだよね。
939: 2020/01/08(水)21:25 ID:c/TDM3Pm(2/5) AAS
自分も最初 Unity のスクリプトに違和感というか、なんだろうこれは? と思った。
Unity 以外の他言語経験者というか、自分も職業プログラマの端くれなんで、
Player クラスとか、Enemy クラスを定義するんだよな。とか勝手に思って最初そのように書こうとしてた。
でも、Unity には GameObject という規定クラスがあり、それらに対する作用を MonoBehaviour 継承クラスに
記述して GameObject にアタッチ(紐づけ)するという仕組みを理解してからは、腑に落ちたというか納得出来た。
940: 2020/01/08(水)21:42 ID:c/TDM3Pm(3/5) AAS
書いてて思ったけど、GameObject に拡張メソッド書けば良くね? と思って調べたら、やっぱりそうしてる人いた。
処理コストとか気になるけど、静的 Utuil クラスとか書くより、 拡張メソッド書いたらスマートに記述出来る箇所が山ほどある。
>>935 サンキュー めちゃめちゃ良い気づきを頂いたわ。
941: 2020/01/08(水)22:04 ID:c/TDM3Pm(4/5) AAS
なるほど。GameObject に MonoBehaviour 継承クラス"型" の変数を自由に設定出来ると。
その "型" を "Component" と言いますと。そして、GameObject.GetComponent<型> で自由に変数を取得出来ますと。
最初からそう教えてくれればいいのに。
942(1): 2020/01/08(水)22:07 ID:c/TDM3Pm(5/5) AAS
Unity 良いね。ほんと好きになったわ。
元々 C# が超強力な言語なんで、とにかくプログラミングが楽しい。
943: 2020/01/08(水)22:18 ID:HHbGzUHS(1) AAS
ここはお前の日記帳ちゃうで
944: 2020/01/08(水)23:36 ID:Le5pG30A(1) AAS
>>942
まあ、みんな一度はそう思うんだけど、ゲームを作ってる以上、次はC#はもちろんUnityならではボトルネックの最適化でつまずくんだよなー
945(1): 2020/01/09(木)01:04 ID:9Vcb+knu(1) AAS
そこでJobSystem,Burst,ECSですよ
946: 2020/01/09(木)02:30 ID:mwK+f391(1) AAS
DOTSはまだ早い
947: 2020/01/09(木)10:09 ID:kIaaP1cE(1) AAS
JOBSYSREMとかビジネス啓蒙系のサイトっぽい名前
948: 2020/01/09(木)10:23 ID:65C13n6s(1/4) AAS
boolの配列で中身の全てがtrueなら○○するという処理はどうやって書けばスマートですか?
今は配列の要素数が3しかないのでifを使った分岐で力技で動かせて居ますが数が増えたときの事を想像すると頭が痛いです。
949: 2020/01/09(木)10:47 ID:9CjsCJlx(1) AAS
if文を3つ書いてるということならforeach使おう
950(1): 2020/01/09(木)11:16 ID:bvBlalIf(1) AAS
配列数が固定ならFlags付けたenumでビットフラグ使う
動的に増減するなら設計がおかしいんだがLINQのAllを使えば簡単に書ける
951: 2020/01/09(木)11:32 ID:65C13n6s(2/4) AAS
for(int count = 0; count <= 2; count++)
{
if(配列[count]== true)
{
変数++;
}
}
省6
952(1): 2020/01/09(木)12:00 ID:AbIkBBD9(1/2) AAS
1つでもfalseならリターンすればいい
そうすりゃ無駄な変数いらんよ
あとfor で回す場合、<変数.lengthが使えるから増えても問題なし
953(1): 2020/01/09(木)12:12 ID:65C13n6s(3/4) AAS
>>952
count <= 2 の 2の部分を変数.lengthにするという事でしょうか?思いつきませんでした!
もし宜しければ
一つでもfalseなら〜の書き方を教えて頂けませんか?
954: 2020/01/09(木)12:23 ID:sMXCo4Ih(1) AAS
とりあえず動けばいいって感じ?
955(1): 2020/01/09(木)12:47 ID:8Z9bXpy1(1) AAS
>>953
画像リンク[png]:i.gyazo.com
956: 2020/01/09(木)13:17 ID:AbIkBBD9(2/2) AAS
あとList型に入れると簡単にあるかないか取れるけど、どうなんだろね
画像リンク[png]:i.gyazo.com
957(1): 2020/01/09(木)13:17 ID:h4Av5g/u(1) AAS
false、trueを入れるときに、変数にして+1、-1しとけばいいやん。0以下なら全部true。
不安なら、たまに時間の許す処理の時にチェックサム。
958: 2020/01/09(木)13:17 ID:65C13n6s(4/4) AAS
>>955
ありがとうございます!
この短いコードの中に何故forとifの間に{が必要ないのか、(!b[i])が既にboolを表している等、普通に勉強してたら気付かない事ばかりで尊敬します。。
いつかこういうスマートで格好いいコードが書ける様に頑張ります!
959: 2020/01/09(木)15:42 ID:ZRX+0Tcv(1) AAS
そこ省略すれば偉いってもんでもないから気をつけてな
コード長くなってくるとこういうとこはすっきり書いたほうが読みやすくはなるけど
960: 2020/01/09(木)18:15 ID:IB4d3PvK(1) AAS
containsで行けるような
bool[] src = {true, true, false, true};
var list = new List<bool>();
list.AddRange(src);
bool item = false;
if (list.Contains(item)) { /////////////////////////////////////←これ
System.Console.WriteLine("{0}が見つかりました", item);
省3
961(1): 2020/01/09(木)21:40 ID:L8tG5HPm(1) AAS
>>950
ゲームでLinqは悪手
962: 2020/01/09(木)23:26 ID:2OZqFXaj(1) AAS
>>945 946
サンキュー、そういうの教えてもらえるのは、本当に有意義だわ。
自分にはまだ早いので、しばらくベタで悪戦苦闘して経験値つんでからトライするわ。
現在、物理ゲームパッドで遊んでもらう想定で作ってるけど、一応スマホ画面操作に対応しようと思い、
新しい InputSystem で、Canvas の UI ボタンを使ってスマホ画面操作用のコントローラ作ったけど、
一つもコード書かずに物理ゲームパッド想定のゲームにマッピング出来た。InputSystem 凄い。
でもスマホ画面操作でBダッシュジャンプって超絶むずいね、物理コントローラーなら楽勝でBダッシュジャンプ出来るのに…
963(1): 2020/01/10(金)11:30 ID:08GLxpkh(1/4) AAS
>>961
よければこれの根拠教えてください
次のhp ではfor reach と大差ないとあるけど、何か他の要因?
外部リンク:qiita.com
964: 2020/01/10(金)12:14 ID:6FaPVqIC(1/3) AAS
>>963
LINQのメソッドに渡すデリゲートは取り扱いを間違えるとGC対象になるし
それに関してググって出てくる記事がほぼ全て検証も解釈も間違ってるから使うなというのは分かる
965: 2020/01/10(金)12:38 ID:08GLxpkh(2/4) AAS
そう言うことですか
ガベージ関連だと初心者が考えなくても
まぁ、このスレ的には問題なさそうですね
966: 2020/01/10(金)12:42 ID:08GLxpkh(3/4) AAS
だとすると「RINQ がゲームで悪手」というよりデリケート関連が全てのプログラムで悪手であって、メモリー関連の改善待ちとなるのかな?
c#のバージョンによる改善待ちになるのか
まぁ将来的な課題でしょうかね
967(1): 2020/01/10(金)12:57 ID:5Sf2RA1L(1/2) AAS
デリゲートがってよりも、Linqで色々繋げると色々コピーがされるしIEnum経由して列挙してくのがアレって話じゃないか?
968(1): 2020/01/10(金)14:23 ID:6FaPVqIC(2/3) AAS
>>967
IEnumerableは一つずつ取り出して処理する為の機能だから、
複製はされないしチェーンの数だけループ発生したりもしないよ
もちろんToArray()で新規配列は生成されるしOrderBy()でも内部で別のループが生まれてしまうがそれはそういう関数だからな
969(2): 2020/01/10(金)15:40 ID:5Sf2RA1L(2/2) AAS
>>968
いやもし5段階に組まれてたら下から見るとMoveNext5回呼ばれる事でやっと元のコレクションなりにたどり着くやん
あれインタフェースになってて1番下でのMoveNextでもとのに辿り着くっけ?
970(1): 2020/01/10(金)18:42 ID:6FaPVqIC(3/3) AAS
>>969
例えばこんなLINQがあるとするだろ
var seq = list.Where(A).Where(B).Where(C);
foreach(var n in seq) Console.WriteLine(n);
内部的にはこの処理と同じ
var tmp = list.GetEnumerator();
while(tmp.MoveNext()){
省8
971: 2020/01/10(金)19:15 ID:7KV1Qvxy(1) AAS
Linqを許可しておくとRDBMSみたいに組むやついるからな
ゲームでそんな使い方されたら激重だから、使わないで統一するのが正解かと
972: 2020/01/10(金)19:55 ID:Pn9TT9VK(1) AAS
linqの冒険…
973: 2020/01/10(金)21:28 ID:08GLxpkh(4/4) AAS
>>957
これってプログラムするとどんなコードになるのかな?
いまいち浮かばないんだが
974(1): 2020/01/10(金)22:12 ID:lJeo0zER(1/2) AAS
3dでPlatform does not support compute shadersこんなエラーが出たんだがよくわかんないんだけどどういうこと?
ユニティちゃんが原因みたいだけどそれ以上はわからなかった
975: 2020/01/10(金)22:17 ID:Fenu7wQ/(1) AAS
そのシェーダーを積んでないから描画できないぞゴルァ、かと。
976(2): 2020/01/10(金)22:52 ID:L/Emtw4P(1) AAS
>>970
そだっけ?その例だとWhereの第一引数に対してMoveNextすることでさらにその上のWhereが返すIEnumにアクセスってなるんじゃ?
Linqのコンパイラでそんな最適化しないでしょ
977(2): 2020/01/10(金)23:26 ID:XdY5fR78(1) AAS
>>976
遅延評価というものがあるし、そもそもWhereが返すのはIEnumでなく値そのものだからそこのところを誤解してる
978: 2020/01/10(金)23:40 ID:lJeo0zER(2/2) AAS
>>974
ダメだわこれ、unityちゃんの配布物全部がshaderエラーになるわ
どうなってるんだ急に
979: 2020/01/11(土)00:03 ID:L2PVl/EJ(1) AAS
Platformがなんちゃらっつってんだからそのへんじゃないの
980: 2020/01/11(土)00:19 ID:MByoB+15(1) AAS
ビルドターゲットをWebGL辺りに変えたんだろ
あれはCompute Shaderが使えないからそんな感じのエラーが出る
981(1): 2020/01/11(土)01:41 ID:1/8GPuaw(1/7) AAS
>>977
ごめん何言ってるのかよく分からん
外部リンク:docs.microsoft.com
982(1): 2020/01/11(土)01:45 ID:1/8GPuaw(2/7) AAS
WhereがIEnum返さなかったら次の人どうやって列挙するの
983(1): 2020/01/11(土)01:49 ID:1/8GPuaw(3/7) AAS
>>977
ついでに言うと遅延評価ってのはまさに後からMoveNextした時に評価されることを指すと思うぞこの場合
984(1): 2020/01/11(土)02:03 ID:eNMw2FnY(1/6) AAS
>>981-983
実行時の話な
var seq = list.Where(...)が返すのはIEnumだが、
実際にforeach(var n in seq)で遅延評価されるときには一つずつの値を返してるし、それが次のWhereに送られてる
ループの位置を見てみろ、配列は一回しか回ってないだろ?
985(1): 2020/01/11(土)02:17 ID:1/8GPuaw(4/7) AAS
>>984
いやだからその展開式みたいに実行時コードがなるって話あったっけ?
こんぱいられべるでLINQ特化で最適化しないとそうはできないと思うけど、いや俺が知らないだけかもなのでこう最適化されるよーってソースあるなら教えてくれ
986: 2020/01/11(土)02:34 ID:eNMw2FnY(2/6) AAS
>>985
yieldのごく普通の振る舞いなんだからイテレーター使ったことあるなら分かるだろ?
ちなみに具体的なソースはこれな
外部リンク[cs]:github.com
987(1): 2020/01/11(土)03:28 ID:MfNXfEnO(1) AAS
コルーチンについて質問させてください。
void Start() {
StartCoroutine(A());
}
void Update()
{
Debug.Log("update");
省18
988(1): 2020/01/11(土)03:42 ID:eNMw2FnY(3/6) AAS
とりあえず>>969と>>976から読み取ると、LINQで繋がれたメソッドは全部独立したIEnumerableを返してるような誤解をしてるんだと思う
実際は宣言時にチェーンの最後にあるメソッドが一つのIEnumerableを返すだけだし、間にある他のメソッドは最後のメソッドがデリゲートとして一括で実行する
だからMoveNextは一つの要素に一回ずつしか基本的に呼ばれず、従ってループも一回だけ
これで納得出来ないならもう5個チェーン繋げたら5回ループされてると思っても良いよ、別にそれでも実害は一切無い
989(1): 2020/01/11(土)11:12 ID:1/8GPuaw(5/7) AAS
>>988
いやごめん、むしろお前がなんでそんな理解してるのか分からん。
それはイテレーターを書くためのシンタックスシュガーであって、結局はEnumeから列挙するためにMoveMextやら何やら呼ぶことになると思うが。
そもそもお前が言ってるようなループなんてコード上は展開されないだろ
あくまでもEnumeのMoveNextやらなんやらで列挙されてくだけで。つか自分があげたWhereのどこ見りゃ途中のものも全部前のが返すEnumeを第一引数として受け取りEnumeを返すってのが明らかだと思うが。
その上でWhereを続けた時などにC#上もしくはコンパイラ生成時に最適化がなされる事はあり得るかも?とは思うけどそう言うこと言いたいんじゃないよね
990: 2020/01/11(土)11:45 ID:GoAReVTm(1/2) AAS
>>987
>最初のUpdateのあとにコルーチンが実行されないのは
最初のUpdateはスタート直後に動くんだけど、Updateの間隔は不定なので、最初のスタートのオーバーヘッドがUpdateを遅延させてしまい2回ログが出力されたのかと思う
これを修正するには
Update を FixedUpdate にし
yield return null を yield return new WaitForFixedUpdate() にする事で解決は出来る
UpdateとFixedUpdate の動作の違いによる処理の仕様なのかな、一言で言うと
991(1): 2020/01/11(土)12:19 ID:eNMw2FnY(4/6) AAS
>>989
率直に言ってお前は何を主張したいの?
まずそれ教えてくれ
そのレスを読むだけだとわざわざ実装のURLまで見せたのにソースも読めない子なんだぁとしか思えん
992: 2020/01/11(土)12:28 ID:SODcWRcR(1) AAS
オーケー、乳首相撲で決めよう
二人とも乳首出して
993(2): 2020/01/11(土)12:34 ID:1/8GPuaw(6/7) AAS
>>991
最初はなんか最適化かなんか俺の知らないのあるの?って感じだったけど、今はなんか勘違いしてる人に諭してあげようかなと思ったけど無駄っぽいからもうどうでもいいかな
最後に言っとくけど、おまいのあげたイテレーターのソース、foreachが一つしか展開されないとか言ってるけど思いっっっっっきり勘違いしてると思うよ
Whereのイテレータ内で展開してるforeachはソースのイナミュレーターを回してるけどそれは前のWhereが返すイナミュラブルを回してて、それはまた別にforeach x展開してるイテレーターによるものだよ。
と言ってそれはシンタックスシュガーによるものだからforeachが何重になってると言うのともまた違う
994: 2020/01/11(土)12:40 ID:Y9mLoGJE(1) AAS
初心者スレでイキんなやハゲ
995(2): 2020/01/11(土)12:46 ID:wPvGtAaQ(1) AAS
敵に攻撃するとダメージが数字でポップアップされるという処理を
var pos = 対象の敵オブジェクト.GetComponent<Transform>()して、
ダメージのテキストをプレハブ化した物をInstantiate(プレハブ, pos)で生成したのですが
ダメージのプレハブが敵オブジェクトの子になっているので、敵オブジェクトのHPが0になってDestroyされた瞬間に一緒に消えてしまいます
生成するプレハブの位置を任意のゲームオブジェクトのtransformに重ねるが、子にはしないみたいな事はどうすれば出来るのでしょうか?
transformから位置(座標?)だけを取得する方法がわかれば応用が色々出来そうなのですが
996(1): 2020/01/11(土)13:01 ID:eNMw2FnY(5/6) AAS
>>993
だろ、やっぱり入れ子になってると勘違いしてるよな?
サンプルソース書いてあげたから見てみな
IL_009aのループ一度しか無いし中身の取り出しも一回だけ
その後でLINQメソッドに渡されたデリゲートを適用してそのままループ内の処理に進んでる
外部リンク:imgur.com
997: 2020/01/11(土)13:08 ID:ftB0znZP(1) AAS
>>995
ダメージテキストのオブジェクトに、新しいスクリプトをつける。
そのスクリプトのstartに、親を放棄させるメソッドを入れる。
ググリワード
transform.parent
998: 2020/01/11(土)13:13 ID:GoAReVTm(2/2) AAS
>>995
Instantiateする際に
GameObject obj =Instantiate(プレハブ, pos)
これでGameObject取得できるので、その後すぐに親を外す
obj.transform.paerent =null
これで敵の子として生成した後に独立する
999: 2020/01/11(土)13:13 ID:1/8GPuaw(7/7) AAS
>>996
マジで大丈夫?
そりゃそこのforeachがループにされてるだけでそこにループがネストするなんて話はこれっぽっちもしてないんだが
>>993でもそう説明してるけど分からん?マジでシンタックスシュガーによるイテレーターの実装理解できてないだろお前
1000: 2020/01/11(土)13:17 ID:eNMw2FnY(6/6) AAS
頭悪い子だな
1001(1): 1001 ID:Thread(1/2) AAS
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 247日 22時間 41分 28秒
1002(1): 1002 ID:Thread(2/2) AAS
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
省7
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.176s*