ブループリント通信プロジェクト

様々なブループリント通信方法を使って作成されたサンプル プロジェクト

Windows
MacOS
Linux

この ブループリント通信プロジェクト では、シンプルな射撃スタイルのゲームを作成します。プロジェクトではレベルからキャラクターへの通信方法に加えて、キャラクター情報の HUD への渡し方を学びます。終了時には、以下のようなプロジェクトが完成します。

この短いゲーム サンプルでは、プレイヤーがボタンを押すと、Character ブループリントの内部から被破壊スタティック メッシュがスポーンされます。岩のスポーン位置および起動位置は、レベル内に配置したスポーン地点からランダムに選択されているため、レベルから Character ブループリントへスポーン ポイントを伝達する必要があります。 Character ブループリントに格納された情報 (発射数または起動する岩の残数、発射あたりの残弾数、プレイヤーの得点) も受け取り、その情報を HUD に渡してスクリーン上に表示します。 このチュートリアルを修了すると、デベロッパーは次の手順を理解できます。

必要なアセットとキャラクターを設定する 射撃対象となる岩をスポーンする 情報をレベルからキャラクターに渡す 岩を破壊する *HUD と通信する このページでは、このガイドの後半で必要になるアセットの事前準備と設定を行います。被破壊スタティック メッシュを作成して、スポーン ポイントを配置し、基本的な HUD を作成して、ゲームの状態に関する情報をプレイヤーに表示します。

このガイドでは、[Starter Content (スターターコンテンツ)] 有りの Blueprint First Person テンプレートをベースにして新規プロジェクトを作成しています。テンプレートに基づいたプロジェクトの作成方法、またはスターター コンテンを有効にする方法については、プロジェクトの設定方法について説明している、「プロジェクトの新規作成」ドキュメントを参照してください。

作成したプロジェクトが開いている状態で、Ctrl+N を押して 新規レベル を作成し、ポップアップ ウィンドウでプロンプト表示されたら [Default (デフォルト)] を選択します。新しいレベルを作成できたら、以下のセクションに従って、必要な各アセットの設定を開始します。

1.必要なアセットを設定する

破壊スタティック メッシュを作成する

まず、弾が当たると破壊される射撃対象の岩を作成します。

  1. コンテンツ ブラウザ で、「Content/StarterContent/Props」フォルダを開きます。

  2. Props」フォルダの SM_Rock右クリック して [Create Destructible Mesh (被破壊メッシュの作成)] を選択します。

    CreateMesh.png

  3. SM_Rock_DM アセットを開いて、ツールバーから [Fracture Mesh (フラクチャ メッシュ)] ボタンをクリックします。

    FractureMesh.png

    プレビュー ウィンドウに岩が表示されない場合は、ウィンドウを閉じてから再度開いてください。

  4. SM_Rock_DM アセットを 保存 して終了します。

  5. SM_Rock_DM アセットを 右クリック して、[Asset Actions (アセットアクション)]>[Create Blueprint Using This...(これを使用してブループリントを作成)] を選択します。

    CreateBlueprint.png

    要求されたら、ブループリントに「BP_Rock」などの名前を付けます。

  6. ブループリントが開いたら、 [Add Component (コンポーネントの追加)] ボタンをクリックして、 Projectile Movement コンポーネントを追加します。

    AddProjectile.png

  7. Projectile Movement コンポーネントをクリックして、[Details (詳細)] パネルで Initial Speed (開始速度)Max Speed (最高速度)Velocity (速度)X1500.00 に設定します。

    ProjectileDetails.png

  8. Destructible コンポーネントを選択して、Collision[Details (詳細)] パネルで、[Simulation Generates Hit Events] オプションにチェックを入れます。

    GenerateHits.png

  9. [Compile (コンパイル)] ボタンと [Save (保存)] ボタンをクリックし、ブループリントを閉じます。

スポーン ポイントを配置する

