ラベル 経験則 の投稿を表示しています。 すべての投稿を表示
ラベル 経験則 の投稿を表示しています。 すべての投稿を表示

2014年12月16日火曜日

Unity4.2:文字コードとセーブファイルで困った・・・

以下始めてセーブファイルを作ろうとしたわけで馬鹿とか言わないで

セーブファイルの書式を決めようぜ
まずはセーブファイルの書式を決めるんだけど、ファイルの読み込みってこんな感じでやる。
var lineArray    = saveFile.text.Split("\n"[0]);
for each ( var str:String in lineArray){
     何か処理
}
つまり、全部Stringで戻ってくる。
だから、例えばbooleanとかintegerとかfloatで値を格納しても文字列になっちゃう。
つーことで、戻ってきた値を適切に処理できるように、以下のような書式にした。
項目名:型:値
例えば、(debug:bool:false)みたいな感じ。(何故かコロンを英数字にすると絵文字が出ちゃうので日本語で)
これを行ごとに処理してく。

各項目を処理しようとしたんだけど・・・
で、戻ってきた文字列を処理しようとして以下のようにしたんだけど。
var lineArray    = saveFile.text.Split("\n"[0]);
for each ( var str:String in lineArray){
     if ( str.Split(“:”[0])[0] == “true”){
          return(true);   //文字列trueをboolのtrueとして返す
     }else{
          return(false);   //文字列falseだったらboolのfalseとして返す
     }
}
なぜか全部falseになってしまう・・・
んで色々調べてみたら、どうもUTF-8という文字コードじゃないとちゃんと動かないらしい。
つまり、文字コードが違ったので、同じ”true”同士でも、同じと判別してくれてないみたい。
なので、書き込み部分をUTF-8で行うように変更する・・・

UTF-8で書き込むぜ!
色々省くけど、こんな感じ。
var sw            :StreamWriter;
var enc            :Encoding = Encoding.GetEncoding("UTF-8");
sw                 = new StreamWriter(saveFilePath, false, enc);
sw.WriteLine(“debug:bool:false”);
sw.Close();
で、ね。
うまくいかないわけよ!!!!!

更に調べると改行コードも関係してた
何か色々とエンコード回りを調べてたら、僕が作ったファイルはUTF-8になってるんだけど、
改行コード「混在」となってる・・・
更に調べるとUnityではUTF-8で改行コードCR LFじゃないとダメみたい。
僕の作ったファイルはCR LFとLFが混在してるわけ。
で、行ごとに読み込む時にSplit(“/n”[0])で読み込んでるので、これだとLFで切り分けてしまうので、CRが残ってしまうらしい。
CRは\rで表すらしいので、”true\r”と”true”を比べていたわけ!

わかったよ改行コードCR LFで書き込むよ
と・・・いったものの、書き込み方がわかんない・・・・
つーわけで一時間程あれこれ調べた結果、あきらめましたよ!

セーブファイルの書式を変えますよええ
LFで区切ってる場合とCR LFで区切っている場合を分けて処理使用とも考えたけど面倒なので、セーブファイルの書式を変えました。
項目名:型:値:
これで、CRは:でSplitされた時点で戻り値の行列の末尾にサヨナラだ!

そしてAndroidでセーブファイルがみつからない・・・
Windowsで作業した時にはわからなかったんだけど、Andoroidに出力したらセーブファイルみつからないよ・・・
つーわけで、ここからはそっちの探索をはじめます・・・・

続く・・・

2013年8月24日土曜日

回転の経験則

結局、回転について全然わからないので、
一度総当りしてみることにした。

プログラマが見たら大笑いだと思うが、仕方ない。
これがUnityプログラミング・ストロングスタイルだ。

やりたいことは。
1フレームにつき1度回して、90フレーム後に90度回転していること。

試した内容の詳細は後回しにして、結果を先に。
結局ちゃんと90度回転したのは以下。
obj.transform.rotation *=Quaternion.Euler(0, 1, 0);
obj.transform.rotation *=Quaternion.Euler(Vector3(0, 1, 0));
obj.transform.Rotate(0, 1, 0);
obj.transform.Rotate(Vector3(0, 1, 0));
obj.transform.eulerAngles +=Vector3(0, 1, 0);
obj.transform.eulerAngles.y +=1;

今回わかったこと。

・Quaternionを加えてゆこうと思ったら、掛けること(足せない)。
・RotateはQuaternionで指定しない。
・Vecter3(1, 1, 1)と(1, 1, 1)は別物
・Time.deltaTimeは「1フレーム」の事だと思ってたら何か少数値が入ってた。


