3Dゲームプログラミングとデザイン2番目の割り当て

3Dゲームプログラミングとデザイン2番目の割り当て

短い答え

  • ゲームオブジェクト(GameObjects)とリソース(アセット)の違いと接続について説明します。

    回答:

    • ゲームプログラム空間のゲームオブジェクトは、空(空、最も便利なもの)、2D、3D、ライト、カメラなどです。
    • ゲームリソース(アセット)、ゲームオブジェクトの構築、ゲームオブジェクトの装飾、ゲームオブジェクトとデータの構成。シリアル化またはストレージ形式のゲームオブジェクトまたはデータ

    ゲームオブジェクトとは、作成されたオブジェクト、および初期化中のライトとカメラを指します。ゲームリソースは、外部からインポートされたゲームオブジェクトまたは画像を作成できます。

    ゲームオブジェクトをゲームリソースにドラッグするとゲームリソースになり、ゲームリソースをインスタンス化するとゲームオブジェクトになります。

  • いくつかのゲームケースをダウンロードし、リソースとオブジェクト構成の構造を要約します(リソースのディレクトリ構成構造とゲームオブジェクトツリーの階層構造を参照)

    回答:

    ユニティハブの学習カタログには、学習してダウンロードするゲームサンプルがたくさんあります。分析用に2つ選択しました。

    • ここに画像の説明を挿入

      Unityで開くと、次のようにアセットディレクトリが表示されます。

      ここに画像の説明を挿入

      この図から、Assetsディレクトリの構造(属性構造)を確認できます。親フォルダには複数のサブフォルダが含まれ、同じまたは類似のファイルが同じフォルダに格納されています。各サブフォルダにもいくつかのサブファイルがあります。この階層構造から、リソースフォルダーは同じフォルダー内に同様の属性を持つリソースを配置すると結論付けることができます。

      ここに画像の説明を挿入

      プロジェクトのシーンのBlankScene開くと、オブジェクトの階層構造を確認できます。複数のオブジェクトに独自のサブオブジェクトがあり、これらのサブオブジェクトに独自のサブオブジェクトがあることを確認するのは難しくありません。親オブジェクトは、子オブジェクトで構成されています。すべてのオブジェクトはツリー形式で編成されます。

    • ゲームケースをいくつかダウンロードしたところ、オブジェクトの階層とアセットの階層が上記のケースと似ていることがわかりました。ここでは説明を拡大せず、その構造のスクリーンショットをすぐ下に配置します。

      • ゲーム紹介:

      ここに画像の説明を挿入

      • 資産の構造は次のとおりです。
      ここに画像の説明を挿入
      • オブジェクトの階層は次のとおりです。
      ここに画像の説明を挿入
  • デバッグステートメントを使用して、MonoBehaviourの基本的な動作またはイベントによってトリガーされる条件を確認するコードを記述します

    • 基本的な動作には、Awake()Start()Update()FixedUpdate()LateUpdate()が含まれます
    • 一般的なイベントには、OnGUI()OnDisable()OnEnable()があります。

    回答:

    最初にC#コードリソースを追加します。検証されたコードの内容は次のとおりです。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Test : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
            Debug.Log("Start");
        }
    
        // Update is called once per frame
        void Update()
        {
            Debug.Log("Update");
        }
    
        void FixedUpdate()
        {
            Debug.Log("FixedUpdate");
        }
    
        void LateUpdate()
        {
            Debug.Log("LateUpdate");
        }
    
        void Awake()
        {
            Debug.Log("Awake");
        }
    
        void OnGUI()
        {
            Debug.Log("OnGUI");
        }
    
        void OnDisable()
        {
            Debug.Log("OnDisable");
        }
    
        void OnEnable()
        {
            Debug.Log("OnEnable");
        }
    }
    
    

    次に、保存を開き、ユニティで再生をクリックして実行します。結果を次の図に示します。

    ここに画像の説明を挿入

    以下は、動作またはイベントの説明です。

    • Start():Update関数が呼び出される前に1回呼び出されます
    • Awake():インスタンスによってスクリプトが読み込まれるときに使用されます
    • Update():フレームごとに1回呼び出されます
    • FixedUpdate():固定タイムスライスごとに1回呼び出される
    • LateUpdate():Update関数が呼び出された後に呼び出されます
    • OnGUI():GUIを描画するときに呼び出されます
    • OnDisable():オブジェクトが使用できなくなったときに関数が呼び出されます
    • OnEnable():オブジェクトが使用可能になると、関数が呼び出されます
  • GameObject、Transform、Componentオブジェクトについて学ぶためのスクリプトマニュアルを見つける

    • 3つのオブジェクトの公式の説明をそれぞれ翻訳(説明)
    • 次の図で、テーブルオブジェクト(エンティティ)のプロパティ、テーブルの変換のプロパティ、およびテーブルのコンポーネントについて説明します
      • このトピックの要件は、ビジュアルグラフィカルプログラミングインターフェイスをUnity APIに関連付けることです。インスペクターパネルで各コンテンツを表示するときは、対応するAPIを知っている必要があります。
      • たとえば、テーブルのオブジェクトはGameObjectで、最初の選択ボックスはactiveSelfプロパティです。
    • UMLダイアグラムを使用して、3つの間の関係を記述します(描画にはUMLet 14.1.1スタンドアロンバージョンを使用してください)

    回答:

    1. GameObject:Unityシーンのすべてのエンティティの基本クラス(これは、Unityシーンのすべてのエンティティの基本クラスです)

      変形:オブジェクトの位置、回転、スケール(オブジェクトの位置、回転、サイズ)

      コンポーネント:GameObjectsに接続されたすべての基本クラス(これは、GameObjectsに接続されたすべての基本クラスです)

    2. ここに画像の説明を挿入

