エディタで位置情報サービスを有効にするか 場所をハードコーディングする方法はありますか?
これはUnity Remote 4が行われた理由の一つです。 Setup Unityをリモートに接続し、モバイルデバイスをエディタに接続します。エディタから実際の場所を取得できるようになりました。
しかし、場所のすべてのプロパティは、あなたが本当に場所を模擬するための方法を開発したい場合は、ユニティのLocationInfo
構造を放棄しなければならないだけ
を読んでいます。独自のカスタムを作成してLocationInfo
とし、名前をLocationInfoExt
とします。 Extは=拡張です。
LocationService
についても同じことをしてから、という公式をカスタムLocationServiceExt
クラスにラップしてください。LocationServiceExt
を使用して、LocationInfoExt
を使用して場所をモックするかどうかを判断し、LocationInfo
を内部で使用してモックの場所を指定しないと、結果が得られません。以下の例で
、公式LocationService
、LocationInfo
及びLocationServiceStatus
クラス/構造体/列挙はLocationServiceExt
、LocationInfoExt
とLocationServiceStatusExt
で置換されています。また、同じ機能とプロパティが実装されています。唯一の違いは、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();
}
あなたの答えは非常にリンク重いです。答えはあなたが答えに一つ一つのリンクを削除した場合、あなたはまだ問題を解決することができることを彼らに十分な量が必要です(あなたがGoogle検索に必要な場合がありますが、それはあなたに検索するための十分な情報を提供します)。 "First"や "Second"のようなものは、リンクが消滅した場合の解決策を発見するのに十分な情報を与えていないと言っています。 –
説明をありがとう。 – Cabrra