次に、射撃対象となる岩を起動するためのスポーン ポイントをいくつかレベルに作成します。

  1. [Modes] メニューから [Target Point (ターゲット ポイント)] を検索してレベルに追加します。

    AddTargetPoint.png

  2. レベルでその ターゲット ポイント を選択し、[Transform (トランスフォーム)] を以下のように設定します。

    TargetPointTransform.png

    [X][Location][7.0m, 0.0m, 0.0m][Rotation][0.0, 40.0, 0.0] です。

    「7.0m」と入力すると、同じ値である「700cm」に値が変換される場合があります。Unreal 単位の算出方法の詳細と表示サイズの変更方法について説明している、仮想現実 (VR) ベスト プラクティス ページの「ワールドのスケーリング」を参照してください。

  3. レベル内で ターゲットポイント を選択して、ビューポートで Ctrl+W で複製し、新しく複製された [Details (詳細)] を以下のように設定します。

    Duplicate1.png

    この設定で、スポーン ポイントが最初のスポーン ポイントの左側に移動します。

  4. Ctrl+W を押して ターゲット ポイント を再度複製し、新しく複製されたターゲットポイントの [Details (詳細)] を以下の通りに設定します。

    NewDuplicate.png

  5. レベルで PlayerStart を選択し、E を押して Rotation モードにして、ターゲット ポイントの方を向くように回転させます。

    TargetPointsAdded.png

    これで、プレイヤー開始位置の向かい側に 3 つのスポーン ポイントが配置されます (コントローラ アイコンと方向が青い矢印で示されている)。

HUD を作成する

設定に必要な最後の要素は、情報を通信するための基本的な HUD の作成です。

  1. コンテンツ ブラウザ の空のスペースを 右クリック して [User Interface (ユーザー インターフェース)]>[Widget Blueprint (Wodget ブループリント)] を選択します。

    CreateWidgetBlueprint.png

    Widget ブループリント は、HUD エレメントを作成するために使用する アンリアル モーション グラフィックス (Unreal Motion Graphics) の UI と一緒に使うブループリントの一種です。

    詳細は UMG UI デザイナ を参照してください。

  2. プロンプトが表示されたら、HUD を呼び出して開きます。

  3. [Palette (パレット)] ウィンドウの[Panel (パネル)]水平ボックス[Hierarchy (階層)] ウィンドウの [CanvasPanel] にドラッグします。

    AddVerticalBox.png

    さらに、[Panel][Horizontal Box (水平ボックス)][Hierarchy] ウィンドウの [Vertical Box (垂直ボックス)] にドラッグします。

    AddHorizontalBox.png

  4. [Palette][Common] セクションで、2 つの Text ウィジェットを [Hierarchy] ウィンドウの 水平ボックス にドラッグします。

    AddTextBlocks.png

  5. [Hierarchy] ウィンドウの [Vertical Box] を選択します。次に、[Details] パネルで [Anchors] を選択し、下図のように選択します。

    AnchorSelected.png

    アンカー は、スクリーン サイズに関係なく、UI エレメントを指定位置に固定します (詳細は アンカー を参照してください)。

  6. Vertical Box を選択し、スクリーンの右側に移動させ、テキストが表示されるようにリサイズします。

    MovedWidget.png

  7. ボックス内の一番左に表示されているテキストをクリックし、[Details] パネルの [Text] に「Pulls:」と入力します。

    EnterText1.png

  8. もう片方のテキストには、Text フィールドに「10」と入力します。

    EnterText2.png

    このテキストが後に送信され、ゲームのステートに応じて更新されます。

  9. [Hierarchy] ウィンドウを 右クリック し、水平ボックスコピー して、垂直ボックス の上に貼り付けます。

  10. 垂直ボックス水平ボックス が 3 つ入り、テキストが以下のように表示されるまで、前のステップを繰り返します。

    AddedBoxes.png

  11. もう片方のテキスト フィールドも "Shots" ("3" に設定) と "Score" ("0" に設定) に更新して、[Compile] ボタンを押します。

    UpdateText.png

  12. コンパイル保存 してから、HUD Widget ブループリントを閉じます。

2.キャラクターを設定する

