Unityで、Nav Mesh Agentをつけた動物をOVR Grabbable対象にしようと思った際にかなり苦戦したのでメモ。
状況(課題)
- Nav Mesh AgentをつけたゲームオブジェクトをOVR Grabbableでつかめるようにしたい
- しかし、Nav Mesh Agentが有効だと掴めない
対応
- Nav Mesh Agentを動的にON/OFFする
具体例
- Box Colliderを大きめに設定し、Is TriggerをONにしておく
- スクリプト内のOnTriggerEnterで、OVR Playerが近づいたらNav Mesh AgentをOFFにする
//NavMeshAgentを取得するための変数
NavMeshAgent m_navmeshagent;
//プレイヤーが近くにいない場合は再び動き出させるためのinvoke関数用のフラグ
bool m_invoke_to_reStartAfterOnCollisionEnter;
void Start()
{
//NavmeshAgentを太く
m_navmeshagent = this.GetComponent<NavMeshAgent>();
}
private void OnTriggerEnter(Collider collider)
{
//OVR Playerかどうかをタグで判定。この場合は「Player」タグがついているとする
if (collider.transform.gameObject.CompareTag("Player") && !m_invoke_to_reStartAfterOnCollisionEnter)
{
m_invoke_to_reStartAfterOnCollisionEnter = true;
//Navmesh AgentをOFFにする
m_navmeshagent.ResetPath();
m_navmeshagent.enabled = false;
//Navmesh Agentを再び有効にするためのInvoke。この場合は10秒後に有効にする
Invoke("ReStartAfterOnCollisionEnter", 10);
}
}
private void ReStartAfterOnCollisionEnter()
{
m_navmeshagent.enabled = true;
m_invoke_to_reStartAfterOnCollisionEnter = false;
}