対象のオブジェクトがキャラクターの視界に入った時だけ処理をする方法

Unity
2020年08月01日

ゾンビやモンスターがダンジョンを巡回し、そこにプレイヤーが視界に入ったらプレイヤーを追いかけるみたいな処理をやってみたい。時もある。。。
と、いうことでちょっとやってみました。

obj01をプレイヤーとして、以下のコードを書いてみます。

  public GameObject obj01;
  // Start is called before the first frame update
  void Start()
  {

  }

  // Update is called once per frame
  void Update()
  {
    var diff = obj01.transform.position – transform.position;
    var axis = Vector3.Cross(transform.forward, diff);
    var angle = Vector3.Angle(transform.forward, diff) * (axis.y < 0 ? -1 : 1);     if (angle <= 70.0f && angle >= -70.0f)
    {
    // ray cast
      RaycastHit hit;
      Vector3 temp = obj01.transform.position – this.transform.position;
      Vector3 normal = temp.normalized;
      if (Physics.Raycast(this.transform.position, normal, out hit, 50))
      {
        if (hit.transform.gameObject == obj01)
        {
          // 対象のオブジェクトが視界に入った時の処理
        }
        else
        {
          // 対象のオブジェクトが視界にキャラクターとオブジェクトの間に障害物がある時の処理
        }
      }
    }
    else
    {
      // 対象のオブジェクトが視界に入っていない時の処理
    }
  }

上記のコードをゾンビ側のセットします。
「(angle <= 70.0f && angle >= -70.0f)」をゾンビが見ることのできる視界の範囲とします。
この範囲に対象となるオブジェクトが入るとraycastを飛ばします。
しかし、ゾンビとオブジェクトの間に障害物があると、処理を分けます。
これで、視界の範囲に入って、尚且つ間に障害物が無い時だけ、処理を走らせることができます。

サンプルをちょっとWebGLでビルドしてみました(・。・;
対象のオブジェクトが視界に入った時だけ色を変えてみる

サンプルでは、画面中央にあるしょうもないオブジェクトがゾンビになります。
その周りを仮想プレイヤーになるしょうもないオブジェクトが周回します。

ゾンビの見える範囲にプレイヤーが入り尚且つ障害物が間に無ければ、ゾンビの色が変わる処理を入れています。