[過去ログ] 【ゲームエンジン】Unity初心者質問スレBuild2 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
937: 名前は開発中のものです。 [sage] 2020/01/08(水) 07:12:01.63 ID:STEsEzVT(1) AAS
継承が嫌ならインターフェース定義すればいいじゃない
938: 名前は開発中のものです。 [sage] 2020/01/08(水) 21:12:40.84 ID:c/TDM3Pm(1/5) AAS
>>935
935(3): 名前は開発中のものです。 [] 2020/01/08(水) 04:02:14.62 ID:yDUxVkXo(1) AAS
Unityを触り始めた時、プレイヤーやエネミーなど、画面に表示するキャラクターは、GameObjectを継承した子クラスとして作るのかと思っていたのですが、そうではないですよね。

この様なプログラムに初めて触れるので今でも違和感があるのですが、何故この様な仕様になっているのでしょうか?

また、この様な実装方法は、デザインパターンで言うと、何パターンになるのでしょうか?

ご存知の方、いらっしゃいましたら、教えて頂けると嬉しいです。
お願い致します。
MonoBehaviour を継承して、Update() とか FixedUpdate() とか様々なフックハンドラを実装してく作法だよ。
しいて言えば、GoFのObserver パターンに近いんじゃない。Unity 内部の実装は違うらしけど。

GameObject を継承するんじゃなくて、GameObject に上記の MonoBehaviour 継承クラスを紐づけて動作をさせる。
この仕様だと、GameObject が "複数"の MonoBehaviour 継承クラスの動作を行うことが出来る。

C# は多重継承出来ないでしょ、Unity よく考えられてるシステムだよね。
939: 名前は開発中のものです。 [sage] 2020/01/08(水) 21:25:51.83 ID:c/TDM3Pm(2/5) AAS
自分も最初 Unity のスクリプトに違和感というか、なんだろうこれは? と思った。
Unity 以外の他言語経験者というか、自分も職業プログラマの端くれなんで、
Player クラスとか、Enemy クラスを定義するんだよな。とか勝手に思って最初そのように書こうとしてた。

でも、Unity には GameObject という規定クラスがあり、それらに対する作用を MonoBehaviour 継承クラスに
記述して GameObject にアタッチ(紐づけ)するという仕組みを理解してからは、腑に落ちたというか納得出来た。
940: 名前は開発中のものです。 [sage] 2020/01/08(水) 21:42:58.57 ID:c/TDM3Pm(3/5) AAS
書いてて思ったけど、GameObject に拡張メソッド書けば良くね? と思って調べたら、やっぱりそうしてる人いた。
処理コストとか気になるけど、静的 Utuil クラスとか書くより、 拡張メソッド書いたらスマートに記述出来る箇所が山ほどある。

>>935 サンキュー めちゃめちゃ良い気づきを頂いたわ。
941: 名前は開発中のものです。 [sage] 2020/01/08(水) 22:04:58.83 ID:c/TDM3Pm(4/5) AAS
なるほど。GameObject に MonoBehaviour 継承クラス"型" の変数を自由に設定出来ると。
その "型" を "Component" と言いますと。そして、GameObject.GetComponent<型> で自由に変数を取得出来ますと。

最初からそう教えてくれればいいのに。
942
(1): 名前は開発中のものです。 [sage] 2020/01/08(水) 22:07:01.56 ID:c/TDM3Pm(5/5) AAS
Unity 良いね。ほんと好きになったわ。
元々 C# が超強力な言語なんで、とにかくプログラミングが楽しい。
943: 名前は開発中のものです。 [sage] 2020/01/08(水) 22:18:19.80 ID:HHbGzUHS(1) AAS
ここはお前の日記帳ちゃうで
944: 名前は開発中のものです。 [sage] 2020/01/08(水) 23:36:42.85 ID:Le5pG30A(1) AAS
>>942
まあ、みんな一度はそう思うんだけど、ゲームを作ってる以上、次はC#はもちろんUnityならではボトルネックの最適化でつまずくんだよなー
945
(1): 名前は開発中のものです。 [sage] 2020/01/09(木) 01:04:08.75 ID:9Vcb+knu(1) AAS
そこでJobSystem,Burst,ECSですよ
946: 名前は開発中のものです。 [sage] 2020/01/09(木) 02:30:18.61 ID:mwK+f391(1) AAS
DOTSはまだ早い
947: 名前は開発中のものです。 [sage] 2020/01/09(木) 10:09:19.78 ID:kIaaP1cE(1) AAS
JOBSYSREMとかビジネス啓蒙系のサイトっぽい名前
948: 名前は開発中のものです。 [sage] 2020/01/09(木) 10:23:49.72 ID:65C13n6s(1/4) AAS
boolの配列で中身の全てがtrueなら○○するという処理はどうやって書けばスマートですか?

