Update メソッド内の処理が、
適切な位置で return され、不要な処理が動かないように制御されています。
このような形で return を上手く活用すると、if 文によるネストを浅く出来ます。
仮に、もしも追跡中だったら、という if 文で処理を書く形を見てみましょう。
private void Update()
{
// NavMeshAgent が取得できない、あるいは移動先の対象が設定されていない場合
if (!agent || !target)
{
// 処理を行わない(エラーが出てしまうため)
return;
}
// このオブジェクトと移動先の対象までの距離を計算(どちらの計算方法でもよいが、sqrMagnitude の方が処理が早い)
//float distanceToPlayer = Vector3.Distance(transform.position, target.position);
float distanceToPlayer = (transform.position - target.position).sqrMagnitude;
// どの位離れているかを表示
Debug.Log("対象までの距離 : " + distanceToPlayer);
if (isChasing)
{
// 対象が視界に入った場合(距離が近い場合)
if (distanceToPlayer <= sightRange)
{
// 対象の位置を移動目標地点に設定
// Update メソッド内で実行しているので、対象が移動すると、目標地点も更新されるので追跡する
agent.SetDestination(target.position);
}
else
{
// 対象が視界外の場合(距離が遠い場合)、スタート地点に戻る
agent.SetDestination(originalDestination);
}
}
else
{
// 追跡中ではない場合、移動を停止する
agent.ResetPath();
}
}
追跡するか、否かを判断する前に計算処理をしていたり、if 文内にさらに if 文を作って追跡時の処理を書いているので、
if 文のネストが深く、また範囲が広く読みにくくなっています。
分岐処理を作成する場合には、true であったときに処理を動かした方がよいのか、false として処理を止めるようにした方がよいのか
両方の視点を持って作っていくように心がけましょう。
コーディングスキルを上達させるコツの1つです。
このような視点を手に入れられないと、いつまでも同じ形式の分岐処理しか作れないため、スキルアップに繋がりません。