2016-08-08 9 views
3

私は場所ベースのゲームを構築しています。ポケモンのようなものです。 私のAndroid携帯電話の場所は問題なく読んでいますが、Input.location.isEnabledByUserはエディタでfalseであるため、ユニティエディタで開発中です。ユニティエディタでInput.Locationと模擬場所を使用する方法

okを使って場所を偽装したりハードコードしたりするだけで、自分の携帯電話に展開することなく試してみることができます。

私はこのようなハードコードそれに試してみました:

LocationInfo ReadLocation(){ 
    #if UNITY_EDITOR 

    var location = new LocationInfo(); 
    location.latitude = 59.000f; 
    location.longitude = 18.000f; 
    location.altitude= 0.0f; 
    location.horizontalAccuracy = 5.0f; 
    location.verticalAccuracy = 5.0f; 

    return location; 
    #elif 
    return Input.location.lastData; 
    #endif 
} 

しかし、場所のすべてのプロパティは読み取り専用ですので、私はコンパイルエラーを取得しています。 エディタで位置情報サービスを有効にする方法、または場所をハードコードする方法はありますか?フォローする

答えて

2

エディタで位置情報サービスを有効にするか 場所をハードコーディングする方法はありますか?

これはUnity Remote 4が行われた理由の一つです。 Setup Unityをリモートに接続し、モバイルデバイスをエディタに接続します。エディタから実際の場所を取得できるようになりました。

しかし、場所のすべてのプロパティは、あなたが本当に場所を模擬するための方法を開発したい場合は、ユニティのLocationInfo構造を放棄しなければならないだけ

を読んでいます。独自のカスタムを作成してLocationInfoとし、名前をLocationInfoExtとします。 Extは=拡張です。

LocationServiceについても同じことをしてから、という公式をカスタムLocationServiceExtクラスにラップしてください。LocationServiceExtを使用して、LocationInfoExtを使用して場所をモックするかどうかを判断し、LocationInfoを内部で使用してモックの場所を指定しないと、結果が得られません。以下の例で

、公式LocationServiceLocationInfo及びLocationServiceStatusクラス/構造体/列挙はLocationServiceExtLocationInfoExtLocationServiceStatusExtで置換されています。また、同じ機能とプロパティが実装されています。唯一の違いは、LocationServiceExtのコンストラクタにtrue/falseを渡してエディタで使用できることです。

LocationServiceExtラッパークラス

それに以下のコードをコピーしLocationServiceExtというクラスを作成します。 それは、元LocationServiceクラスからのすべての機能や特性を有しています。

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

public class LocationServiceExt 
{ 
    private LocationService realLocation; 

    private bool useMockLocation = false; 
    private LocationInfoExt mockedLastData; 
    private LocationServiceStatusExt mockedStatus; 
    private bool mIsEnabledByUser = false; 

    public LocationServiceExt(bool mockLocation = false) 
    { 
     this.useMockLocation = mockLocation; 

     if (mockLocation) 
     { 
      mIsEnabledByUser = true; 
      mockedLastData = getMockLocation(); 
     } 
     else 
     { 
      realLocation = new LocationService(); 
     } 
    } 

    public bool isEnabledByUser 
    { 
     //realLocation.isEnabledByUser seems to be failing on Android. Input.location.isEnabledByUser is the fix 
     get { return useMockLocation ? mIsEnabledByUser : Input.location.isEnabledByUser; } 
     set { mIsEnabledByUser = value; } 
    } 


    public LocationInfoExt lastData 
    { 
     get { return useMockLocation ? mockedLastData : getRealLocation(); } 
     set { mockedLastData = value; } 
    } 

    public LocationServiceStatusExt status 
    { 
     get { return useMockLocation ? mockedStatus : getRealStatus(); } 
     set { mockedStatus = value; } 
    } 

    public void Start() 
    { 
     if (useMockLocation) 
     { 
      mockedStatus = LocationServiceStatusExt.Running; 
     } 
     else 
     { 
      realLocation.Start(); 
     } 
    } 

    public void Start(float desiredAccuracyInMeters) 
    { 
     if (useMockLocation) 
     { 
      mockedStatus = LocationServiceStatusExt.Running; 
     } 
     else 
     { 
      realLocation.Start(desiredAccuracyInMeters); 
     } 
    } 

    public void Start(float desiredAccuracyInMeters, float updateDistanceInMeters) 
    { 
     if (useMockLocation) 
     { 
      mockedStatus = LocationServiceStatusExt.Running; 
     } 
     else 
     { 
      realLocation.Start(desiredAccuracyInMeters, updateDistanceInMeters); 
     } 
    } 