今は配列の要素数が3しかないのでifを使った分岐で力技で動かせて居ますが数が増えたときの事を想像すると頭が痛いです。
949: 名前は開発中のものです。 [sage] 2020/01/09(木) 10:47:15.13 ID:9CjsCJlx(1) AAS
if文を3つ書いてるということならforeach使おう
950
(1): 名前は開発中のものです。 [sage] 2020/01/09(木) 11:16:55.09 ID:bvBlalIf(1) AAS
配列数が固定ならFlags付けたenumでビットフラグ使う

動的に増減するなら設計がおかしいんだがLINQのAllを使えば簡単に書ける
951: 名前は開発中のものです。 [sage] 2020/01/09(木) 11:32:20.48 ID:65C13n6s(2/4) AAS
for(int count = 0; count <= 2; count++)
{
if(配列[count]== true)
{
変数++;
}
}

if(変数 == 3)
{
処理
}

にしてみたのですが微妙ですか?
foreachとlinqはまだ使い方がわからないのですが調べてみます。
952
(1): 名前は開発中のものです。 [] 2020/01/09(木) 12:00:30.94 ID:AbIkBBD9(1/2) AAS
1つでもfalseならリターンすればいい
そうすりゃ無駄な変数いらんよ
あとfor で回す場合、<変数.lengthが使えるから増えても問題なし
953
(1): 名前は開発中のものです。 [sage] 2020/01/09(木) 12:12:40.81 ID:65C13n6s(3/4) AAS
>>952
count <= 2 の 2の部分を変数.lengthにするという事でしょうか?思いつきませんでした!

もし宜しければ
一つでもfalseなら〜の書き方を教えて頂けませんか?
954: 名前は開発中のものです。 [sage] 2020/01/09(木) 12:23:32.35 ID:sMXCo4Ih(1) AAS
とりあえず動けばいいって感じ?
955
(1): 名前は開発中のものです。 [sage] 2020/01/09(木) 12:47:54.85 ID:8Z9bXpy1(1) AAS
>>953
画像リンク

956: 名前は開発中のものです。 [sage] 2020/01/09(木) 13:17:02.96 ID:AbIkBBD9(2/2) AAS
あとList型に入れると簡単にあるかないか取れるけど、どうなんだろね
画像リンク

957
(1): 名前は開発中のものです。 [sage] 2020/01/09(木) 13:17:06.70 ID:h4Av5g/u(1) AAS
false、trueを入れるときに、変数にして+1、-1しとけばいいやん。0以下なら全部true。
不安なら、たまに時間の許す処理の時にチェックサム。
958: 名前は開発中のものです。 [sage] 2020/01/09(木) 13:17:26.76 ID:65C13n6s(4/4) AAS
>>955
ありがとうございます!
この短いコードの中に何故forとifの間に{が必要ないのか、(!b[i])が既にboolを表している等、普通に勉強してたら気付かない事ばかりで尊敬します。。
いつかこういうスマートで格好いいコードが書ける様に頑張ります!
959: 名前は開発中のものです。 [sage] 2020/01/09(木) 15:42:48.73 ID:ZRX+0Tcv(1) AAS
そこ省略すれば偉いってもんでもないから気をつけてな
コード長くなってくるとこういうとこはすっきり書いたほうが読みやすくはなるけど
960: 名前は開発中のものです。 [sage] 2020/01/09(木) 18:15:25.24 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);
} else {
 System.Console.WriteLine("{0}は見つかりませんでした", item);
}
961
(1): 名前は開発中のものです。 [sage] 2020/01/09(木) 21:40:32.44 ID:L8tG5HPm(1) AAS
>>950
ゲームでLinqは悪手
1-
あと 41 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.035s