以下が試したプログラム。
青いラインが成功。

function Update () {
if(round<90){
round++;
obj.transform.rotation +=(0, 1, 0);
obj.transform.rotation +=Vector3(0, 1, 0);
obj.transform.rotation +=Quaternion.Euler(0, 1, 0);
obj.transform.rotation *=Quaternion.Euler(0, 1, 0);
obj.transform.rotation +=Quaternion.Euler(Vector3(0, 1, 0));
obj.transform.rotation *=Quaternion.Euler(Vector3(0, 1, 0));
obj.transform.rotation +=(0, Time.deltaTime, 0);
obj.transform.rotation +=Vector3(0, Time.deltaTime, 0);
obj.transform.rotation *=Vector3(0, Time.deltaTime, 0);
obj.transform.rotation +=Vector3.up*Time.deltaTime;
obj.transform.rotation *=Vector3.up*Time.deltaTime;

obj.transform.rotation.y +=1;
obj.transform.rotation.y +=Time.deltaTime;
obj.transform.rotation.y +=Vector3.up*Time.deltaTime;

obj.transform.Rotate(0, 1, 0);
obj.transform.Rotate(Vector3(0, 1, 0));
obj.transform.Rotate(Quaternion.Euler(0, 1, 0));
obj.transform.Rotate(Quaternion.Euler(Vector3(0, 1, 0)))
obj.transform.Rotate(0, Time.deltaTime, 0);
obj.transform.Rotate(Vector3(0, Time.deltaTime, 0));
obj.transform.Rotate(Vector3.up*Time.deltaTime);
obj.transform.Rotate(Vector3.up, Time.deltaTime);

obj.transform.eulerAngles +=(0, 1, 0);
obj.transform.eulerAngles +=Vector3(0, 1, 0);
obj.transform.eulerAngles +=Quaternion.Euler(0, 1, 0);
obj.transform.eulerAngles *=Quaternion.Euler(0, 1, 0);
obj.transform.eulerAngles +=Quaternion.Euler(Vector3(0, 1, 0))
obj.transform.eulerAngles +=(0, Time.deltaTime, 0);
obj.transform.eulerAngles +=Vector3(0, Time.deltaTime, 0);
obj.transform.eulerAngles +=Vector3.up*Time.deltaTime;

obj.transform.eulerAngles.y +=1;
obj.transform.eulerAngles.y +=Time.deltaTime;
obj.transform.eulerAngles.y +=Vector3.up*Time.deltaTime;
}
} 


ちなみに、何か別の方法なら回転しそうなのは以下。
y=1.756921まで回転してた。
obj.transform.Rotate(0, Time.deltaTime, 0);
obj.transform.Rotate(Vector3(0, Time.deltaTime, 0));
obj.transform.Rotate(Vector3.up*Time.deltaTime);
obj.transform.Rotate(Vector3.up, Time.deltaTime);
obj.transform.eulerAngles +=Vector3(0, Time.deltaTime, 0);
obj.transform.eulerAngles +=Vector3.up*Time.deltaTime;
obj.transform.eulerAngles.y +=Time.deltaTime;
これ、うまくゆかないのって、もしかしたら僕のTime.deltaTimeの理解が間違っているからかもね。

以上。

2013年7月17日水曜日

AwakeがStartに負けた!

前提:
static varにドラッグしてGameIbjectを登録できなかった。
普通のvarに入れてから改めでstaticに代入してた。

こんな感じ。
どの関数にも入れてないから、Awakeで実行されるはずー。
static var num :int =8;
var objsTmp =new GameObject[num];
static var objs =new GameObject[num];
for (var l:int=0; l<num; l++){
objs[l] = objsTmp[l];
}

(ちなみに、staticの配列を定義する時に使っている"num"をstaticにしないで使うと、
上記"objsTmp"には使えるけれど、staticなobjsでは使えない!)


と、こ、ろ、が!

Startでこれを利用しようとしたら、何故かnullが帰ってくる。

Updateを使って代入タイミングをみると最初のフレームではまだnullのまま。
あれー?
Awake > Start > Update
の順で実行されるんじゃなかったっけ?
ちなみに、最初の1フレーム目だけnullで後は正常に代入されていた。


Updateでも間に合ってないって...

とりあえずStartを最初にyieldしたら読めた。
なんでこうなるのかわかんないけど、動くからいいかー。