    public void Stop() 
    { 
     if (useMockLocation) 
     { 
      mockedStatus = LocationServiceStatusExt.Stopped; 
     } 
     else 
     { 
      realLocation.Stop(); 
     } 
    } 

    //Predefined Location. You always override this by overriding lastData from another class 
    private LocationInfoExt getMockLocation() 
    { 
     LocationInfoExt location = new LocationInfoExt(); 
     location.latitude = 59.000f; 
     location.longitude = 18.000f; 
     location.altitude = 0.0f; 
     location.horizontalAccuracy = 5.0f; 
     location.verticalAccuracy = 5.0f; 
     location.timestamp = 0f; 
     return location; 
    } 

    private LocationInfoExt getRealLocation() 
    { 
     if (realLocation == null) 
      return new LocationInfoExt(); 

     LocationInfo realLoc = realLocation.lastData; 
     LocationInfoExt location = new LocationInfoExt(); 
     location.latitude = realLoc.latitude; 
     location.longitude = realLoc.longitude; 
     location.altitude = realLoc.altitude; 
     location.horizontalAccuracy = realLoc.horizontalAccuracy; 
     location.verticalAccuracy = realLoc.verticalAccuracy; 
     location.timestamp = realLoc.timestamp; 
     return location; 
    } 

    private LocationServiceStatusExt getRealStatus() 
    { 
     LocationServiceStatus realStatus = realLocation.status; 
     LocationServiceStatusExt stats = LocationServiceStatusExt.Stopped; 

     if (realStatus == LocationServiceStatus.Stopped) 
      stats = LocationServiceStatusExt.Stopped; 

     if (realStatus == LocationServiceStatus.Initializing) 
      stats = LocationServiceStatusExt.Initializing; 

     if (realStatus == LocationServiceStatus.Running) 
      stats = LocationServiceStatusExt.Running; 

     if (realStatus == LocationServiceStatus.Failed) 
      stats = LocationServiceStatusExt.Failed; 

     return stats; 
    } 
} 

public struct LocationInfoExt 
{ 
    public float altitude { get; set; } 
    public float horizontalAccuracy { get; set; } 
    public float latitude { get; set; } 
    public float longitude { get; set; } 
    public double timestamp { get; set; } 
    public float verticalAccuracy { get; set; } 
} 

public enum LocationServiceStatusExt 
{ 
    Stopped = 0, 
    Initializing = 1, 
    Running = 2, 
    Failed = 3, 
} 

使用

モック場所

LocationServiceExt locationServiceExt = new LocationServiceExt(true); 

を作成し、実際の場所を作成します

LocationServiceExt locationServiceExt = new LocationServiceExt(false); 

に後で場所を変更します。
LocationInfoExt locInfo = new LocationInfoExt(); 
locInfo.latitude = 59.000f; 
locInfo.longitude = 18.000f; 
locInfo.altitude = -3.0f; //0.0f; 
locInfo.horizontalAccuracy = 5.0f; 
locInfo.verticalAccuracy = 5.0f; 

locationServiceExt.lastData = locInfo; //Apply the location change 

フルUnity Docから作業例を移植しました。

public Text text; 
IEnumerator StartGPS() 
{ 
    text.text = "Starting"; 
    //Pass true to use mocked Location. Pass false or don't pass anything to use real location 
    LocationServiceExt locationServiceExt = new LocationServiceExt(true); 

    LocationInfoExt locInfo = new LocationInfoExt(); 
    locInfo.latitude = 59.000f; 
    locInfo.longitude = 18.000f; 
    locInfo.altitude = -3.0f; //0.0f; 
    locInfo.horizontalAccuracy = 5.0f; 
    locInfo.verticalAccuracy = 5.0f; 
    locationServiceExt.lastData = locInfo; 

    // First, check if user has location service enabled 
    if (!locationServiceExt.isEnabledByUser) 
    { 
     text.text = "Not Enabled"; 
     yield break; 
    } 
    else 
    { 
     text.text = "Enabled!"; 
    } 

    // Start service before querying location 
    locationServiceExt.Start(); 


    // Wait until service initializes 
    int maxWait = 20; 
    while (locationServiceExt.status == LocationServiceStatusExt.Initializing && maxWait > 0) 
    { 
     text.text = "Timer: " + maxWait; 
     yield return new WaitForSeconds(1); 
     maxWait--; 
    } 

    // Service didn't initialize in 20 seconds 
    if (maxWait < 1) 
    { 
     print("Timed out"); 
     text.text = "Timed out"; 
     yield break; 
    } 

    // Connection has failed 
    if (locationServiceExt.status == LocationServiceStatusExt.Failed) 
    { 
     print("Unable to determine device location"); 
     text.text = "Unable to determine device location"; 
     yield break; 
    } 
    else 
    { 
     // Access granted and location value could be retrieved 
     string location = "Location: " + locationServiceExt.lastData.latitude + " " 
      + locationServiceExt.lastData.longitude + " " + locationServiceExt.lastData.altitude 
      + " " + locationServiceExt.lastData.horizontalAccuracy + " " + locationServiceExt.lastData.timestamp; 
     Debug.Log(location); 
     text.text = location; 
    } 

    // Stop service if there is no need to query location updates continuously 
    locationServiceExt.Stop(); 
} 
1

