GPSがうまく動かない
UnityRemoteでより安定して動くよう、課題1のテキストを更新しました。
UnityRemoteでは、iPhoneでもAndroidでも位置情報が取れるようになっているのではないかと思います。
(具体的には、startからではなくcalc内でGPSの初期化命令を呼ぶように変えています。)
なお、iOSのバージョンにもよりますが、iphoneの実機ビルドにて位置情報を取得できない不具合が確認されており、対応策を検討中です。
・GameCanvasの機能:今週使う変数、メソッド
・(bool)gc.HasGeolocationPermission
・GPSが使えるかどうか
・gc.StartGeolocationService();
・GPSの緯度経度取得を開始する
・gc.StopGeolocationService();
・GPSの緯度経度取得を終了する
・(bool)gc.HasGeolocationUpdate
・GPSの値を取得できたかどうか
・(float)gc.GeolocationLastLatitude;
・GPSで取得できた緯度
・(float)gc.GeolocationLastLongitude;
・GPSで取得できた経度
前回、apkが作れなかった人、xcodeを用いてうまく実機で動かせなかったmax&iOSユーザーは、前回の課題の問題解決から始めましょう。 「課題の進め方」 ※今回は第8回なので、フォルダはk08に改名してください。 サンプルの起動を確認し、スクリプトが編集できる状態になったら、 続きを読み進めてください。
(クラスに入った直後)に変数の宣言を足す
float lat;
float lng;
string text;
bool isStartGPS = false;
(InitGame()の中)に初期化処理を足す
gc.SetResolution(720, 1280);
lat = 35.685410f;
lng = 139.752842f;
text = "取得中";
(UpdateGame()の中)に下記の行を足す
if(!isStartGPS){
gc.StartGeolocationService();
isStartGPS = true;
}
if(!gc.HasGeolocationPermission){
text = "位置情報サービスが無効です";
}
if(gc.HasGeolocationUpdate){
lat = gc.GeolocationLastLatitude;
lng = gc.GeolocationLastLongitude;
text = string.Format("緯度: {0}\n経度: {1}", lat, lng);
}
DrawGame()の中(ClearScreenの後)に下記の行を記載
gc.ClearScreen();
gc.SetColor(0,0,0);
gc.DrawString(text, 0, 0);
//変数宣言
string url;
//初期化処理
var w = gc.CanvasWidth / 2;
var h = gc.CanvasHeight / 2;
url = string.Format("https://maps.googleapis.com/maps/api/staticmap?center={0},{1}&zoom=15&format=png&sensor=false&size={2}x{3}&scale=2&maptype=roadmap&markers={0},{1}", lat, lng, w, h);
//緯度経度を取得した後
var w = gc.CanvasWidth / 2;
var h = gc.CanvasHeight / 2;
url = string.Format("http://maps.googleapis.com/maps/api/staticmap?center={0},{1}&zoom=15&format=png&sensor=false&size={2}x{3}&scale=2&maptype=roadmap&markers={0},{1}", lat, lng, w, h);
//描画部分
//DrawStringの前に足しましょう
gc.DrawOnlineImage(url, 0, 0);
//用意する変数
int gameState = 0;
float base_lat=0,base_lng=0;
float player_lat=0,player_lng=0;
const int CHECK_NUM = 9;
int [] check_dx = new int[CHECK_NUM] ;
int [] check_dy = new int[CHECK_NUM] ;
bool [] isCheck = new bool[CHECK_NUM];
bool isComplete;
float calcRate = 0.001f;
int playcount ;
//初期化用メソッド
//プログラム末尾、クラスが終わる}の前に追加します。
//また、追加したメソッドをInitGame()から呼んであげましょう
void resetValue(){
for(int i=0;i < CHECK_NUM;i++){
isCheck[i]= false;
check_dx[i] = (i%3) -1;
check_dy[i] = (i/3) -1;
}
isComplete = false;
playcount = 0;
}
//UpdateGame,DrawGameの構成
if(gameState == 0){
//タイトル画面の処理
}
else if(gameState == 1){
//ゲーム中の処理
}
else if(gameState == 2){
//ゲームクリアー時の処理
}
//処理の例(ゲーム前)
if(gc.GetPointerFrameCount(0)==1){
gameState = 1;
base_lat = lat;
base_lng = lng;
resetValue();
}
//処理の例(ゲーム中)
playcount++;
player_lat = lat - base_lat;
player_lng = lng - base_lng;
//今いる場所をtrueに
for (int i = 0; i < CHECK_NUM; i++) {
float check_lat = check_dx[i] * calcRate;
float check_lng = check_dy[i] * calcRate;
if(
player_lat - check_lat > -calcRate/2 &&
player_lat - check_lat < calcRate/2 &&
player_lng - check_lng > -calcRate/2 &&
player_lng - check_lng < calcRate/2
){
isCheck [i] = true;
}
}
//全部通ったかの判定
isComplete = true;
for (int i = 0; i < CHECK_NUM; i++) {
if (!isCheck [i]) {
isComplete = false;
}
}
if (isComplete) {
gameState = 2;
}
//描画の例(ゲーム前)
gc.DrawString("TAP TO START!",320, 60);
//描画の例(ゲーム中)
gc.DrawString("PLAYING",320, 60);
gc.DrawString ("SCORE"+playcount,320, 90);
gc.DrawString ("lat:" + player_lat/calcRate,320, 120);
gc.DrawString ("lng:" + player_lng/calcRate,320, 150);
for( int i = 0;i < CHECK_NUM; i++){
if(isCheck[i]){
gc.DrawString("o",400+check_dx[i]*30,250+check_dy[i]*30 );
}
else {
gc.DrawString("x",400+check_dx[i]*30,250+check_dy[i]*30 );
}
}
//描画の例(ゲーム後)
gc.DrawString("CLEAR!!",320, 60 );
gc.DrawString ("SCORE:"+playcount,320, 90);
より良くする案を考えてみましょう。
UnityRemoteでより安定して動くよう、課題1のテキストを更新しました。
UnityRemoteでは、iPhoneでもAndroidでも位置情報が取れるようになっているのではないかと思います。
(具体的には、startからではなくcalc内でGPSの初期化命令を呼ぶように変えています。)
なお、iOSのバージョンにもよりますが、iphoneの実機ビルドにて位置情報を取得できない不具合が確認されており、対応策を検討中です。
プログラムが間違っていてビルドエラーが出ている可能性が高いです。
エディタ上でbuildしてみましょう。
{}の対応が間違っていないか、全角スペースが入っているかなど、確認してみましょう