2012年11月7日水曜日

ideaPad A1 のICS化からUnityのビルドが出来るようにするまで

手持ちのタブレット ideaPad A1(16GB版)のroot化に失敗して操作不能になり、最終的にAndroid4.0(ICS)を導入することで使えるレベルには戻ったので、やったことのメモ。 

もともと入っていたビルドは 2644_ROW でしたが、root化には 2643_ROW が必要に思われたのでupdate.zipで2643をインストールしたところ、タッチパネルが利かなくなり操作不能に。
どうやら2644はハードウェアが違うらしく、2643を入れるとこうなるみたいです。 

bootable SD を作ってICSを入れれば操作は出来るらしいので、こちらを参考にICSを導入。
まずは bootable SD を作成します。
  • ここから Ice Cream Sandwich image for A1107 with 16GB と Win32DiskImager をダウンロード。Win32DiskImager は日本語に対応していないので英字のフォルダに置く。
  • Win32DiskImager を起動し、imageファイルとmicroSDカードを指定し、Write ボタンで書き込む。一応MD5は確認したほうがいいと思います。
※使用するmicroSDは容量の大きな物の方が良さそうです。私は2GBのカードでは失敗し、8GBのカードで成功しました。

続いて bootable SD を使って ICS をインストール。
  • A1の電源を切りSDを挿入。
  • リカバリーモードで起動
  • install zip from sdcard → choose zip from sdcard と進んで part1.zip をインストール。
  • 一旦 reboot system now でリブートし、Vol-を押したままにしてリカバリーモードに入る。
  • install zip from sdcard  → choose zip from sdcard から part2.zip をインストール。
  • そのまま、part3.zip もインストール。
  • メニューを戻って wipe data/factory reset を実行。
  • SDカードを抜いてから reboot system now でリブート。
これでICSの導入は完了です。

SDカードパッチの適用とroot化
こちらを参考にしました。
  • ここから A1_ICS_SD-Card.zip と A1_rooter.zip をダウンロード。
  • ダウンロードしたzipファイルを作成した bootable SD の一番上のディレクトリに置く。
  • A1にSDカードを挿してリカバリーモードで起動し、install zip from sdcard  → choose zip from sdcard から両方ともインストール。
  • SDカードを抜いてリブート。
※16GB版では上記の手順で完了ですが、2GB版ではさらに A1_ICS_SD-Card.zip のfixパッチが必要なようです。

しかし、この状態ではPCとUSBで接続しても認識せず、いろいろと不便でUnityのビルドも出来ませんでした。これはPC側のドライバの更新とA1側でメディアデバイス(MTP)としての設定をすることで解決しました。
方法はこちらを参考にしました。これにより内部SDの方も書き込みできるようになります。
注意点として、MTPの設定の前後でハードウェアIDが変わるので、MTPの設定をした後でドライバの更新をするほうがいいと思います。

ここまで完了してやっとUnityからのビルドが出来、Unity Remote も使用できる環境に戻せました。ICS環境については思っていたよりも軽快に動作するので結構気に入っています。

2012年3月11日日曜日

[Unity] 化物語風スクリーンセーバー的ソフト

Unityの練習として、化物語のOPをイメージしたスクリーンセーバー的なソフトを作ってみました。
モデリングにはBlenderを使用しています。

ホッチキスを綴じ続けるだけの観賞用ソフトです。マウスを動かすかEscキーで終了します。
.exe ファイルの拡張子を .scr に変更して Data フォルダと一緒に C:\Windowsフォルダ(Windows7の場合)に入れることで一応スクリーンセーバーとしても使用できます。スクリーンセーバーとしての仕様は満たしていないので試す際は自己責任で行ってください。


web player のブログへの埋め込みも試してみました。

2012年3月7日水曜日

[Unity] ゲーム中にオブジェクトを複製する方法


ゲームの実行中にオブジェクトを複製して配置する方法


  1. var target : GameObject;
  2. var targetLife : float;

  3. terget = Instantiate(Resources.Load("Target",GameObject),transform.position,transform.rotation);
  4. // ProjectのResourcesフォルダ内の"Target"を"target"として現在位置に配置する。

  5. Destroy(taeget,targetLife);
  6. // 複製したtargetを指定した時間(秒)後に消去する。