次は、このガイドの後半で HUD に渡す変数を追加して、Character ブループリントで操作します。条件を追加して、起動した 1 つの岩に対してプレイヤーが発射できる回数を定義します。

  1. コンテンツ ブラウザ[Content]>[FirstPersonBP]>[Blueprints] を選択して、First Person Character ブループリントを開きます。

    FirstPersonCharacter.png

  2. グラフの Stick InputMovement InputJump セクションを削除して、以下のセクションだけが残るようにします。

    CleanUp.png

    このサンプル ゲームで必要なのは、プレイヤーが振り向いて撃つことだけなので、その他のスクリプトは削除してブループリントを整理します。

  3. 再びグラフ内を 右クリック して、Event Begin Play ノードを検索して追加します。

    EventBeginPlay.png

  4. Event Being Play ノードを引き出して Create Widget ノードを検索して追加します。

    CreateWidget.png

    ゲームの再生開始時に HUD Widget ブループリントを呼びだし、それを表示します。

  5. Create Widget ノードの Class[HUD] を選択したら、Return Value を引き出して、Add to Viewport ノードを使用します。

    AddToViewport.png

    HUD が表示されるようになるので、HUD に渡す変数を作成する必要があります。ここで設定しておきましょう

  6. [MyBlueprint] ウィンドウの [Add Variable (変数を追加)] ボタンをクリックします。

    AddVariable.png

  7. 作成された変数を選択して [Details (詳細)] パネルで名前を「isActive」に変更し、Boolean 型であることを確認します。

    NewVariable1.png

  8. もう 1 つ変数を作成し、名前を「SpawnLocation」に変えて、Transform 型であることを確認します。

    NewVariable2.png

    この変数を使用してスポーン位置が岩に伝えられます。また、この変数はレベルから更新されます。

  9. もう 1 つ変数を作成し、名前を「Pulls」に変えて、Integer 型であることを確認します。

    NewVariable3.png

    この変数は、プレイヤーがボタンを押してスポーン可能な岩の残数を保持します。

  10. Integer 変数をあと 2 つ作成します。 1 つは「Shots」、もう 1 つを「Score」という名前にします。

    AllVariables.png

    追加した変数はこのようになります。

  11. [Compile (コンパイル)] ボタンをクリックしたら [Details (詳細)] パネルで [Pulls][Default Value (デフォルト値)]10 に設定します。

    DefaultValuePulls.png

  12. [Shots][Default Value]3、そして [Score]0 に設定します。

射撃武器を設定する

ここでは、プレイヤーが引き金を 1 回引くあたりの発射数を少し変更していきます。

  1. InputAction Fire event を見つけたら、それを引き出して Do N ノードを追加します。

    DoN.png

    このノードは後に続くスクリプトを設定回数実行します (プレイヤーの射撃回数を制御することができます)。

  2. N3 に設定したら、Alt を押したまま、それを [My Blueprint] ウィンドウから Shots 変数にドラッグし、ノードを再接続します。

    SetDoN.png

    Shots ノードの後に、SetMontage Play ノードに接続します。

  3. Control キーを押しながら、Shots 変数を再度ドラッグして、それを Integer - Integer ノード (1 に設定) に接続してから、以下のように接続します。

    ConnectShots.png

    ここで、Shots を Fire が 1 回押されるごとに 1 減る設定にします。

  4. Shots の横にあるグラフ内を 右クリック して、ResetShots という カスタム イベント を追加します。

    CreateCustomEvent.png

  5. Alt を押したまま Shots をドラッグして 3 に設定し、カスタム イベント、そして Do N ノードの Reset に接続します。

    ResetEventSet.png このカスタム イベントが呼ばれると、Shots の設定を 3 に戻し、Do N ノードがリセットされ、再度実行することができます。

3.射撃対象となる岩をスポーンする

