Eclipseでプログラミングをしているとき、ビルドエラーでこんなメッセージが
表示されることがあります。
○○を型に解決できません
それはインポートしていないパッケージがあるからなのですが、
自分でどれをインポートしてよいかわからないとき、
Eclipseが自動的に選んでインポートしてくれる素敵コマンドがありました。
[Shift] + [Ctrl] + [O]
これは便利!
【参考】
「○○ を型に解決できません」エラーを簡単に解決する方法
http://believe-just-say-yes.blogspot.jp/2011/02/blog-post.html
2012年09月28日
[Android] ビルドエラー(○○を型に解決できません)の解決方法
posted by be-style at 21:59| Comment(0)
| Android
[Unity] ベルトコンベヤー上のオブジェクトの動きについて検証してみた(解決編)
前回の記事([Unity] ベルトコンベヤー上のオブジェクトの動きについて検証してみた)で
「適当にプレイヤーを用意して固定した床からベルトコンベヤーに乗ってみたら、
ベルトコンベヤーと一緒に動きはしたものの、乗った瞬間に瞬間移動してしまいました」
と最後に課題を挙げましたが、解決しました。
それもほんの数行の命令で済んだという素敵解決。
まずは、
・動かない床(手前)
・動く床(奥)
を用意します。
動く床に適用しているスクリプトは、前回と同様にこんな感じです。

InspectorとHierarchyウィンドウはこんな感じ↓

3rd Person Controllerオブジェクトに、独自に「Player_Controller.js」を追加しています。
Player_Controller.jsの中身が今回のポイントです。
「キャラクターが動く床に触れたら、動く床の子階層に入れる」
「それ以外に触れたら親子関係を解消する」
という処理を行っています。
これで実行すると、、、
動く床に合わせて

キャラも移動してる!

とういことで、前回のような瞬間移動もなく
無事キャラクターがスムーズに動く床に合わせて動いてくれました。
Hierarchyウィンドウを確認してみると、ちゃんと動く床の階層下に入っていることがわかります↓

解決してよかった。
「適当にプレイヤーを用意して固定した床からベルトコンベヤーに乗ってみたら、
ベルトコンベヤーと一緒に動きはしたものの、乗った瞬間に瞬間移動してしまいました」
と最後に課題を挙げましたが、解決しました。
それもほんの数行の命令で済んだという素敵解決。
まずは、
・動かない床(手前)
・動く床(奥)
を用意します。
動く床に適用しているスクリプトは、前回と同様にこんな感じです。
function FixedUpdate() {次に、Standard Assetsにある「3rd Person Controller」を動かない床の上に配置します↓
// x方向に揺れる
transform.localPosition.x = 3 * Mathf.Sin(Time.time);
}

InspectorとHierarchyウィンドウはこんな感じ↓

3rd Person Controllerオブジェクトに、独自に「Player_Controller.js」を追加しています。
Player_Controller.jsの中身が今回のポイントです。
Player_Controller.jsここでは、
--------------------------------------------------
function OnControllerColliderHit(hit : ControllerColliderHit) {
if (hit.gameObject.name == "BeltConveyor") {
// ベルトコンベヤーに乗ったら
transform.parent = hit.gameObject.transform;
} else {
// ベルトコンベヤーじゃなかったら
transform.parent = null;
}
}
--------------------------------------------------
「キャラクターが動く床に触れたら、動く床の子階層に入れる」
「それ以外に触れたら親子関係を解消する」
という処理を行っています。
これで実行すると、、、
動く床に合わせて

キャラも移動してる!

とういことで、前回のような瞬間移動もなく
無事キャラクターがスムーズに動く床に合わせて動いてくれました。
Hierarchyウィンドウを確認してみると、ちゃんと動く床の階層下に入っていることがわかります↓

解決してよかった。
posted by be-style at 08:49| Comment(0)
| Android
2012年09月26日
[iOS] 1球パターゴルフ(ver.1.1.42)をリリースしました
今回のバージョンアップでは、この3点を行いました。
・角度の微調整ボタンを追加
・5ステージ追加(合計135ステージ)
・一部、パワーと角度が同時に設定できてしまっていた不具合修正
角度微調整ボタンの追加↓

ステージ132

ステージ134

Appleの審査期間があるので、Androidのバージョンアップからはどうしても遅れてしまいます。
なので、iOS版ではAndroid版のバージョンアップをいくつかまとめています。
今度は、iPhone5用の解像度に対応させないとなぁ・・・。
App Store:
http://itunes.apple.com/jp/app/id545176342?mt=8
・角度の微調整ボタンを追加
・5ステージ追加(合計135ステージ)
・一部、パワーと角度が同時に設定できてしまっていた不具合修正
角度微調整ボタンの追加↓

ステージ132

ステージ134

