敵がプレイヤーを見ているときにゲージを上げて、満タンになったらプレイヤーを追尾し始めます。距離によってゲージの上がり具合を変えます。
また、プレイヤーが走っていてもゲージが上がります。
【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に固定