次は、プレイヤーがボタンを押して射撃対象となる岩をスポーンできるロジックを設定します (ただし、他の条件が一致していることが条件となる)。レベル内にスポーン ポイントをいくつか定義しました。その中の 1 つを取得するために、イベント ディスパッチャー を使用して Level ブループリント (次のステップで作成) でイベントを実行して、これらの位置の 1 つを取得して Character ブループリントに送ります。

  1. FirstPersonCharacter ブループリント内で、グラフの空スペースの任意の場所を 右クリック して F Key Event を追加します。

    FKeyEvent.png

  2. B を押しながらグラフ内で 左クリック して、Branch ノードを作成します。

  3. Alt を押しながら isActive 変数をドラッグしてチェックボックスにチェックを入れて、以下のように接続します。

    BranchAdded.png

  4. Control を押しながら、isActive 変数と Pulls 変数をドラッグします。

  5. isActiveNOT Boolean ノード (true でない) に接続し、Pulls> ノード (0 に設定) に接続します。

    TwoNodesAdded.png

    古いバージョンのエンジンでは、NOT Boolean ノードは != ノードと扱われています。

  6. 上記の出力を 2 つとも And ノードに接続し、BranchCondition につなぎます。

    AndAdded.png

    ここで、IsActive 変数が true ではなく、プレイヤーの Pulls 数が 0 より大きいかどうかを確認することにより、プレイヤーが岩をスポーンできるかどうかを判断するロジックを設定します。両方のステートメントが true であれば、Branch ノードの True 側を処理して岩をスポーンします (スクリプトはまだ完全ではないので、以下で設定をします)。

  7. Alt を押しながら Pulls 変数をドラッグして Set IsActive ノードの次に接続します。

  8. Control を押しながら Pulls 変数をドラッグして Int - Int ノード (1 に設定) に接続し、さらに Set Pulls に接続します。

    PullsSet.png

  9. Compile をクリックし、Set Pulls ノードを引き出して ResetShots カスタム イベントを追加します。

    CallCustomEvent.png

    設定はこのようになっているはずです。

    ScriptBeforeEventDispatcher.png

    プレイヤーが岩をスポーンできる時に対するロジックはされました。次はスポーン位置を取得するためにレベルと通信する必要があります。F が押されると呼び出される イベントディスパッチャー を使って行います。Level ブループリント はイベントディスパッチャーをリッスンし、呼び出されると独自のイベントを実行してスポーン ポイントの 1 つの位置を取得し、それを Character ブループリントへ渡します。

  10. [My Blueprint] ウィンドウで [+ Event Dispatcher (イベントディスパッチャーを追加)] ボタンをクリックします。

    AddEventDispatcher.png

  11. 新しいイベントディスパッチャーをクリックして選択した状態で F2 を押して名前を「GetSpawnLocation」に変更します。

    RenameEventDispatcher.png

  12. Reset Shots 関数の次のグラフに、Call GetSpawnLocation ノードを追加します。

    CallEventDispatcher.png

    Event Dispatcher が追加されたことが、ノードの右上端に封筒のアイコンで表示されます。

    NewNodeAdded.png

  13. GetSpawnLocation ノードを引き出して Spawn Actor from Class ノードを追加します。

    SpawnActorNode.png

  14. Spawn Actor ノードの ClassBP_Rock に設定します。

  15. Spawn Actor ノードでも、SpawnLocation 変数を Spawn Transform ピンにドラッグ&ドロップします。

    SpawnActorComplete.png

    射撃対象となる岩をスポーンし、岩をスポーンする Transform 位置を受け取るように、Character ブループリントが設定されました。

4.情報をレベルからキャラクターに渡す