Appleの審査期間があるので、Androidのバージョンアップからはどうしても遅れてしまいます。
なので、iOS版ではAndroid版のバージョンアップをいくつかまとめています。
今度は、iPhone5用の解像度に対応させないとなぁ・・・。
App Store:
http://itunes.apple.com/jp/app/id545176342?mt=8
posted by be-style at 08:00| Comment(0)
| Android
2012年06月20日
[Android] 逆ジオコーディングを実装してみた
かめはめ波 の今回のバージョンアップで、
到達地点の地域名を表示しました。

これは、緯度経度情報から地名を求める「逆ジオコーディング(住所の逆検索)」
という方法を行っています。
逆ジオコーディング(住所の逆検索):
https://developers.google.com/maps/documentation/geocoding/?hl=ja#ReverseGeocoding
忘れない内に備忘メモ。
■Google Geocoding API を使う
サンプルURLを見ます↓
http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=false
ブラウザで見ると、JSON形式のデータが表示されます。
ということで、
(1)Android端末からGoogle Geocoding APIにHTTP通信(GET)でアクセス
(2)返ってきた値(JSON形式)をパースして、地域名を取得
(3)ゲーム画面に表示
という流れになります。
少し検証。
-----------------------------------------------------------------
(1)Android端末からGoogle Geocoding APIにHTTP通信(GET)でアクセス
APIに使ったパラメーターは、以下の4つ。
・緯度(必須)
・経度(必須)
・結果を返す言語
・センサーの有無(必須)
URLにすると、この通り。
http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true&language=ja
実装するときは、各パラメーターをプログラム側で変えられるようにすればOK。
-----------------------------------------------------------------
(2)返ってきた値(JSON形式)をパースして、地域名を取得
まずは、GETで取得した値を文字列に変換するところから↓
InputStreamをStringに変換する:
http://d.hatena.ne.jp/gungnir_odin/20091129/1259333223
次は、パースできる形にするために文字列をJSONObjectに変換。
それから欲しいデータを読み取ります↓
Android で JSON を使おう 〜 前編〜: ※後編も
http://d.hatena.ne.jp/androidprogram/20100621/1277075384
JSONデータの中には、色々な情報が入っています。
その中で、番地まで詳細な情報じゃなくて、ある程度地域がわかるレベルでの地域情報が欲しい。
そんなときは、下記の優先順位で使用するデータを決定。
【第1候補】locality → 区市町村
【第2候補】administrative_area_level_1 → 都道府県
【第3候補】country → 国
※日本の場合
Google Maps API Version3 日本語ドキュメント(非公式)
https://sites.google.com/site/gmapsapi3/Home/services
実装では、上記3つを読み取ります。
-----------------------------------------------------------------
(3)ゲーム画面に表示
読み取ったデータを表示するだけなのですが、文字列の先頭と末尾の半角スペースが
表示されなくて少しハマりました。
そのときに調べたこと。
strings.xmlにスペースを含む値を設定したい:
https://groups.google.com/group/android-group-japan/browse_thread/thread/c76134754664f85f?pli=1
-----------------------------------------------------------------
上記を踏まえて実装しました。
必要最低限を抜粋していますので、import宣言やエラー処理は含んでいません。
パースのやり方も、もっと効率の良い方法があるはずなのですが
現状の力量ではこの方法しか思いつきませんでした。
到達地点の地域名を表示しました。

