主なコンテンツ

〜主なコンテンツ〜

1. Unityで製作したゲームと製作Tips
  1. 三月精チャレンジ(東方Project二次創作)
    1. 作り方
  2. 英語学習2D(オリジナルスマホアプリ)
2. UE4
3. ゲームアプリ見学
4. Bitbucket & SourceTreeでの一連の流れ
  1. 前半
  2. 後半
5. Tips
  1. UnityのTips
  5. SQL文のTips
  6. Final IK
  7. GearVR+Unity

2022年12月18日日曜日

36. Retargeting Animations

 いらっしゃいませ。


いくつかのアニメーションがありますが、まだいくつか必要です。


そのため、Maximo からいくつかのアニメーションを取得し、それらをエピックに再ターゲットすることを検討します。


スケルトンを作成して、キャラクターに使用できるようにします。


最初に、無料のアニメーションについて Maximo を調べます。


ここでは、無料のアニメーションのもう 1 つの優れたソースである Maximo を紹介します。


Maximo に初めてアクセスする場合は、無料で Maximo のログインを作成できるように、ログインが必要です。


まだお済みでない場合は、無料でサインアップしてからログインしてください。


ログインしたら、使用するキャラクターを選択する必要があります。


これらのいずれかを選択できますが、Epic Games のマネキンに似ているため、これを選択します。


ここで、エピック スケルトンがポーズをとっている A ポーズではなく、T ポーズになっていることがわかります。


しかし、これについては後ほど説明します。


使用したいキャラクターを選択したら、ダウンロードすることができます。


ダウンロードをクリックすると、ダウンロードと FBA フォーマットが必要になり、T シャツのポーズのままにしておくことができます。


それでは、ダウンロードをクリックしてみましょう。ダウンロードが完了すると、ダウンロード フォルダに FBA が表示されます。


これを Unreal Learning Kit プロジェクトに追加します。


これが私のプロジェクトで、ここにアニメーション スターター パックがあります。


Maximo アニメーション用に別のフォルダーを作成するので、単純にこのフォルダーを Maximo と呼びます。


Maximo フォルダー内に、Character という名前の新しいフォルダーを作成します。


そして、ここでそのキャラクターをインポートできます。


だからここにこの名前がついた。


Maximo Character に名前を変更します。 この Maximo Character.fbx をインポートします。


[インポートの追加] をクリックします。 [ゲーム/マキシモ/キャラクター]にインポートします。


ダウンロード フォルダでその FBX を見つけて [開く] をクリックすると、いくつかのオプションが表示されます。


次に、骨格メッシュをインポートします。この FBX には独自の骨格があるため、骨格は選択しません。


そのため、[すべてインポート] をクリックすると、スムージング グループ情報が見つからないというエラーが表示されます。


これは一般的です。


これは、このアセットにスムージング グループ情報がないためです。


大丈夫。


X をクリックします。この Maximo キャラクターが表示され、独自の Maximo キャラクター スケルトンがあることがわかります。


このスケルトンを見ると、スケルトンが Epic Games のスケルトンに似ていることがわかりますが、階層と名前が少し異なります。


したがって、アニメーションをリターゲットするときは、それを考慮する必要があります。


これで、メッシュとスケルトンとマテリアルをすべてキャラクタ フォルダに保存します。


Maximo では、右クリックして新しいフォルダーを作成し、このフォルダーを animations と呼びます。


これで、いくつかの Maximo アニメーションをダウンロードして、ここに配置できます。


Maximo では、アニメーションをクリックします。


さて、ダウンロードしたこのキャラクターを使うことが重要です。


すべてのアニメーションは、この特定のキャラクターにリギングされます。


必要なアニメーションがいくつかあります。


1 つは、その場で回転するアニメーションが必要なことです。


Turn Right を検索します。


そして、回転アニメーションがたくさんあります。


しかし、必要なものは揃っています。


たとえば、右回転と呼ばれるものを選択すると、キャラクターがその場で回転していることに気付くでしょう。


しかし、私たちはこれを望んでいません。


キャラクターを独自のコード ロジックで変換したいので、そのロジックは使用できません。


しかし、ここで右折のアニメーションが表示されていることに注意してください。


これはしゃがんでいるもので、これは所定の位置にあります。


実際にキャラクターを回転させるのではなく、アニメーションを再生しているだけです。