次に、Level ブループリント を使用して、Character ブループリントのイベント ディスパッチャーが呼び出された時に、スポーン ポイントの 1 つの位置を取得して、その情報を Character ブループリントに渡します (こうすることで、Character ブループリントから Level ブループリントとその逆という、双方向で情報を渡すことができます)。

  1. メイン ツールバーで [Blueprints] ボタンをクリックして、[Open Level Blueprint (Level ブループリントを開く)] を選択します。

    OpenLevelBlueprint.png

  2. グラフ内を 右クリック して、 Event Begin Play ノードと Get Player Character ノードを追加します。

    GetPlayerCharacter.png

  3. Get Player CharacterReturn Value を引き出して、 Cast To MyCharacter ノードを追加します。

    CastToNode.png

    ここで、 Cast ノードを使ってプレイヤー キャラクターを取得してから、そのプレイヤーが使用する Character ブループリントを取得します (この場合は FirstPersonCharacter が呼び出されて、プレイ可能なキャラクター用の他のスクリプトを設定します)。Cast ノードを使って、プレイヤー キャラクターのブループリントとその中の変数、イベント、関数へアクセスすることができます。

    Casting に関する詳細は、 ブループリントでキャストする のドキュメントをご覧ください。

  4. 以下のようにノードを接続し、 Cast To ノードの Return Value を引き出して、Promote to variable を選択します。

    PromoteToVariable.png

    プレイヤーが使用する FirstPersonCharacter ブループリントへのリファレンスを維持するための変数を作成して、Cast を毎回使わなくても済むようにします。Event Begin Play でこの処理をすると、後に時間が節約できます。

  5. 昇格した変数を選択して [Details (詳細)] パネルで名前を「MyCharacter」に変更し、Boolean 型であることを確認します。

    RenamedMyCharacter.png

  6. MyCharacter ノードの Return Value を引き出して、Assign Get Spawn Location を追加します。

    AssignSpawnLocation.png

    これが作成された イベント ディスパッチャー です。これを選択すると、ノードが 2 つ追加されます。

    リストにこのノードがない場合は、FirstPersonCharacter ブループリントで [Compile] を必ずクリックして、再度確認してみてください。

  7. Bind Event から新しく追加されたノードに接続していることを確認してください。

    ConnectAddedNodes.png

    GetSpawnLocation が Character ブループリント内で呼び出されると、この新規のカスタム イベントも呼び出されます。

  8. Control を押したまま [MyBlueprint] ウィンドウから MyCharacter 変数をドラッグして、Set Spawn Location ノードを追加します。

    SetSpawnLocation.png

  9. メインのエディタ ウィンドウに戻り、ワールド アウトライナーTarget Point を検索して 1 つずつ選択します。

    SelectAllTargetPoints.png

  10. Level ブループリント に戻り、グラフ内を 右クリック[Create References to 3 selected Actors (選択した 3 つのアクタにリファレンスを作成)] オプションを選びます。

    AddReferences.png

  11. グラフ内を 右クリック して、Make Array ノードを追加し、それぞれの Target Point へ接続します。

    MakeArray.png

    [Add Pin (ピンを追加)] ボタンをクリックすれば、ピンを追加することができます。この配列は、アクセス可能なターゲットポイントのコレクションを格納します。

  12. Array ピンを引き出して Get ノードを追加します。

  13. Get ノードを引き出して、Random Integer in Range ノードを追加し、[Min] を 0 に、[Max] を 2 に設定します。

    GetNodeAdded.png

    ここで、スポーン ポイントとして使用するために、ランダムにターゲットポイントを取得します。スポーン位置がもっと多い場合、それらを配列に追加して Range ノードの Random Integer の Max 値を増やせば、それらを含むことができます。

  14. Get ノードを引き出して Get Actor Transform ノードを追加し、それを Set Spawn Location ノードに接続します。

    スクリプト全体は上の画面のようになるはずです。クリックすると拡大表示されます。

5.岩を破壊する

このステップでは、プレイヤーが発砲した発射物にヒット岩が破壊されるようにします。これを行うためには別の Bind Event を使いますが、それはイベントディスパッチャーにはバインドされません。その代り、岩のコリジョンが何かにヒットすると実行される OnHit と呼ばれるコリジョン イベントを使います。まさにこの状況にぴったりです。

では、岩を破壊してみましょう!

  1. FirstPersonCharacter ブループリント内に戻り、岩をスポーンする Spawn Actor ノードを検索します。

  2. Spawn Actor ノードの Return Value ピンを引き出して、Assign On Actor Hit を選択します。

    OnActorHit.png

  3. Spawn ActorBind Event を接続します。

  4. Spawn Actor ノードの Return Value を引き出して、 Apply Radius Damage (Destructible) を追加します。

    ApplyDamage.png

    Apply Damage を使うこともできますが、パラメータの追加入力が必要です。ここでは簡単な方の Radius Damage を使います。

  5. Apply Radius Damage ノードの以下のフィールドにそれぞれ 50000 と入力し、 Get Actor Location ノードを接続します。

    EnterDamage.png

    これにより、岩を粉々にするのに十分なダメージを確実に与えることができます。

  6. Apply Radius Damage ノードの次に、 Set Score ノードを追加します。

  7. Control を押しながら Score 変数をドラッグして Int - Int ノード (1 に設定) に接続し、さらにノードに接続します。

    IncreaseScore.png

    これにより、現在の点数を取得し、岩にヒットするたびに 1 が追加されます。

  8. Bind EventSet Score ノードを Delay に接続して 3 秒に設定します。

    DelayNode.png

    (ヒットしたかどうかに関わらず) 岩がスポーンされた 3 秒後に、それを破壊します。

  9. Delay の次に Destroy Actor ノードを追加します。

    DestroyActor.png

    Spawn Actor ノードの Return Value ピンを引き出して、Destroy Actor ノードの Target へつなぎます。

  10. Destroy Actor ノードの次に Set isActive 変数ノードを追加して、チェックを入れないままにします。

    SetIsActive.png

    スポーンされた岩はアクティブではなくなったので、プレイヤーは (引き金を引ける残数が十分ある場合は) 別の岩をスポーンすることができます。