テーブルオブジェクトの属性:activeSelf属性、オブジェクトの名前、静的属性以下はTap、Layer、Prefab、Transformなどの属性です。

変換プロパティ:PositionはXYZ軸上のオブジェクトの位置を表し、RotationはXYZ方向のオブジェクトの回転角度を表し、ScaleはXYZ方向のオブジェクトのサイズを表します

テーブルコンポーネント:変換、メッシュフィルター、ボックスコライダー、メッシュレンダラー

3つの関係は、GameObjectとコンポーネントが1対多であること、つまり、GameObjectは複数のコンポーネントを持つことができることです。GameObjectとTransformは1対1の関係です。つまり、GameObjectはTransformに対応し、コンポーネントはTransformです。親クラスのTransformは、一種のコンポーネントです

  • リソースプリセット(プレハブ)とオブジェクトクローン(クローン)

    • プレハブの利点は何ですか?
    • プリセットとオブジェクトクローン(Unityオブジェクトのクローンまたはコピーまたはインスタンス化)の関係は何ですか?
    • テーブルプレハブを作成し、テーブルプレハブリソースをゲームオブジェクトにインスタンス化するコードを記述します。

    回答:

    1. プリセットは同じオブジェクトの多くをすばやくインスタンス化できるため、ワークロードを削減できます。プリセットの変更は、プリセットによって作成されたすべてのオブジェクトの変更と同じであるため、1つずつ変更する必要がなく、ワークロードも削減されます。

    2. プリセットを使用してオブジェクトを作成することは、プリセットから複製されたオブジェクトと同じです。プリセットを変更すると、そのプリセットによって作成されたすべてのオブジェクトが変更されます。ただし、それがクローンオブジェクトである場合、クローンオブジェクトは比較的独立しているため、相互に接続はなく、相互に影響を与えません。したがって、1つのクローンオブジェクトを変更しても、他のクローンオブジェクトは変更されません。

    3. 最初にTableオブジェクトを作成すると、完成した結果は次のようになります。

      ここに画像の説明を挿入

      完了したら、テーブルをアセットにドラッグしてプレハブリソースにします

      ここに画像の説明を挿入

      プレハブリソースになったら、最初に作成したゲームオブジェクトを削除して、シーンに2つのオブジェクト(ライトとカメラ)のみが存在するようにし、C#リソースを作成してコードを記述します。

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class NewBehaviourScript : MonoBehaviour
      {
          // Start is called before the first frame update
          public GameObject table;
      
          void Start()
          {
              Instantiate(table);
          }
      
          // Update is called once per frame
          void Update()
          {
              
          }
      }
      

      作成したC#コードを新しく作成したオブジェクトの部分に追加し、[再生]をクリックして実行を開始すると、結果は次のようになります。

      ここに画像の説明を挿入

      リソースがオブジェクトに正常にインスタンス化されていることがわかります

プログラミング練習、ミニゲーム

  • ゲームのコンテンツ:三目並べ、ローン計算機、シンプルな計算機など。

  • 技術的な制限:IMGUIのみがUI 構築できるようする

  • 割り当ての目的:

    • OnGUI()イベントを理解し、デバッグ機能を改善する
    • APIドキュメントを読み取る機能を改善する

    Tic Tac Toeプロジェクトを研究して作成しました。実験のスクリーンショットは次のとおりです。