だから私はこれをダウンロードすることができます。


[ダウンロード] をクリックします。FBX 形式とスキンをダウンロードする必要があります。


使用しているキャラクターにリギングされるように、スキンと一緒にダウンロードすることが重要です。


1 秒あたりのフレーム数を 30 のままにし、キーフレームの削減をなしにして、[ダウンロード] をクリックします。 これで、ダウンロード フォルダに右折アニメーションができました。

34. Assets, 35. Retargeting Animations in Unreal Engine 5

 (前略)

今、私は Epic Games Launcher にいます。「ミリタリー ウェポン シルバー」を検索します。


そして、大量の武器を含む無料のアセット パックがあります。


それは「軍事兵器、銀」と呼ばれ、無料のコレクションにあります。


また、無料コレクションから削除する予定はありません。


いくつかの異なる武器アセットが含まれており、これらの武器ごとにパーティクル システムとサウンドも含まれているため、これは素晴らしいことです。


したがって、これは素晴らしいスターティング パックです。


さて、このサイド パックから始める理由は、サポートされているエンジン バージョンが 4.4 から 4.21 までしかリストされておらず、Unreal Engine 5 を使用していることに気付くからです。


では、これらをどのように使用するのでしょうか。


さて、これをアンリアル エンジン 5 プロジェクトに組み込む方法をお見せしたいと思います。


これは非常に優れたスキルであり、Unreal Engine の 5 つのプロジェクトにアセットを追加する際の選択肢が増えます。


これらのアセットをプロジェクトで提供したいのですが、そうするライセンスがありません。


そのため、これをプロジェクトに追加する方法を説明する必要があります。


これで、Unreal Engine の任意のバージョンと互換性のあるアセットを追加できるようになります。


Unreal Engine バージョン 4.21 が必要であることがわかりました。これにより、ライブラリにアクセスして Unreal Engine バージョン 4.21 をインストールできます。


すでにここにあることがわかります。


ハードディスクの容量が限られている場合は、マーケットプレイスや他の場所から他の武器アセットを選択して、問題なくフォローできます。


しかし、4.21 とのみ互換性のあるアセットを Unreal Engine の 5 つのプロジェクトに取り込む方法を紹介します。


そこで、4.21 プロジェクトを作成します。


4.21 をローンチし、新しいプロジェクトを選択します。これを青写真プロジェクトとして維持します。


また、開始コンテンツは必要ないため、空白を選択できます。


ここで、このフォルダを選択して、Blaster プロジェクトのすぐ隣に貼り付けます。


そのフォルダを選択し、これを UE4_Assets と呼びます。 そしてプロジェクトを作成します。


これが私の Unreal Engine 4.21 プロジェクトです。


これで完全に空になりました。このプロジェクトに [軍用武器、シルバー アセット] を追加します。


だから私は市場に戻ってきました。


これが軍用武器、シルバー アセット パックです。


[プロジェクトに追加] をクリックします。


さて、アセット 4.21 プロジェクトの UI です。


それを選択して、[プロジェクトに追加] をクリックします。


それが完了したら、私のプロジェクトに追加して、ここに軍用武器のシルバーを置きます。


また、ここにすべてのアセットを表示するショーケース レベルが付属しています。


アサルトライフル、ピストル、スナイパーライフル、ロケットランチャー、ショットガン、グレネードランチャーがあります。


これで、これらのすべてをプロジェクトで使用できます。


だからこれは素晴らしいです。


これらを Unreal Engine の 5 つのプロジェクトに移行したいと思います。 これは、コンテンツ フォルダの下にあるミリタリー ウェポン シルバーを右クリックして、[移行] を選択することで簡単に実行できます。


移行するすべてのアセットが表示されます。


[OK] をクリックして Blaster プロジェクトに戻り、コンテンツ フォルダーを選択します。


アセットをいつ移行しているのかわからない場合は、アセットをコンテンツ フォルダーに移行する必要があります。


他のフォルダを選択できます。


そのフォルダを選択すると、コンテンツの移行が正常に完了したことがわかります。


しかし、これらの資産を手に入れたので、いくつかの環境を追加する準備が整いました。

これで、さらにアセットを追加する準備が整いました。


そして、環境とキャラクターを含む Unreal Learning Kit を追加したいと思います。


それでは、Unreal Engine 4 プロジェクトを閉じます。

