309.オブジェクトの方向の取得

 まずFullSample309を実行してみましょう。以下のような画面が出てきます。

 

図0309a

オブジェクトの方向とは

 コントローラーでプレイヤーを動かすと、プレイヤーの向いている方向が線で示されます。いわゆる姿勢と呼ばれることもあります。
 これはTransformコンポーネントから取得すできるGetForword()関数、GetUp()関数、GetRight()関数を使用しています。
 実装するにはまず、3方向のラインを構築します。ラインはActionLineクラスCharactor.h/cppに記述があります。
 ActionLineクラス開始位置と終了位置を引数に取るオブジェクトなので、GameStage::CreatePlayer()で以下のように気jyつします。
//プレイヤーの作成
void GameStage::CreatePlayer() {
    //プレーヤーの作成
    auto PlayerPtr = AddGameObject<Player>();
    //シェア配列にプレイヤーを追加
    SetSharedGameObject(L"Player", PlayerPtr);
    auto StartPos = PlayerPtr->GetComponent<Transform>()->GetPosition();
    auto EndPos = PlayerPtr->GetComponent<Transform>()->GetForword();
    EndPos += StartPos;
    auto LinePtr = AddGameObject<ActionLine>(StartPos,EndPos, Col4(1.0f, 1.0f, 0, 1.0f));
    //シェア配列に前方ラインを追加
    SetSharedGameObject(L"ForwordActionLine", LinePtr);

    EndPos = PlayerPtr->GetComponent<Transform>()->GetUp();
    EndPos += StartPos;
    LinePtr = AddGameObject<ActionLine>(StartPos, EndPos, Col4(1.0f, 0.0f, 0, 1.0f));
    //シェア配列に上方ラインを追加
    SetSharedGameObject(L"UpActionLine", LinePtr);

    EndPos = PlayerPtr->GetComponent<Transform>()->GetRight();
    EndPos += StartPos;
    LinePtr = AddGameObject<ActionLine>(StartPos, EndPos, Col4(0.0f, 0.0f, 1.0f, 1.0f));
    //シェア配列に右方ラインを追加
    SetSharedGameObject(L"RightActionLine", LinePtr);
}
 これで3方向のラインが作成されます。赤くなっているところが、3方向を取得する関数を使用しています。
 取得した方向に開始位置であるプレイヤー位置を加算して、実際のラインの初期パラメータを決定します。

ラインの更新

 プレイヤーは常に移動してますので、それに合わせてラインも移動させます。記述個所はPlayer::OnUpdate2()です。
void Player::OnUpdate2() {
    auto LinePtr = GetStage()->GetSharedGameObject<ActionLine>(L"ForwordActionLine");
    auto StartPos = GetComponent<Transform>()->GetPosition();
    auto EndPos = GetComponent<Transform>()->GetForword();
    EndPos += StartPos;
    LinePtr->ResetObject(StartPos, EndPos);
    LinePtr = GetStage()->GetSharedGameObject<ActionLine>(L"UpActionLine");
    EndPos = GetComponent<Transform>()->GetUp();
    EndPos += StartPos;
    LinePtr->ResetObject(StartPos, EndPos);
    LinePtr = GetStage()->GetSharedGameObject<ActionLine>(L"RightActionLine");
    EndPos = GetComponent<Transform>()->GetRight();
    EndPos += StartPos;
    LinePtr->ResetObject(StartPos, EndPos);
    //文字列の表示
    DrawStrings();
}
 このようにプレイヤーを追随するようにラインを変化させます。

オブジェクトの方向の利用

 このサンプルではラインの表示という形でわかりやすく表現していますが、この機能はいろんなところに使えます。
 例えば敵が自分の向いている方向にプレイヤーがいたら追いかけるのような処理にも使えます。この場合ラインのようなオブジェクトは使わずに、計算上で前項で紹介した線とオブジェクトの交差判定のような形で利用できますね。
 また、後ろ、下、左方向は、前、上、右方向-1.0fを掛ければ計算できます。