ここに画像の説明を挿入

  • ゲームプロセスゲームは 2人のプレーヤーに分けられます。最初のプレーヤーは「X」、2番目のプレーヤーは「O」です。特定のプレーヤーの3つのピースが並んでいる場合、そのプレーヤーが勝ったことを示します。ボードがいっぱいでプレイヤーが勝てなかった場合は、「均等にプレイ」と表示されます。ゲーム中またはゲーム終了後にリセットできます。左側のリセットボタンをクリックするだけで、ボードがゼロにリセットされ、新しいゲームが始まります。

  • ゲームのフレームワーク:ゲームは主に、9つのボタンで構成されるチェス盤、挿入された背景画像、ボタンで構成されるリセットボタン、タグで構成されるゲーム名、およびゲームの最後に表示される結論で構成されます。

  • コードの説明:最初に2つのグローバル変数を設定します。int型のボード配列は3 * 3のチェス盤を表します。値が0の場合、位置は空です。値が1の場合、ここでプレイヤー1がチェスをプレイし、2の場合はプレイヤーを意味します2チェスはここでプレイされ、int型のステップ変数は、現在のチェスボードのプレイされたポジションの数を記録するために使用されます

    ここに画像の説明を挿入

    次に、ボードを初期化するためのinit()関数を含むstart()関数があり、これはボード配列をクリアし、ステップを0に設定します

    ここに画像の説明を挿入

    次にisWin()です。この関数は、誰かが勝ったかどうかを判断するために使用され、勝者を返します。誰も勝てなかった場合は、0を返します。

    ここに画像の説明を挿入

    次のステップはOnGUI()関数です。これは、上記の初期化を呼び出すか、誰かが勝ったかどうかを判断し、各チェスの動きを実行し、ゲームの名前と背景を表示するために使用されます。具体的なコードは次のとおりです。

    ここに画像の説明を挿入

    ここに画像の説明を挿入

  • 実験概要:この実験を通して、OnGUI関数の完成、ボタンとラベルの定義プロセスを学び、ゲーム実行中の各関数の実行順序と実行時間についても理解しました。団結してゲームをするのも便利だと思いました。

  • 完全な実験コードポータル

考える質問[オプション]

  • Microsoft XNAエンジンのGameオブジェクトは、ゲームループの詳細を保護し、一連の仮想メソッドを使用して後継者がそれらを完了することを可能にします。この設計を「テンプレートメソッドパターン」と呼びます。

    • なぜ「戦略モード」ではなく「テンプレート方式」モードなのですか?

    回答:

テンプレートメソッドモード:動作中のアルゴリズムのスケルトンを定義し、サブクラスへのいくつかのステップを遅らせます。テンプレートメソッドを使用すると、サブクラスは、アルゴリズムの構造を変更せずに、アルゴリズムの特定のステップを再定義できます。それは振る舞いのモードです。
戦略モード:一連のアルゴリズムを定義し、各アルゴリズムをカプセル化して、それらを互いに置き換えさせます。戦略モデルにより、アルゴリズムを使用する顧客に関係なくアルゴリズムを変更できます。オブジェクトの動作モードです。

戦略モードの欠点:

  • 戦略クラスの数は多いかもしれません。

  • すべての戦略クラスを公開する必要があります。

テンプレートメソッドパターンと戦略パターンの両方を使用して、高レベルのアルゴリズムと低レベルの実装の詳細を分離できます。どちらも、特定の実装の詳細とは関係なく、高レベルのアルゴリズムを再利用できます。さらに、戦略モードでは、特定の実装の詳細を高レベルのアルゴリズムの再利用から独立させることもできますが、追加の複雑さ、メモリ、および実行時間を犠牲にします。

参考デザインパターンのテンプレート方式モードと戦略モード

  • ゲームオブジェクトはツリー構造に編成され、各ノードはゲームオブジェクト(または番号)です。

    • 複合パターン(複合パターン/設計パターン)を説明してみてください。
    • BroadcastMessage()メソッドを使用して、メッセージを子オブジェクトに送信します。BroadcastMessage()の疑似コードを記述できますか?

    回答:

    1. 部分的全体パターンとも呼ばれる複合パターン(複合パターン)は、類似したオブジェクトのグループを単一のオブジェクトとして扱うために使用されます。組み合わせモードでは、オブジェクトをツリー構造に従って組み合わせます。これは、パーツレベルと全体レベルを表すために使用されます。このタイプのデザインパターンは構造パターンであり、オブジェクトグループのツリー構造を作成します。このパターンは、独自のオブジェクトグループを含むクラスを作成します。このクラスは、同じオブジェクトグループを変更する方法を提供します。

    2. // father
      void Start () {
         	this.BroadcastMessage("Mes");
      }
      
      // son
      void Mes(){
         	Debug.Log ("Son");
      }
      
  • ゲームオブジェクトは、さまざまな側面の特性を記述するために多くの部分を使用します。Tankゲームオブジェクトは、GameObjectオブジェクトから継承するのではなく、一連の動作コンポーネントをGameObjectに追加するように設計します。

    • これはどんなデザインパターンですか?
    • 特別なゲームオブジェクトを継承してデザインしてみませんか?

    回答:

    1. 組み合わせモード
    2. 不足しているものを直接追加すると、オブジェクトのプロパティを簡単に調整できます。そうしないと、無駄になる可能性があります

おすすめ

転載: blog.csdn.net/qq_43267773/article/details/108725590
おすすめ