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つなのでいいけど,マルチタッチになるとこんがらがってきそう。