追記=========
これは、間に合ってないんじゃなかった。

オブジェクトA・・・変数をAwakeで定義するスクリプトを保持
オブジェクトB・・・オブジェクトAの変数をStartで参照

という構成だったので、つまりはオブジェクトの表示タイミングが違ったために起こったわけです。
最初からシーンに表示していても、これは起こるので、現在は、オブジェクトAのAwake処理の最後に、終了フラグを仕込んで、オブジェクトBのスクリプトのStartはそちらのフラグを見て実行するように変更しています。

2013年7月10日水曜日

Blender四苦八苦:モデルのスムージング

Blenderでやったオブジェクトのスムージングが
Unityに継承されない!

調べたところ・・・
http://forum.unity3d.com/threads/130542-Flat-Shading-in-Blender-Imported-Mesh

ダメみたい!

エッジをスプリットしろって・・・

BlenerのオブジェクトはUnityに持ってゆくと、全部スムージングがかかった状態になります。

2013年6月22日土曜日

Android端末(Nexus7)にビルドして出力してみる

どうやらUnityからAndroid端末への出力は簡単らしい

のでやってみる。
基本的なセットアップ方法は。
http://docs-jp.unity3d.com/Documentation/Manual/android-sdksetup.html

Android SDKをインストール

ここからダウンロード
http://developer.android.com/sdk/installing/index.html

手持ちのAndroid端末のOSバージョンを確認。
ダウンロードしたファイルを解凍してSDK Manager.exeを起動。
OSバージョンに合ったファイルを選択してインストール。

僕のは4.2.2だったからこんな感じ。
ちなみに、画像はインストール済みの図だから、右側の欄がInstaledになっている。
あと、インストール項目の自動判別が行われるようで、チェックしたものが全部入るわけではなさそう。

UnityにSDKのパスを通す

Edit > Preference > External Tool >Android SDK Location
に、SDKをインストールしたパスを入れる。
<任意のパス>\adt-bundle-windows-x86_64-20130522\sdk
こんな感じ?

UnityのBuild SettingをAndroidにする

何故か画面キャプチャできないので、文字で。

File > Build Setting
で開いたウインドウの下の方にあるAndroidというのを選択。

さあ動け!File > Build and Run
動かないです。

Couldn't Find Android Device

Android 端末を開発者モードにする

調べると、そういうことだそうです。
http://webhoric.com/android/how-to-nexus7-developer-options

開発者モードにしたぜ!
さあ動け!File > Build and Run
動かないです。

Android 端末のUSBドライバを入れる

調べるとそういうことだそうです。
http://blogs.yahoo.co.jp/momo_poem/67257950.html

Nexus7のドライバはここから。
http://www.asus.co.jp/Tablet/Nexus/Nexus_7/#download

インストールしたぜ!
さあ動け!File > Build and Run
動かないです。

adbで端末の接続を確認

調べると、どうもAndroid端末が接続されているかどうか調べるのに、adbというコマンドを使うようです。
http://note.chiebukuro.yahoo.co.jp/detail/n128056
Windowsコマンドプロンプトに以下のように打ち込めと。
adb devices
....コマンドとして認識していない・・・・。

http://wghost.org/it/android/android-adb-shell-usb/
ああ、さっきインストールしたAndroid SDKのplatform-toolsフォルダにパスを通せばいいのか!

...パスの通し方わかりません
http://blog.cnu.jp/2009/11/06/windows-7-path/

通った!adbと・・・動かない・・・

再起動したら動きました。
が・・・Nexus7は認識されていないご様子。

なんだなんだー、えーっと・・・
http://blog.livedoor.jp/moonlight_aska/archives/50743650.html

というわけでこの方法でadb認識しましました。
何でカメラなんだ!

期待しないで・・・!File > Build and Run
うううううう!動いた!
表示方向が縦横逆だけど動いた!
マウス用にしかプログラム書いてないのに、タッチで動いた!
うわああああい!

超カンタンだったね!

2013年6月16日日曜日

ぐるぐる回転させる時に困ったこと

ぐるぐる回転させようと思って下の様に書いたところ・・・
obj.transform.rotation.y += 10;

なぜかわからんけど(多分ジンバルの関係だと思う)、180度くらいの所でスピードが鈍って、更には停止してしまう。
調べて以下のように直したら回った。
obj.transform.Rotate(0, 10, 0);

多分、オイラーとクォータニオンの違いだと思うんだけど、よーわからん。