これは、緯度経度情報から地名を求める「逆ジオコーディング(住所の逆検索)」
という方法を行っています。
逆ジオコーディング(住所の逆検索):
https://developers.google.com/maps/documentation/geocoding/?hl=ja#ReverseGeocoding
忘れない内に備忘メモ。
■Google Geocoding API を使う
サンプルURLを見ます↓
http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=false
ブラウザで見ると、JSON形式のデータが表示されます。
ということで、
(1)Android端末からGoogle Geocoding APIにHTTP通信(GET)でアクセス
(2)返ってきた値(JSON形式)をパースして、地域名を取得
(3)ゲーム画面に表示
という流れになります。
少し検証。
-----------------------------------------------------------------
(1)Android端末からGoogle Geocoding APIにHTTP通信(GET)でアクセス
APIに使ったパラメーターは、以下の4つ。
・緯度(必須)
・経度(必須)
・結果を返す言語
・センサーの有無(必須)
URLにすると、この通り。
http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true&language=ja
実装するときは、各パラメーターをプログラム側で変えられるようにすればOK。
-----------------------------------------------------------------
(2)返ってきた値(JSON形式)をパースして、地域名を取得
まずは、GETで取得した値を文字列に変換するところから↓
InputStreamをStringに変換する:
http://d.hatena.ne.jp/gungnir_odin/20091129/1259333223
次は、パースできる形にするために文字列をJSONObjectに変換。
それから欲しいデータを読み取ります↓
Android で JSON を使おう 〜 前編〜: ※後編も
http://d.hatena.ne.jp/androidprogram/20100621/1277075384
JSONデータの中には、色々な情報が入っています。
その中で、番地まで詳細な情報じゃなくて、ある程度地域がわかるレベルでの地域情報が欲しい。
そんなときは、下記の優先順位で使用するデータを決定。
【第1候補】locality → 区市町村
【第2候補】administrative_area_level_1 → 都道府県
【第3候補】country → 国
※日本の場合
Google Maps API Version3 日本語ドキュメント(非公式)
https://sites.google.com/site/gmapsapi3/Home/services
実装では、上記3つを読み取ります。
-----------------------------------------------------------------
(3)ゲーム画面に表示
読み取ったデータを表示するだけなのですが、文字列の先頭と末尾の半角スペースが
表示されなくて少しハマりました。
そのときに調べたこと。
strings.xmlにスペースを含む値を設定したい:
https://groups.google.com/group/android-group-japan/browse_thread/thread/c76134754664f85f?pli=1
-----------------------------------------------------------------
上記を踏まえて実装しました。
必要最低限を抜粋していますので、import宣言やエラー処理は含んでいません。
-----------------------------------------------------------------こうやって振り返れば数十行なのですが、調べたりテストするのに時間が結構かかりました。
private final static int TIMEOUT= 1000; // タイムアウト時間
private void GetRevGeo(float lat, float lng) {
// 端末の設定言語を取得
String langParam = "en";
if (Locale.JAPAN.equals(Locale.getDefault())) {
langParam = "ja";
}
// URLにHTTP接続(GET)
HttpURLConnection http = null;
URL url = new URL("http://maps.googleapis.com/maps/api/geocode/json?latlng="
+ lat + "," + lng + "&sensor=true&language=" + langParam);
http = (HttpURLConnection)url.openConnection();
// タイムアウト時間(ミリ秒)を設定
http.setReadTimeout(TIMEOUT);
http.setConnectTimeout(TIMEOUT);
// 接続
http.setRequestMethod("GET");
http.connect();
// データを取得
InputStream in = null;
in = http.getInputStream();
// InputStream -> String
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
StringBuffer buf = new StringBuffer();
String str;
while ((str = reader.readLine()) != null) {
buf.append(str);
buf.append("\n");
}
String src = buf.toString();
// 切断
http.disconnect();
// JSONオブジェクトの生成(root)
JSONObject rootObject = new JSONObject(src);
// "results"階層にある配列を取得
JSONArray resultsArray = rootObject.getJSONArray("results");
// 配列を用意
int countResults = resultsArray.length();
JSONObject[] componentObject = new JSONObject[countResults];
for (int i = 0; i < countResults; i++){
componentObject[i] = resultsArray.getJSONObject(i);
}
// さらに下階層から「country」「administrative_area_level_1」「locality」と
// 同階層の「formatted_address」を探して地域名を取得
String country = "";
String administrative_area_level_1 = "";
String locality = "";
for (int i = 0; i < componentObject.length; i++) {
JSONArray typesArray = componentObject[i].getJSONArray("types");
for (int j = 0; j < typesArray.length(); j++) {
String elem = typesArray.getString(j);
// 国
if (elem.equals("country")) {
country = componentObject[i].getString("formatted_address");
Log.d("debug", "country---------------------" + country);
}
// 都道府県
if (elem.equals("administrative_area_level_1")) {
administrative_area_level_1 = componentObject[i].getString("formatted_address");
Log.d("debug", "administrative_area_level_1---------------------" + administrative_area_level_1);
}
// 区市町村
if (elem.equals("locality")) {
locality = componentObject[i].getString("formatted_address");
Log.d("debug", "locality---------------------" + locality);
}
}
}
if (locality.length() > 0) {
// 区市町村を返す
return locality;
} else if (administrative_area_level_1.length() > 0) {
// 区市町村が取得できなかったら都道府県を返す
return administrative_area_level_1;
} else if (country.length() > 0) {
// 都道府県が取得できなかったら国を返す
return country;
}
// 何も取得できなかったらnullを返す
return null;
}
-----------------------------------------------------------------
パースのやり方も、もっと効率の良い方法があるはずなのですが
現状の力量ではこの方法しか思いつきませんでした。
posted by be-style at 14:02| Comment(0)
| Android
2012年06月09日
[Android] NGUIが52%オフの$45に
NGUIをアップデートしようと思って、久しぶりにAsset Storeを見たら
約半額の$45になってました。
NGUI: Next-Gen UI
http://u3d.as/2vh
今持っているのがver.1.86eで、最新版がver.2.0.8かー。
バージョンアップ早いなー。
まずは使ってみよう!
約半額の$45になってました。
NGUI: Next-Gen UI
http://u3d.as/2vh
今持っているのがver.1.86eで、最新版がver.2.0.8かー。
バージョンアップ早いなー。
まずは使ってみよう!
posted by be-style at 22:54| Comment(0)
| Android