2022年12月13日火曜日

28. On Unreal Engine Versions、29. Project Creation

Unreal Engine のバージョンに関する注意 - [リソース] タブからプラグインをダウンロードする場合:


Unreal Engine 5.0 の公式リリース (Preview または Early Access ではない) を使用している場合は、Plugin - Unreal Engine 5.zip というファイルをダウンロードします。 このバージョンは、Unreal Engine 4.27 および Preview 1 と 2 でも動作します。


Unreal Engine 5.1 を使用している場合は、Plugin for 5.1.zip をダウンロードします。

2022年12月10日土曜日

27. Polishing the Menu Subsystem

 このビデオへようこそ。


いくつかのことを磨いて、メニュー システムを完成させます。


ホスティングが常に可能であることを確認したいと思います。


そのため、メニューが何を行っているかを見て、それが事実であることを確認できるようにします.


また、簡単にゲームを終了できるように、クイック ゲーム ボタンをメニューに追加します。 また、メニュー ボタンをクリックしたら無効にして、セッションが作成される前に複数のセッションを作成しようとしないようにします。


それでは始めましょう。


まず、セッションが既に作成されている場合に、セッションをホストすることに注意しましょう。


いくつかのテストを行っている場合は、小さな問題に気付いたかもしれません。


別のマシンでセッションを実行していて、このマシンから参加をクリックして参加するとします。


そして今、私はこのゲームセッションにいます。


ここで、ホスト プレイヤーがゲームを終了することですべてのプレイヤーをキックすることを決定したとしましょう。


そのため、他のマシンのテスターはゲームを終了し、メイン メニューに戻ります。


だから私はメインメニューに戻ってきました。


自分のゲーム セッションをホストできるようにしたいのですが、ホスト ボタンをクリックすると、ゲーム セッションの作成に失敗したことがわかります。


しかし、ここに面白いことがあります。


ほんの数秒待ってからもう一度ホストをクリックすると、ホスティングされます。


それで、ここで何が起こっているのですか?


それでは、コードを見てみましょう。


私は multiplayerSessionSubsystem.cpp にいます。 下にスクロールして createSession に移動します。 既存のセッションがあるかどうかを確認していることがわかります。存在する場合は、destroySession を呼び出します。


しかし問題は、destroy session を呼び出した直後に、create session を呼び出すことです。


Destroy Session が呼び出されましたが、その情報がネットワークを介してサーバーに移動し、そのセッションが破棄されるまでには時間がかかります。


そのため、Create Session をすぐに呼び出すと、セッションがまだ破棄されていない可能性があります。


その場合、セッションの作成に失敗します。


したがって、新しいセッションを作成する前に、セッションを破棄するアクションが完了していることを確認する必要があります。


幸いなことに、サブシステムでのセッションの破棄を含め、これらすべてのセッション アクションに対していくつかの関数とコールバックを作成しました。


現在使用していない destroySession 関数を作成しました。 また、sessionInterface にデリゲート リストを追加できるデリゲートもあります。


この destroySession 関数は、実際にはデリゲートにバインドされています。


コンストラクターに戻ると、destroySessionCcompleteDelegate があり、onDestroySessionComplete 関数がこれにバインドされていることがわかります。


そのため、セッション インターフェイスに直接アクセスして destroy session を呼び出すのではなく、destroy session 関数を実装し、create session で使用する必要があります。


サブシステム関数 destroySession でこの呼び出しを処理する必要があります。


これが完了したら、onDestroySessionComplete コールバック関数で反応し、そこで関数を作成できます。


したがって、新しいセッションを作成していて、セッションが既に存在する場合、ここでサブシステム関数で createSession を呼び出すと、失敗するセッションを作成することがわかります。


失敗することがわかっているので、セッションとコールバック onDestroySessionComplete を作成できます。


ただし、セッションをホストしていることがわかっている場合にのみ、そのコールバックでセッションを作成したいと考えています。


したがって、いくつかの変数を作成することで、これを簡単に行うことができます。


multiplayerSessionSubsystem.h に戻り、ここの一番下にいくつかのプライベート変数を追加します。


まず、ブール値を作成したいと思います。これを bCreateSessionOnDestroy と呼びます。


ここでは false で初期化します。


そして、セッションが破棄されたときに、これとコールバックを確認します。


真であれば、新しいセッションを作成します。


