[過去ログ] 【ゲームエンジン】Unity初心者質問スレBuild1 (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
349(1): 312 [] 2018/08/05(日) 01:31:28.80 ID:CyFJgm7j(1/2) AAS
>>334334(1): THE・ステップアップ先生 [sage] 2018/08/04(土) 15:19:06.70 ID:KOItUBKr(2/2) AAS
>>312
次の内容はおまけなので意味不明な場合は気にしなくていいよ。
ソース上でのオブジェクトの管理のしやすさはメモリー使用量に反比例する。
今までのやり方(main()ループのやり方)だと扱いたいオブジェクトを最初に配列に全て格納するのでそれだけ沢山メモリーを占有し続けることになる。
旧型のゲームを作る場合はこのやり方でも問題ないし今でもこっちの方が扱いやすい場面が多々ある。
とくに小規模ゲームの場合はこっちのやり方で全然いいと思う。
じゃあUnityがこの古き「main()ループ」のやり方になっていないのは何故かというと
中〜大規模のゲーム作成も想定して作られてるのもあると思う。
この規模になると次の事を実現しないといけない。
・必要な場面にだけメモリだけを使いこまめに確保と解放を繰り返す節約型モデル
・もともと非常に重い3D物理演算を実用レベルで運用する
・もともと複雑で重い3Dの当たり判定処理(コリジョン)をプログラマが手軽に扱えるようにする
これの実現でメモリー制約の厳しいスマホで苦労せずに3Dゲームを作れたり
MMOやオープンワールド系のゲームを作れるポテンシャルを実現している。
FCマリオやテトリス作るなら"main()ループ型"でいいけど、モンスターハンター作るなら"main()ループ型"では死ねるよという感じ。
実際に何かを作ってみると分かるが当たり判定(コリジョン)は"main()ループ型"で回して中でいちいち判定するより
オブジェクト1つ1つにC#スクリプト埋め込んで当たった時に勝手に「当たったよ!」とイベント通知してきてくれる方が100%楽。
余談だが、UnityやVisualStudioのようなGUIでモデルを配置できるエディッタ時代ではなく、コマンドプロンプト時代のCUI時代にソースで扱っていたクラスのカプセルの概念、あれをビジュアル的にも再現できている今のUnityのモデルだとも感じてる。
今のUnityのやり方が、昔に目指されていたオブジェクト指向プログラミングの1つの完成形・理想形なんじゃないかと思う。
アセットの概念なんかはまさにオブジェクト指向プログラミングのカプセル可の恩賜だと思うよ。
とても勉強になる回答内容に感激しました。
私はその昔ながらのmain()ループのやり方で生きて来たクチなので
Unityのマニュアルやチュートリアルに目を通し(熟読はしていませんが、
非常に困惑しているところだったんです。
ステップアップ先生の話を聞いた限り、仮にUnityでFCマリオを制作するとしても、
昔ながらのmain()ループのやり方をUnityで実行するより、
本来はUnityモデルを覚えて作った方が"ラク"だよ、ということですよね?
例えば当たり判定〜のくだりは確かにそっちの方が確実にラクなのが理解できますし。
それとも「いや、FCマリオくらいのゲームしか作る気ないなら、
この先Unityを覚えて制作せずとも、>>333333(1): THE・シンプル先生 [sage] 2018/08/04(土) 15:07:18.36 ID:KOItUBKr(1/2) AAS
>>312
自分で工夫する事で昔の「main()ループ」に近い物が作れる。
?:空のゲームオブジェクト(Empty)を適当な位置に作る。名前は仮に"GameMain"としておく。
?:次に適当な場所に"GameMain.cs"と仮の名前でC#スクリプトを作る。
?:?を?にアタッチ
?:?の中にprivate属性などGameObject型の動的配列の"元だけ"を宣言 → 例:GameObject[] Enemy;
?:?の"start()"などで実際に必要な数の配列を作成 → 例:Enemy = new GameObject[3];
?:"GameObject.Find("※オブジェクト名").gameObjectを使い、先程作成した配列にシーン上のGameObjectを関連付けていく → 例:GameObject[0] = GameObject.Find("Enemy0").gameObject;
?:後はGameObject[0]を使う
当然他のやり方も無数にある。
のUnityの中で擬似main()ループで作る方が断然ラクだよ」とかですか?
というのもmain()ループのやり方が染み付いてしまっている私自体、
ゲームの処理には中心となるがループを置いて、
そこからすべての流れを構想してしまうオツムなんです。
Unityモデルは全オブジェクトが個々で処理され、バラバラに存在している感じ?というか
各オブジェクトや処理に非常にふあふあしていると感じました。
もちろん自分のUnity理解度がまだ足りないせいなのは重々承知してますが
アセットやツールで解決するそれぞれの処理がブラックボックスすぎて、
初心者としてはそれらの応用が難しい。
アニメーション描画も、正直配列に各画像を入れ込んでフレームで回す方がラクなのに、
AnimationEventを使ってメモリを動かしてイベントの制作をしなければならない?のも余計ややこしく感じます。
結局、ソースだけで解決できないエンジンなので例えFCマリオであっても
Unityを覚えないと作れないことにちょっと面食らっています。
それらもステップアップ先生のおっしゃる通り
3Dや中〜大規模のゲーム作成も想定されたUnityだからこその仕様なのだと理解しましたが
どうなんでしょうか、私が2Dオンリーのゲーム制作目的であっても
Unityモデルで制作方法を覚えた方があとあと必ずラクになりますか?
変な相談ですみません。
352(1): THE・ステップアップ先生 [sage] 2018/08/05(日) 04:35:33.53 ID:PSh59YKG(1) AAS
>>349
mainループ式は、シングルスレッドとかシングルタスク的な動きを連想させるけど
Unity式は、マルチスレッドとかマルチタスクとか非同期的みたいな動きだから慣れていないと取っつきにくいだろうね。
どちらかというと、Webのサーバークライアントプログラムの扱いに似てるかもね。
これは慣れだよ。
最初は四苦八苦かもしれないけど
旧式でもゲームを作れる技量があるのなら、触っている内に必ず非同期的な作りにも慣れる。
慣れるとメリットの多さに気づける。
Unity式のやり方を覚えた方が絶対に得だよ。
作れる物の幅も広がるしステップアップに繋がる。
そしてソースが非常に簡略化する時が多い。
例えば動きを実現するのにmainループ型では30行必要だった処理が1行で済むなんてこともあるよ。
最初から全てをUnity式のやり方にする必要はなくて
慣れてるmainループ式で作り、Unity式にしたほうが便利そうな部分だけそっちにする感じでいいんじゃないかな?
実際のゲーム作りも、ほとんどが「main()ループ式 + Unity式のハイブリット型」になると思う。
main()ループ式だけとか、Unity式だけという作りにはならないと思うよ。
他の人はどうなのかは知らないけど自分の場合は必ずゲーム全体を管理するmainループ的なスクリプトが存在するよ。
mainループはゲーム全体の状態をコントロール(ゲーム中なのか?ゲームオーバーなのか?などの状態)したり、
ラジコンを動かすプロポ代わりとなり、各GameObjectに実装した関数へ「待機」とか「アクションAの動きを実行せよ」とか指示をだして操作してるようなイメージ。
各GameObjectには渡された引数で色々な動作をするように記述したC#スクリプトをアタッチさせておき、指示を受けて動くロボット的なイメージ。
人によっては"GameMain"に相当する部分を"GameMgr(ゲームマネージャー)"みたいな名称にしてるかもね。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.041s