【Unity】敵が音と目視でプレイヤーを発見する

投稿者: | 2020-11-17

敵がプレイヤーを見ているときにゲージを上げて、満タンになったらプレイヤーを追尾し始めます。距離によってゲージの上がり具合を変えます。

また、プレイヤーが走っていてもゲージが上がります。

【Unity】敵がプレイヤーに気づいて追尾する #2のスクリプトを修正しました。敵の頭からプレイヤーの頭へレイを飛ばすので、それらのトランスフォームを取得して、方向ベクトルや距離を計算します。

Transform head;
Transform playerHead;

// Start()
head = transform.GetChild(0).GetChild(0).GetChild(2).GetChild(0).GetChild(0).GetChild(0);
playerHead = Camera.main.transform;

// Update()
Vector3 headToPlayerDir = playerHead.position - head.position;
float distanceFromPlayer = Vector3.Magnitude(headToPlayerDir);

レイを投げてプレイヤーの頭に当たったら内積を計算して、視界の範囲内ならゲージの増加分に値を入れます。この時内積をかけ合わせることで、プレイヤーが視界の中央よりに見えているときは増加分が大きく、端の方ではあまり増加しないようにしています。

float increaseAttention = 0f;

//レイが当たった時
headToPlayerDir = Vector3.Normalize(headToPlayerDir);
float dot = Vector3.Dot(headToPlayerDir, head.forward);

if (dot > 0)
{
    increaseAttention += 0.05f * dot;
    text.text = "A:見えている";
}
else
{
    text.text = "A:見えていない";
}

近くで見えていても視界の端にいるときは少ししか上昇しません。

距離が少し遠くなっても、視界の中央に近いと急激に上昇します。

プレイヤーが走っているときにも増加分を上げます。

// プレイヤーが走っていないとき
if (sc_fps.GetIsWalking())
{
    text.text += "\nP:走っていない";
                     
}
// プレイヤーが走っているとき
else
{
    text.text += "\nP:走っている";
    increaseAttention += 0.03f; // ゲージの増加分を上げる
}

そして、距離によって増加分が減少するようにしました。10メートル以内だと1をかけて、それより遠いと距離に応じて1より小さな値をかけます。

increaseAttention *= Mathf.Clamp(10f / distanceFromPlayer, 0f,1f);

冒頭のGifでは、プレイヤーが敵に遠くから見られているときは緩やかにゲージが上昇して、近くだと急上昇します。

ゲージが満タンになると追尾を初めます。

プレイヤーが見を隠すとゲージが1未満に下がって、敵はプレイヤーを見失います。敵はとりあえずプレイヤーを最後に見たところへ向かいます。

また、敵が遠くにいる時に走ってもほとんど上昇しません。

近くで走ると急上昇します。

最後に増加分をゲージに加えた後、減少分も加えます。増加分がこの減少分より小さければゲージは下がります。

attention += increaseAttention;
attention -= 0.007f; // ゲージを下げる
attention = Mathf.Clamp(attention, 0f,1f); // 0~1に固定

コメントを残す

メールアドレスが公開されることはありません。