ここで、セッションが既に存在するためにセッションの作成が失敗することがわかっている場合は、新しいセッションに関する情報を保存する必要があります。


開いている公開接続の数とマッチ タイプを作成したいと考えています。


この情報が必要な理由は、ここで Create Session を呼び出すと、開いているパブリック接続の数とマッチ タイプを渡す必要があるためです。


したがって、作成に失敗した最後のセッション用にこれらを保存します。


そこで、最後の NumPublicConnections という名前の int32 型のメンバー変数を作成します。 LastMatchType という名前の FString を作成します。 ここでこれらを CPP ファイルに設定し、セッションを作成できます。


したがって、Destroy Session を呼び出しているところでは、その情報を保存する必要があります。セッションが既に存在するため、セッションの作成に失敗するからです。


そして、destroy session コールバックで、Create Session を再度呼び出します。


ここで、既存のセッションが null ポインターでない場合は、最初にブール値の createSessionOnDestroy を true に設定します。 次に、パブリック接続の数と lastNumPubliCconnections を保存し、それを NumPublicConnections に等しく設定します。


したがって、numPublicConnections.

また、そのマッチ タイプも保存します。


したがって、lastMatchType は matchType と等しいと言えます。


ここで、セッション インターフェイスで直接 destroySession を呼び出しています。


しかし、ヘッダー ファイルで使用するサブシステムで定義した destroySession 関数を呼び出したいと思います。


上にスクロールすると、destroySession が入力パラメータを取らないことがわかります。


したがって、ここの createSession では、既存のセッションが既に存在する場合は、単純に DestroySession を呼び出します。

2022年12月4日日曜日

23. Tracking Incoming Players

 いらっしゃいませ。


このレクチャーでは、ゲームに入ってくるプレーヤーを追跡できるように、ゲーム モードを作成します。


そうすれば、参加したプレーヤーの数を追跡する実行中のプレーヤー数を出力できます。


後で、このプレイヤー数を使用して、ロビーから実際の試合に移行する必要があるかどうかを判断できます。


これを行う方法は、ゲームの状態を使用することです。


マルチプレイヤーに関して非常に重要な 2 つのクラスは、ゲーム モードとゲーム ステートです。


ゲームモードは、ゲームのすべてのルールを維持するために存在します。


これには、プレイヤーを新しいレベルに移動するタイミングやスポーン場所の選択方法など、ゲームに応じてさまざまなことが含まれます。


ゲーム モードには、プレイヤーがいつゲームに参加したか、いつゲームから離れたかを追跡するのに役立つ、いくつかの継承された関数があります。


ポスト ログインは、プレイヤーがゲームに参加し、そのプレイヤー コントローラーにアクセスできるたびに呼び出される、継承された仮想関数です。


ログアウト関数は、プレイヤーがゲームを離れたときに呼び出され、再びコントローラーとこの関数にもアクセスできます。


GAME STATE は、ゲームに関する状態情報を保持するように設計されています。


クライアントは GAME STATE にアクセスして、この情報を取得できます。


これは、スコアや勝利数などの特定のプレイヤーに関する状態情報ではなく、ゲームの状態情報を保持するように設計されたクラスです。


Game State にはプレイヤーの状態の配列が含まれており、プレイヤーの状態クラスは、スコア カウントなどのプレイヤー固有の情報を保持するように設計されています。


ゲームモードはゲームの状態にアクセスできるため、この配列のプレーヤーの状態を取得し、この配列のサイズをチェックすることでゲームに参加しているプレーヤーの数を確認できます。


これが私たちがやろうとしていることです。


まず、プロジェクトのゲーム モードを作成しましょう。

2022年12月3日土曜日

22. Join Sessions from the Menu

 いらっしゃいませ。


このレクチャーでは、新しいコールバック システムを使用して、メニューからセッションを見つけて参加します。


それでは、まずセッションの検索に取り組みましょう。


これが menu.cpp です。Join Button Collect と呼ばれる参加ボタンのコールバックに進みます。


今は単純にメッセージを画面に出力していますが、この結合されたボタンの収集が機能することがわかっているので、そのメッセージは必要ありません。


必要なのは、アクティブなゲーム セッションを見つけることです。


したがって、サブシステム関数 find sessions を呼び出す必要があります。


