Month: 5月 2012

Unityでスクリーンショットscreenshotを取る

Unityでスクリーンショットを取るのはApplication.CaptureScreenshot(ファイル名.png)を記述するだけと非常に簡単なのですが、AndroidアプリとしてSDカードに記録させようとした時にちょっと詰まったのでメモ。

記述の仕方

OnGUIのボタンをクリックするとキャプチャする場合。
[javascript]function OnGUI () {
if(GUI.Button(Rect(10 ,10,200,50),”スクリーンショットを撮る”)){
Application.CaptureScreenshot(“screenshot.png”);
}
}[/javascript]

“screenshot.png”の部分はそのまま保存されるファイル名になります。ファイル名が重複した場合は問答無用に上書きしてくれます。「上書きしますか?」などというポップアップも表示されません。

《Application.CaptureScreenshot》

保存される場所

Androidだとデフォルトでは変な場所に保存されます。
[javascript]”/sdcard/Android/data/[パッケージ名]/files/”内[/javascript]

ちなみにUnityのプレビュー上でキャプチャするとプロジェクト内に保存されます。

保存される場所を変えるには

色々なサイトを見ると、Application.CaptureScreenshot()の引数にパスを指定してやれば?って記事がありましたが、できませんでした。
[javascript]// できない
“/sdcard/DCIM/端末ごとのフォルダ/screenshot.png”
// これもできない
“/mnt/sdcard/DCIM/端末ごとのフォルダ/screenshot.png”
[/javascript]

結局どうするかというと、htmlを記述する時と同じようにしてやります。
[javascript]”../../../../DCIM/端末ごとのフォルダ/screenshot.png”[/javascript]

追記:指定したフォルダが無い場合は記録されないみたいです。

以下のサイトを参考にしました。
http://forum.unity3d.com/threads/134430-Capturing-screenshots-to-sdcard

できるようになったとはいえ、シャッターボタンが画面にある場合はシャッターボタンごとキャプチャされるので、シャッターボタンを押した瞬間にボタンを消してキャプチャする必要があったりとか工夫が必要ですね。

Unityで簡単なAndroid用レースゲームを作ってみた。

Unityで簡単なAndroid用レースゲームを作ってみた。
Unityで簡単なAndroid用レースゲームを作ってみた。iPhoneでも動くと思うけどDeveloper登録してないので未確認。
データはサーバーにアップしてあるので、下記リンクからapkファイルをダウンロードして、Android機にインスコすれば遊べます。

http://www.uxic.net/webpocket/fitrace.apk

操作方法

操作方法はタッチのみ。タッチしていればアクセルになり、離せばブレーキになります。ちなみに無限に加速します。
端末は横向きで左右に傾けると曲がります。
アプリを終了するにはHome長押しなどで。
つくばサーキットが走れます!が車の大きさとかデタラメです。

ハマったところ

当初、車にBoxcolliderとrigidbodyを付加して動かしてみたんですが、なんかガタガタして変な動きだったんです。
Gravityを切ったり、コンストレイントしたりすれば大丈夫なんですが、それじゃぁ車がひっくり返らなくなりおもしろくないわけで。色々と調べてみたら、ただ単にphysics materialの摩擦係数の問題でした。
車を動かすゲームといえばUnityのサンプルのレースゲームではタイヤに対してWheelCollider使ってますが、なんか設定項目が多くて難しそうなんで止めました。

スクリプトについて

かなりでたらめなjavascriptなんで晒すのが恥ずかしいですが・・・。
車の座標はCharactorController使わずにMathf.SinとMathf.Cosで対処してます。(恐ろしや)
[javascript]private var Power_f:float;
private var Power_v3:Vector3;
private var PowerCos_v3:Vector3;

private var AccelerationY_f:float;
private var AccelerationY_s:String;

private var Handle_f:float;
private var Handle_v3:Vector3;
private var Handle_q:Quaternion;
var HandleSpeed_f:float;

function FixedUpdate () {

//—————————- Acceleration
AccelerationY_f = Input.acceleration.y;
AccelerationY_s = AccelerationY_f.ToString();

// ローパスフィルター
Handle_f = (AccelerationY_f + 1) / 2 – 0.5;

// アクセルの値をy軸に作用するVector3に代入
Handle_v3 = Vector3(0,-Handle_f * HandleSpeed_f ,0);

// アクセルのspeedとかけた値をQuarternion.Eularに代入
Handle_q = Quaternion.Euler(Handle_v3 * Time.deltaTime);

//—————————- Touchしていない時
if(Input.touchCount == 0){

// 一応進んでる処理
CarMove();

// 減速処理
Power_f -= 0.5;
if(Power_f <= 0.0)Power_f = 0.0;// 0以下になったらずっと0

// 速度がある時だけrotationを変えられる
if(Power_f > 0.0) CarRotate();

}

//—————————- Touchした時
if(Input.touchCount == 1){

for (var touch : Touch in Input.touches) {

// touchした瞬間
if (touch.phase == TouchPhase.Began){

}

// 加速時(touchして動かしている時、もしくは止めている時)
if (touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary){

// 加速処理
//Power_v3 += Vector3(Power_f, 0, Power_f);
Power_f += 0.1;
CarRotate();
CarMove();
}

// 離した瞬間
if (touch.phase == TouchPhase.Ended){

}
}

}

}

function CarMove(){
var RadianX_f:float = ReturnRadian(transform.eulerAngles.y);// radianを代入
PowerCos_v3 = Vector3(Mathf.Cos(RadianX_f),0,-Mathf.Sin(RadianX_f));
rigidbody.MovePosition(rigidbody.position + Power_f * PowerCos_v3 * Time.deltaTime);// 減ったり増えたりが加算されてる
}

function CarRotate(){
rigidbody.MoveRotation(rigidbody.rotation * Handle_q);
}

function ReturnRadian(euler:float){
var radian_f = Mathf.PI/180*euler;
return radian_f;
}
[/javascript]

あとAndroidとiphone用のtouchについてはphaseの状態ごとに処理を分ける必要がある。まだtouchが1つなのでいいけど,マルチタッチになるとこんがらがってきそう。

© 2017 UXIC.net

Theme by Anders NorenUp ↑