Tutti Lab

元シリコンバレー在住のおっさん技術者、モバイルVRアプリ開発に挑戦中

陰影表示の際のOnBecameVisibleとOnBecameInvisibleについて

現在開発中のアプリで、OnBecameVisible(), OnBecameInvisible()にて、オブジェクトがカメラに映り込んでいるかどうかを判定し・・、という処理を作っていたのですが、どうにも思い通りに動かない。
明らかにカメラからオブジェクトが外れているにもかかわらず、OnBecameInvisible()が呼ばれなかったり、逆にカメラ内にオブジェクトが映っていないのに、OnBecameVisible()が呼ばれたりと。
結論としては、オブジェクトの影がカメラ内にある場合は、表示状態となっている、というものでした。

例えば、以下のようにシーン配置し、Directional Lightを「もうじき沈むくらいの西日」にします。そうすると、シリンダの対面の壁にシリンダの影が映ります。
f:id:tuti107:20170409104740p:plain

シリンダには、以下のようなコードを貼り付けて、シリンダがカメラに映っているならVisible、映っていないならInvisibleが表示されるようにします。

using UnityEngine;

public class VisibleChecker : MonoBehaviour {

  public TextMesh text;

  private void OnBecameVisible()
  {
    text.text = "Visible";
  }

  private void OnBecameInvisible()
  {
    text.text = "Invisible";
  }
}

すると、シリンダがカメラ内なら、
f:id:tuti107:20170409104918p:plain

カメラ外なら、
f:id:tuti107:20170409104937p:plain

となり、期待通りの動きなのですが、シリンダの影がカメラ内に映っている場合も、
f:id:tuti107:20170409105010p:plain

となります。
影を付けながら、画面内にオブジェクトが映っている/映っていないときにOnBecameVisible(), OnBecameInvisible()が呼ばれるようにできないか頑張ってみましたが、結局対象オブジェクトは影がでないようにしました・・
f:id:tuti107:20170409105452p:plain

よい方法ご存知の方、ぜひご連絡ください。