そのため、最初にマルチプレイヤー セッション サブシステムが有効かどうかを確認し、次に multiplayerSessionsSubsystem-> findSessions を呼び出します。


これには init32 が必要であることがわかります。


それは最大です。


の検索結果。


ここでも、80 の Steam 開発 ID を使用しています。


そのため、同じ開発能力を使用している他の人々によって作成された多くのセッションが行われている可能性があります。


したがって、10,000 などの高い値を使用します。


現在、おそらく 10,000 セッションは見つかりませんが、多数のセッションがある場合は、すべてのセッションを見つけることができます。


このようにして、これらのセッションのいずれかがゲームに有効かどうかを確認できます。


現在、multiplayerSessionsSubsystem->findSessions 関数は現在空です。


multiplayerSessionsSubsystem.cpp に戻り、セッション検索機能に進みましょう。


そして、ここにあります。


現在何もしていないので、findSessions が必要です。


ここで、キャラクター クラスに戻り、それをどのように行ったかを思い出します。


この menuSystemCharacter.cpp では、createGameSession を最小化して、joinGameSession 関数を確認できるようにします。


ここで、ゲーム セッションに参加するブループリント、呼び出し可能な関数を作成したことを思い出してください。次に、定義済みのセッションを呼び出します。ここで、これと同様のことを行います。


セッションインターフェイスを使用します。


したがって、そのポインターが有効であることを確認する必要があります。


ここでは、multiplayerSessions,Subsystem.cpp で、最初にセッション インターフェイスを確認します。


したがって、sessionInterface.IsValid ではないかどうかを判断します。


有効でない場合は戻ります。


キャラクター クラスに戻ると、findSessionsCompleteDelegate をセッション インターフェイス デリゲート リストに追加したことがわかります。


だから私たちはそれをしたいと思うでしょう。


サブシステムに戻りますが、sessionInterface->AddOnFindSessionsCompleteDelegate_Handle と言うと、パスして findSessionsCompleteDelegate になります。


これらを混同しないようにしましょう。


これは作成したデリゲートではありません。


これは、sessionInterface およびデリゲート リストのデリゲートです。


プライベート セクションまでスクロールすると、findSessionsCcompleteDelegate があることがわかります。


これは、オンライン セッション インターフェイスのデリゲート リストに追加するデリゲートです。


cpp ファイルに戻り、それを渡します。


繰り返しますが、これはハンドルを返し、デリゲートします。このためのハンドルを作成しました。


デリゲート ハンドル findSessionsCompleteDelegateHandle は十分にあります。


それを使用します。


したがって、セッション検索を追加すると、完全なデリゲート ハンドルは、セッション検索用のデリゲート ハンドルに入力するために使用できる値を返します。


このデリゲートをオンライン セッション インターフェイスのデリゲート リストに追加したので、find sessions を呼び出す準備ができました。


Character クラスに戻ると、findSessions を呼び出すには、onlineSessionSearch が必要であることがわかります。


これらはいくつかの searchSettings であり、characte でこの sessionSearch メンバー変数を作成したことを思い出してください。これは FOnlineSessionSearch をラップする TSharedPointer でした。


ここのサブシステムでそのための変数が必要になります。


そこで、multiplayerSessionSubsystem.h で、それをプライベート セクションに追加します。


TSharedPointer になり、FOnlineSessionSearch になります。


これをチェックして最後のセッション検索を確認できるため、これを lastSessionSearch と呼びます。


このメンバ変数は単なるポインタであり、新しいセッション検索を作成することで有効なデータを実際に入力できます。


したがって、lastSessionSearch = makeShareable とします。


そして、EFOnlineSessionSearch で NEW キーワードを使用して作成します。


Character クラスに戻ると、MaxSearchResults があることがわかります。


しかし、サブシステムの find sessions という関数では、これを入力パラメーターとして設定し、メニュー クラスから find sessions を呼び出したときにそれを渡したので、この値を使用して maxSearchResults を簡単に設定できます。


したがって、lastSessionSearch->MaxSearchResults = maxSearchResults とします。


だからMaxSearchResults。


Character クラスに戻ると、bIsLanQuery を設定し、SEARCH_PRESENCE を true に設定していることがわかります。


まず、bIsLanQuery です。 lastSessionSearch->bIsLanQuery とします。セッションを作成したときと同じように、null サブシステムを使用しているかどうかに基づいて、これを true または false に設定したいと思います。