2012年3月3日土曜日

[Unity] スクリプトからシェーダーの値を変更する方法

トゥーンシェーダーのアウトラインの太さを変更する場合

  1. var material_1 : Material;
  2. var color_1 : Color;

  3. material_1.SetColor("_OutlineColor",color_1);

"_OutlineColor"などの変更する項目の名前は、
Projectでマテリアルを選択 → Inspector の Edit...
から確認可能

[Unity] ターゲットを追い続けるスクリプト2

ターゲットを追いかけるスクリプトはもっと簡単にできることがわかりました。

  1. var target : Transform;
  2. var movingSpeed : float;

  3. function Update()
  4. {
  5. transform.LookAt(target.position); //ターゲットの方に向かせる
  6. transform.position += transform.forward * movingSpeed * Time.deltaTime; //前方に移動速度分動かす
  7. }

たったこれだけ....

2012年2月24日金曜日

[Unity] ターゲットを追い続けるスクリプト

平面上でターゲットを追い続けるスクリプト
マウスクリック中はダッシュする

  1. var target : Transform; //追いかけるターゲット
  2. private var targetPosition : Vector3; //ターゲットの位置
  3. private var pointOfGaze : Vector3; //オブジェクトの注視点
  4. private var distanceXYZ :Vector3; //オブジェクトとターゲットの距離(XYZ)
  5. private var angleForTarget : float; //Z軸に対してオブジェクトとターゲットがなす角度

  6. var normalMovingSpeed :float; //標準時の移動速度[m/s]
  7. private var MovingSpeed :float; //実際の移動速度[m/s]
  8. var dashScale : float; //ダッシュ時の倍率
  9. private var movingDistanceXYZ : Vector3; //1フレームで移動する距離

  10. private var degToRad = Mathf.PI / 180; //変換 degree → radian

  11. function Update () {
  12. targetPosition = target.transform.position; //ターゲットの位置を取得
  13. distanceXYZ = targetPosition - transform.position; //ターゲットとオブジェクトの距離
  14. if(distanceXYZ.magnitude > 0.5){ //ターゲットが近すぎる際に向きが頻繁に変わるのを防ぐ
  15. //ターゲットの方へ向かせる処理--------------------------------
  16. pointOfGaze = targetPosition;
  17. pointOfGaze.y = transform.position.y; //y軸方向には回転させない
  18. transform.LookAt(pointOfGaze);
  19. //--------------------------------------------------------
  20. angleForTarget = transform.eulerAngles.y;
  21. //左クリック中はダッシュにする-------------------------------
  22. movingSpeed = normalMovingSpeed;
  23. if(Input.GetMouseButton(0)){
  24. movingSpeed *= dashScale;
  25. }
  26. //-------------------------------------------------------
  27. //1フレームあたりの移動量を求める---------------------------
  28. movingDistanceXYZ.x = movingSpeed * Mathf.Sin(angleForTarget * degToRad) * Time.deltaTime;
  29. movingDistanceXYZ.z = movingSpeed * Mathf.Cos(angleForTarget * degToRad) * Time.deltaTime;
  30. movingDistanceXYZ.y = 0;
  31. //-------------------------------------------------------
  32. transform.position.y = target.transform.position.y; //オブジェクトの高さをターゲットと合わせる
  33. transform.position += movingDistanceXYZ; //オブジェクトの座標に移動量を加える
  34. }
  35. }



2012年2月23日木曜日

[Unity] 地面上のマウス位置にオブジェクトを表示する方法

前回のスクリプトを発展させ、オブジェクトが地面に沿って移動するようにするスクリプト。

2012年2月22日水曜日

[Unity] マウス位置にオブジェクトを表示する方法

screen座標をworld座標に変換しマウス位置にオブジェクトを表示するスクリプト。

screenPositionのx,y座標にscreen座標のx,y座標を格納する。z座標にはオブジェクトのカメラからの距離を指定する。上のサンプルではz座標にカメラの高さを指定。

camera.ScreenToWorldPoint()にscreenPositionを指定することでtargetをマウス位置に移動する。

スクリプトはカメラに適用し、Targetに移動するオブジェクトを選択する。