ゲームプレイの中核は設定できました。今エディタで再生すれば、レベル内のランダムなスポーン ポイントからスポーンされた岩をスポーンしたり、射撃して破壊することが確認できます。

  1. HUD と通信する

Cast を使ってプレイヤーの Character ブループリントにアクセスして、Character ブループリントにある値を HUD のプロパティにバインドすることにより、これらの値が Character ブループリントで更新されると自動的に更新されるようになります。

ゲームの完了まであと少しです。最後に HUD の更新をしてみましょう。

  1. 作成した HUD Widget ブループリントを開きます。

  2. HUD Widget ブループリントの [Graph] タブをクリックします。

    GraphClick.png

  3. グラフ内を 右クリック して、Event Construct ノードを追加します。

    EventConstruct.png

    このノードは Event Begin Play に似ていて、 Widget ブループリントが構築されると呼び出されます。

  4. Get Player Character ノードと CastTo FirstPersonCharacter ノードを追加します。

    CastToFirstPerson.png

  5. As First Person Character ピンを引き出して、 Promote to variable を選択し、新しいノード名を「MyCharacter」とします。

    MyCharacter.png

    変数を選択し F2 を押すと、My Blueprint ウィンドウで関数名の変更ができます。

  6. [Designer (デザイナ)] タブで、まず [Details (詳細)] パネルの横にある [Pulls]、次に [Text] の値をクリックしてから [Bind (バインド)] オプションをクリックします。

    Bind1.png

    すると、バインド用に新規グラフが開きます。

  7. Control を押した状態で MyCharacter 変数を Get Pulls へドラッグし、 Return NodeReturn Value へ接続します。

    GetPulls.png

    To Text (Int) 変換ノードが自動的に作成されます。次に Pulls 値が正しく表示されるように設定します。

  8. [Designer] タブで [Shots] の値をクリックし、[Details] パネルで [Bind] オプションをクリックし、以下のようにバインドします。

    GetShots.png

    発射 1 回あたりの残弾数が正確に更新および表されます。

  9. [Designer] タブで [Score] の値をクリックし、[Details] パネルで [Bind] オプションをクリックし、以下のようにバインドします。

    GetScore.png

    最後に、岩にヒットするとプレイヤーに対して得点を正しく取得して表示します。

  10. [Compile (コンパイル)][Save (保存)] をクリックし、ブループリントを閉じます。

  11. メイン エディタ ビューで、 [Play (プレイ)] ボタンをクリックしてエディタで再生します。

岩をスポーンするには、前のセクションでイベントにバインドしたように F を押します。このガイドでは、イベントディスパッチャーCast ノードと Binding を使って 3 つの異なるブループリント間での通信方法を学びます。プロジェクトではレベルから Character ブループリントの通信方法に加えて、キャラクターから情報の HUD への渡し方を学びます。

  1. 応用編

このプロジェクトを通じて学んだ知識を活かして、以下の操作をしてみましょう。

  • FirstPersonCharacter ブループリントで、一発目で岩にヒットした方が、二発目あるいは三発目よりも高い得点になるように設定する。

  • FirstPersonCharacter ブループリントで、岩がスポーンされるまでプレイヤーは撃つことができないように設定する。

  • レベルに、スポーン ポイントをあと 2 つ追加する (角、またはプレイヤーの左右)。

  • HUD に、プレイヤーが一発目でヒットした数を追跡するためのカテゴリを追加する。

本ガイドおよびエディタ全般に渡り取り扱ったトピックスに関しては、アンリアル エディタのマニュアル](Engine) をご覧ください。

このガイドのトピックに関連した情報は以下の通りです。

タグ
Select Skin
Light
Dark

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信