Navigation MeshでCreature Navigationを追加する方法
ナビゲーション・メッシュは、ポイント・アンド・クリックのタッチ入力を使って、キャラクター( エージェント)がARシーンをナビゲートすることを可能にする。
前提条件
Lightship ARとLightship Meshingを有効にしたUnityプロジェクトが必要です。 詳細については、 ARDK 3.0 のインストール および メッシュの作成とフィジックスの追加方法を参照してください。
また、Unity GameObject
と AR Mesh Manager および Lightship Meshing Extension Components が必要です。 詳しくは、 メッシュの作成のセクション1の手順に従ってください。
Navigation Mesh Managerの追加
LightshipNavMeshManager
を追加する:
- 空の
GameObject
を作成する。- Hierarchyで、シーンのルートを選択します。
- メインメニューから、 GameObjectを選択し、 Create Empty Childを選択します。
LightshipNavMeshManager
と名前をつけます.
- 空の
GameObject
にLightshipNavMeshManager
コンポーネントを追加します。- Inspector ウィンドウで、 Add Componentをクリックします。
- 検索窓に「LightshipNavMeshManager」と入力し、選択します。
- LightshipNavMesh を表示したい場合は、
LightshipNavMeshRenderer
コンポーネントをGameObject
にも追加してください。 これにより、カメラが動くと LightshipNavMesh が画面上にレンダリングされます。- Inspector ウィンドウで、 Add Component を再度クリックします。
- 今回は、代わりに "LightshipNavMeshRenderer "を 検索して選択します。
NavMesh サンプルプロジェクトの LightshipNavMeshManager
プレハブを追加することもできます。 詳しくは、 サンプルプロジェクトをご覧ください。
LightshipNavMeshへのエージェントの追加
LightshipNavMeshをテストするには、 Agent をシーンに追加してトラバースする必要があります。 NavMesh sample project には Agent プレハブが含まれており、テストに使用できますが、自分で作成することもできます。
Agent プレハブを作成します:
- Agentとして動作するオブジェクトをシーンに追加します。
- Hierarchyで、シーンのルートを選択します。
- 右クリックし、 Createを選択します。 この例では、 Cube を選択して、基本キューブをテスト Agentとして追加します。
TestAgent
と名前をつけます。
LightshipNavMeshAgent
コンポーネントを新しい Agentに追加する。- Hierarchyで、
TestAgent
を選択します。 - Inspector ウィンドウで、 Add Componentをクリックします。 「LightshipNavMeshAgent」を検索し、選択してコンポーネントを追加します。
- Hierarchyで、
LightshipNavMeshAgentPathRenderer
コンポーネントを追加して、 Agent がシーン内で通ることができるパスを表示します。- Hierarchyで、
TestAgent
を選択する。 - Inspector ウィンドウで、 Add Componentをクリックし、"LightshipNavMeshAgentPathRenderer" を検索して選択し、コンポーネントを追加します。
- Hierarchyで、
- Agent を Assets ウィンドウにドラッグしてプレハブにし、シーンから削除します。
エージェントを制御するスクリプトを作成する
Agentにコントロールスクリプトを追加するには:
- スクリプトの追加 Asset.
- Assets ウィンドウで右クリックし、 Createを選択し、 C# Scriptを選択する。
- 新しいスクリプトの名前
NavMeshHowTo
。
- スクリプトを Agentに添付します。
- Agent プレハブを選択し、 Inspector ウィンドウの「Add Component」をクリックします。
- NavMeshHowTo "を検索し、それを選択してコントローラスクリプトをプレハブに追加します。
NavMeshHowTo.cs
を開き、このサンプルスクリプトをコピーします:
ここをクリックするとNavMeshHowToスクリプトが表示されます!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Niantic.Lightship.AR.NavigationMesh;
using UnityEngine.InputSystem;
/// SUMMARY:
/// LightshipNavMeshSample
/// このサンプルでは、LightshipNavMeshを使用してユーザー主導のポイント&クリックナビゲーションを追加する方法を示します。
/// 画面を最初にタッチすると、エージェントのプレハブが配置されます。
/// 場所をタップすると、エージェントはその場所に移動する。
/// トグルボタンは、ナビゲーション・メッシュとパスの表示/非表示を切り替えます。
/// _agentPrefabにLightshipNavMeshAgentがあると仮定します。
/// 独自のエージェント・タイプを書いている場合は、それを入れ替えるか、継承する。
///
public class NavMeshHowTo :MonoBehaviour
{
[SerializeField]
private Camera _camera;
[SerializeField]
private LightshipNavMeshManager _navmeshManager;
[SerializeField]
private GameObject _agentPrefab;
private GameObject _creature;
private LightshipNavMeshAgent _agent;
void Update()
{
HandleTouch();
}
public void ToggleVisualisation()
{
//ナビメッシュのレンダリ ングをオフにする
_navmeshManager.GetComponent<LightshipNavMeshRenderer>().enabled =
!_navmeshManager.GetComponent<LightshipNavMeshRenderer>().enabled;
//任意のエージェントのパスレンダリングをオフにする
_agent.GetComponent<LightshipNavMeshAgentPathRenderer>().enabled =
!_agent.GetComponent<LightshipNavMeshAgentPathRenderer>().enabled;
}
private void HandleTouch()
{
//エディタではマウスクリックを使用し、スマホではタッチを使用します。
#if UNITY_EDITOR
if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetMouseButtonDown(2))
#else
//タッチがあった場合、関数を呼び出す
if (Input.touchCount <= 0)
return;
var touch = Input.GetTouch(0);
//タッチがないか、タッチでUI要素が選択された場合
if (Input.touchCount <= 0 )
return;
if (touch.phase == UnityEngine.TouchPhase.Began)
#endif
{
#if UNITY_EDITOR
Ray = _camera.ScreenPointToRay(Input.mousePosition);
#else
Ray ray = _camera.ScreenPointToRay(touch.position);
#endif
//タッチポイントをスクリーン空間から3Dに投影し、それをエージェントへデスティネーションとして渡す
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
if (_creature == null )
{
_creature = Instantiate(_agentPrefab);
_creature.transform.position = hit.point;
_agent = _creature.GetComponent<LightshipNavMeshAgent>();
}
else
{
_agent.SetDestination(hit.point);
}.
}
}
}
}