ステップ:

まず、呼び出しGPSを起動する必要があります:あなたがこれを行うことができるように

Input.location.Start(); 

「スタート」は、すべての必要なプロセスを初期化するいくつかの時間がかかる:

IEnumerator InitLocationTracker() 
    { 
     // Start service before querying location 
     Input.location.Start(); 

     // Wait until service initializes 

     if (true == disableGPSMode) 
     { 
      //delegate to call again "InitLocationTracker" 
      if (null != OnRetryLocation) 
      { 
       OnRetryLocation(); 
      } 
      //variable to check the location available 
      isLocationAvailable = false; 

      yield return null; 
     } 
     // I chose 20s to retry the call 
     int maxWait = 20; 
     while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0) 
     { 
      // Service didn't initialize in 20 seconds 
      if (maxWait < 1) 
      { 
       Debug.Log("LocationTracker: Timed out"); 

       //GameObject to show error text 
       errorText.text = "LocationTracker: Timed out"; 
       errorPanel.SetActive(true); 

       //delegate to call again "InitLocationTracker" 
       if (null != OnRetryLocation) 
       { 
        isLocationAvailable = false; 
        OnRetryLocation(); 

        yield break; 
       } 


      } 

      yield return new WaitForSeconds(1f); 
      maxWait--; 
     } 

     // Connection has failed 
     if (Input.location.status == LocationServiceStatus.Failed) 
     { 
      Debug.Log("LocationTracker: Unable to determine device location"); 

      errorText.text = "LocationTracker: Unable to determine device location"; 
      errorPanel.SetActive(true); 


      if (null != OnRetryLocation) 
      { 
       OnRetryLocation(); 
      } 

      isLocationAvailable = false; 
     } 
     else 
     { 
      Debug.Log("LocationTracker Location: " + current_lat + " " + current_lon + " " + Input.location.lastData.timestamp); 
      isLocationAvailable = true; 


      StartCoroutine(TrackLocation()); 
     } 
    } 

次に、電話をかけて電話をかけて、電話をかけて電話をかけることができます。

private float current_lat; 
private float current_lon; 

current_lat = Input.location.lastData.latitude; 
current_lon = Input.location.lastData.longitude; 

しかし、私はあなたにコルーチンを呼び出し、いつでもGPS信号を持っていることを確認する無限ループを作ることをお勧めします。あなたが特定のポイントでのGPSデータが必要な場合は、あなたがそれを必要とするゾーンにコルーチンを動かすことができ、

IEnumerator TrackLocation() 
{ 
    while (true) 
    { 
     //5 seconds for example 
     yield return new WaitForSeconds (5f); 

     if (Input.location.status == LocationServiceStatus.Running) 
     { 
      //Get the location data here 
     } 
    } 
} 

最後の一つのノート:擬似コードは次のようなものである可能性があります。 GPSチェックとデータ使用をどのようにプログラムするかはあなた次第です。 (Unityのドキュメントから)

リソースリンク

LocationInfo

LocationService

+0

あなたの答えは非常にリンク重いです。答えはあなたが答えに一つ一つのリンクを削除した場合、あなたはまだ問題を解決することができることを彼らに十分な量が必要です(あなたがGoogle検索に必要な場合がありますが、それはあなたに検索するための十分な情報を提供します)。 "First"や "Second"のようなものは、リンクが消滅した場合の解決策を発見するのに十分な情報を与えていないと言っています。 –

+0

説明をありがとう。 – Cabrra

関連する問題