本文へスキップ
バージョン: 3.0

Navigation MeshでCreature Navigationを追加する方法

ナビゲーション・メッシュは、ポイント・アンド・クリックのタッチ入力を使って、キャラクター( エージェント)がARシーンをナビゲートすることを可能にする。

前提条件

Lightship ARとLightship Meshingを有効にしたUnityプロジェクトが必要です。 詳細については、 ARDK 3.0 のインストール および メッシュの作成とフィジックスの追加方法を参照してください。

LightshipNavMeshManagerを追加する:

  1. 空の GameObjectを作成する。
    1. Hierarchyで、シーンのルートを選択します。
    2. メインメニューから、 GameObjectを選択し、 Create Empty Childを選択します。
    3. LightshipNavMeshManagerと名前をつけます.
  2. 空の GameObjectLightshipNavMeshManager コンポーネントを追加します。
    1. Inspector ウィンドウで、 Add Componentをクリックします。
    2. 検索窓に「LightshipNavMeshManager」と入力し、選択します。
  3. LightshipNavMesh を表示したい場合は、 LightshipNavMeshRenderer コンポーネントを GameObject にも追加してください。 これにより、カメラが動くと LightshipNavMesh が画面上にレンダリングされます。
    1. Inspector ウィンドウで、 Add Component を再度クリックします。
    2. 今回は、代わりに "LightshipNavMeshRenderer "を検索して選択します。
Lightship NavMesh Manager

NavMesh サンプルプロジェクトの LightshipNavMeshManager プレハブを追加することもできます。 詳しくは、 サンプルプロジェクトをご覧ください。

LightshipNavMeshへのエージェントの追加

LightshipNavMeshをテストするには、 Agent をシーンに追加してトラバースする必要があります。 NavMesh sample project には Agent プレハブが含まれており、テストに使用できますが、自分で作成することもできます。

Agent プレハブを作成します:

  1. Agentとして動作するオブジェクトをシーンに追加します。
    1. Hierarchyで、シーンのルートを選択します。
    2. 右クリックし、 Createを選択します。 この例では、 Cube を選択して、基本キューブをテスト Agentとして追加します。 TestAgentと名前をつけます。
  2. LightshipNavMeshAgent コンポーネントを新しい Agentに追加する。
    1. Hierarchyで、 TestAgentを選択します。
    2. Inspector ウィンドウで、 Add Componentをクリックします。 「LightshipNavMeshAgent」を検索し、選択してコンポーネントを追加します。
  3. LightshipNavMeshAgentPathRenderer コンポーネントを追加して、 Agent がシーン内で通ることができるパスを表示します。
    1. Hierarchyで、 TestAgentを選択する。
    2. Inspector ウィンドウで、 Add Componentをクリックし、"LightshipNavMeshAgentPathRenderer" を検索して選択し、コンポーネントを追加します。
  4. AgentAssets ウィンドウにドラッグしてプレハブにし、シーンから削除します。
LightshipNavMesh Agent

エージェントを制御するスクリプトを作成する

Agentにコントロールスクリプトを追加するには:

  1. スクリプトの追加 Asset.
    1. Assets ウィンドウで右クリックし、 Createを選択し、 C# Scriptを選択する。
    2. 新しいスクリプトの名前 NavMeshHowTo
  2. スクリプトを Agentに添付します。
    1. Agent プレハブを選択し、 Inspector ウィンドウの「Add Component」をクリックします。
    2. NavMeshHowTo "を検索し、それを選択してコントローラスクリプトをプレハブに追加します。
  3. 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);
}.
}
}
}
}