--------(--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2012-12-31(Mon)

データ壊れチェック[Unity]

一部のデータの壊れチェックを追加しました。CRCでやるんでしょと思っていましたが。
C#で、md5なら簡単に出せるので、こいつにしました。
16byteのハッシュキーとか、ちょっともったいないかなと思いましたが、自分でコード書いて、
バグ入れるよりはましなので、楽な方を選びます。

チェックとか、セットとか、

// hash
public void set_md5() {
md5 = PrefsSerialize.ComputeMd5( tbl );
//Debug.Log( System.BitConverter.ToString(md5) );
}
public bool check_md5() {
byte[] tmp = PrefsSerialize.ComputeMd5( tbl );

bool bEqual = false;
if( tmp.Length == md5.Length ){
int i = 0;
while( (i < tmp.Length) && (tmp[i] == md5[i]) ){
i += 1;
}
if( i == tmp.Length ){
bEqual = true;
}
}
return bEqual;
}

メインメニューとかを改修してます。
前の完全にトラウマをかかえちゃっている奴とは、おさらばです。

Screenshot_2012-12-31-06-10-14.png
スポンサーサイト
2012-12-28(Fri)

Android vibrations(2) - 対応更新[Unity]

あらすじ
Android端末を振動させるのに、Handheld.Vibrate()を仮で使っていましたが、
固定で1秒くらい振動してくれて、時間の設定ができなかったです。
しかし、最近AndroidJavaObjectで、plugin書けることを知ってしまったので、
時間が設定できるように対応しました。

ソースはPluginsディレクトリに配置、時間はミリ秒で指定です。
HandheldUtil.vibrate(10);
の様な感じで呼び出し。どっかで、Initializeを呼び出しておく。

AndroidManifest.xmlには以下を追加
<uses-permission android:name="android.permission.VIBRATE" />

pluginの動作確認、いちいち送って実機でみないと確認できないので、面倒くさいです。
後、実際に組み込まれる、AndroidManifest.xmlが
プロジェクトディレクトリの Temp/StagingArea 以下に出力されているのを知りました。
最終的な内容が確認できるので、あれ?ってなったときに調べれます。
2012-12-26(Wed)

背景どうするか、particleでの描画(2)

ゲーム中の背景、particleで描画、更新しました。
textureはもちろん矢印にして、動きとかやっつけました。
まだ、colorどうするとか、shaderどうするとかもろもろ仮ですが、
performanceもいけそうなので、後はやるだけです。。。

なんか、次の日になったらperformance出ない病気になってしまって、
あれ?夢だったのかな。。。どっかいじったっけとかなっていたのですが、
texture設定のmipmapをoffにしてしまっていました。
texture大きすぎんだよ、mipmapいれると小さいサイズのtextureで描画されるのか、
performance戻りました。2日位悩んでしまった。。。

Screenshot_2012-12-26-04-26-20.jpgScreenshot_2012-12-26-04-26-12.jpg

2012-12-23(Sun)

particleでの描画(1)

ゲーム中の背景をどうしようか悩んでいましたが、
particleで適当ににぎやかしとけば、いいんじゃないという考えに至り、
実機でゲーム中に出してみて、performance的に大丈夫かまず確認してみました。

ParticleSystem.Particleを使ったサンプルは以下を参考にしました。
graphs.jpg
http://catlikecoding.com/unity/tutorials/graphs/
packageファイルもあるので、動作も確認できます。

やっている事は、ParticleSystem.Particleの配列を確保して、
そのstructの、position、size などを設定して、
ParticleSystem.Particleに流してやると描画してくれます。

サンプルそのままの、コードでテスト
とりあえずperformance見るだけなので。。。
functionはサイン波がでるやつでテストしました。

private void CreatePoints () {
if(resolution < 2){
resolution = 2;
}
currentResolution = resolution;
points = new ParticleSystem.Particle[resolution];
float increment = 1f / (resolution - 1);
for(int i = 0; i < resolution; i++){
float x = i * increment;
points[i].position = new Vector3(x, 0f, 0f);
points[i].color = new Color(x, 0f, 0f);
points[i].size = 0.1f;
}
}

void Update () {
if(currentResolution != resolution){
CreatePoints();
}
// 位置決定用の関数
FunctionDelegate f = functionDelegates[(int)function];
for(int i = 0; i < resolution; i++){
Vector3 p = points[i].position;
p.y = f(p.x);
points[i].position = p;
Color c = points[i].color;
c.g = p.y;
points[i].color = c;
}
particleSystem.SetParticles(points, points.Length);
}
mobile用に使えそうなshaderをいくつか設定して計測しました。
(※Particle System - renderer - Material)
Unity proなんてないので、performanceは、実機で動かしてfpsを確認。

1000 particles
47fps AngryBots/Particle/Additive
45fps Mobile/Particles/Additive
44fps Mobile/Particles/VertexLit Blended
59fps Unlit/Texture

描画する面積などでperformance大きく異なると思いますが、大丈夫そうかな。
後、shaderの差を見たかったら、もうちょっとparticleを増やして計測したほうがよかったかも。。。
とりあえず、この方針でやってみます!

Screenshot_2012-12-23-05-29-50.jpg
2012-12-21(Fri)

twitter対応、Intentから呼び出し[Unity]

plugin作成してやんなきゃいけなくて、結構ハードル高いなぁと思っていましたが、
Unityユーザー助け合い所 の情報で、Unityのスクリプトのみで対応できるよって知ったので、
早速、やってみました。すげー感謝です。

AndroidJavaObjectを通して、java classのメソッドが呼べる、で理解はあってるのかな。
ソースはPluginsディレクトリに配置

Screenshot_2012-12-21-03-31-37.jpg
2012-12-17(Mon)

ランキングに時刻追加[Unity]

ローカルランキングのデータにデータが登録された時刻を追加しました。
時刻が必須なわけでもなく、ただ単に参考程度に表示するだけです。

なので、外部の別の時刻データと比較を行ったりとかないですが、
一応 内部データは、Utcで持っておいて、
表示する箇所はローカル時刻で表示するようにしました。

時刻データ
public System.DateTime dateTime;

時刻取得、Utcで取得
rank_dat.tbl[id].dateTime = System.DateTime.UtcNow;

表示用に、localTimeにして文字列取得

public static string dateTimeString(System.DateTime dtime) {
if( dtime.Kind == System.DateTimeKind.Utc ){
// UTCのみ変換して戻す
System.DateTime localTime = dtime.ToLocalTime();
return localTime.ToString("s");
} else {
return "";
}
}

未登録のデータは時刻非表示で、登録されているか否かの判定を
System.DateTimeKind.Utc でやっちゃってます。
後は、ランキングデータの比較で、
timeが同じ場合に古い時刻のものが上位になるようにとか対応してます。

今回は、ローカルでの時刻比較のみなので、大したことないですが。
時刻関連は注意が必要な箇所だと思っています。

ネタ切れ感が、半端ないですが今はゲーム中の背景をなんとかしようと作業中です。。。
2012-12-12(Wed)

画面ちらつく、原因分からん(2)[Unity]

UnityのScriptingを読んでいると、Application.LoadLevel のところで、以下の記述を見つけたので、

MonoBehaviour.OnLevelWasLoaded is called on all active game object's after the level has been loaded.

Scene移動後のApplication.Quit()で、画面がちらついちゃってるのは、
OnLevelWasLoadedで、Sceneの切り替えをちゃんと待つようにすればいいんじゃね。
と思って試してみました。後、Documentちゃんと読もうよ。。。

結論を言うと、治らなかったです。。。
多少ちらつきは、少なくなりましたが。

コードは以下の感じ、AppScenes classをDontDestroyOnLoadで破棄されないようにして、
Application.LoadLevel と Application.Quit は必ずこのclass経由で呼ぶようにしました。
読み込み中とおぼしき状態の場合、リクエストは破棄しています。

不具合は直らなかったので、結局また待ちを復活。
上記のclassは、そんなに間違ってないだろうし、シーン遷移の箇所のラッパーにもなるかなで、
採用して使っています。
はっきりした原因は分からないですが、これで割と安定してしまったので、
もうこれでいいかなと思っていたりします。
2012-12-10(Mon)

Android Admob対応(1)[Unity]

UnityのAndroidプロジェクトで、Admobの表示対応を行いました。

これまでの記事から滲み出ていると思いますが、Androidのプログラムに関して、
かなり素人でして、なので勉強しながらやってたりするので、間違ってたりとかはごめんなさいです。

Admobの登録は、情報たくさんあるので、迷ったら調べて、登録。
Admobの組み込みに関して、参考にさせていただいたのは、崇高なる keijiroさんのプラグインサンプルです。
https://github.com/keijiro/unity-adbanner-example

まずは、Unityプロジェクトをdownloadして、そのまま組み込んでみました。
サンプルのプログラムがあるので、そのまま組み込めました。ありがたいことです。
Plugins以下をコピー、AndroidManifest.xmlは必要箇所を追加、
そして、AdBannerObserver.Initialize を呼ぶようにしただけです。

とりあえず動作したので。これをbaseにさせてもらって、やってみる事にしました。
ありがたいことです。

次に自分の環境で、Pluginをbuildできるようにしました。
ドキュメントにAntプロジェクトですと書いてあったので、Antを調べるところから。。。
酷い素人です、ごめんなさい。
JavaのMakeみたいなもんという理解を得て、Makeだったら行けるっしょ、という勝手な自信とともに、
Apache Antをインストールしました。
以下ビルドまでの手順

Download > Binary Distributions > apache-ant-1.8.4-bin.zip
展開のみでインストール終了、pathは適当

システム環境変数
ANT_HOME インストールしたpathを設定
Path %ANT_HOME%\bin; 追加
JAVA_HOME 設定してなかったので追加

local.propertiesを追加 sdk.dir=android-sdkのpath
project.propertiesを修正 target=android-16 に 15 -> 16
※local.propertiesの直接ファイルを作成したけど、正しい生成方法とかある?

%ant clear
%ant release でビルドできた!

ビルドできたので、最新のSDK(GoogleAdMobAdsSdk-6.2.1.jar)に更新して、
念の為、ビルドし直し。

これで、自分の環境で改造できる環境ができました。

Screenshot_2012-12-13-00-35.jpg
2012-12-06(Thu)

AudioSourceをどこに置くか[Unity]

SEを鳴らす場合の、AudioSourceをどこにくっつけるか悩んで、このようにしてみました。
大抵は、鳴らすGameObjectにくっつけるのものだと思いますが、GameObjectをDestroyすると
音も止まってしまいます。再生終了を待つのもなんだし、
positionが必要ないSEも一緒に管理したいなと思って、AudioSourceは別のGameObjectを作って、
それにくっつけて鳴らすようにしました。
作成できるGameObjectの個数は決め打ちで、それを超えると既に鳴っているやつを
勝手に破棄して、再生します。
なので、AudioSourceの上限と同時に発音する上限を切っています。

3Dサウンドでないものは、カメラの位置に生成してそのまま。
なにかにくっつけて、動かすものはLastUpdateで位置をコピーしています。
参照先が破棄される可能性ありますが、
InstanceManagerでcacheを作成しているものに対して使用しているので、
activeが落とされるだけで、参照先自体がなくなってしまうことはないはず。
本来ならば、Destroy時のイベント通知とかで処理しないといけないと思いますが、手抜きです。
※参照先がすり替わってしまうことはあるかも。。。
でもまあ、3Dサウンドの位置なんて、分かりゃあしないよという甘い考えです。
コピーよくないですが、InstanceManagerのコピーです。コピーよくないです。


using UnityEngine;
using System.Collections;

// SEの再生
public class SEPlayer : MonoBehaviour {

Transform trans;
Transform connectTrans; // 連結する対象のTransform

public void PlayOneShot(AudioClip clip, Transform connect=null) {
this.trans = this.transform;
this.connectTrans = connect;
if( this.connectTrans != null ){
trans.position = this.connectTrans.position;
}
audio.clip = clip;
audio.Play();
//MEMO:clip設定してPlayしないと isPlayingが取得できなかった
//PlayOneShotでは、取得できなかった
}

void LateUpdate() {
if( audio.isPlaying ){
// transform設定
if( this.connectTrans != null ){
trans.position = this.connectTrans.position;
if( this.connectTrans.gameObject.active == false ){
// activeでなくなったら、もう移動しないので、連結を切る
this.connectTrans = null;
}
}
} else {
// 再生終了
AudioSourceManager.Destroy(this.gameObject);
}
}
}
2012-12-05(Wed)

classの比較、変更がある場合のみデータ保存[Unity]

optionsメニューで、設定の変更を行った場合のみ保存するように対応しました。
PlayerPrefsの保存は、完了復帰なので(PlayerPrefs.Save()実行してる)、なるべく保存にいかないようと思っての対応です。
optionsデータがフラグだけなので、割とあれですが、あれなんで。。。
C言語だとmemcmpとかやってましたけど、C#だとどうなんでしょう。

public enum OptionsFlag : uint {
SOUND_BGM = 1 << 0,
SOUND_SE = 1 << 1,
VIBRATION = 1 << 2,
}

// options
[System.Serializable()]
public class Options {
uint optionsFlag;

public Options() {
this.optionsFlag = (uint)(OptionsFlag.SOUND_BGM | OptionsFlag.SOUND_SE | OptionsFlag.VIBRATION);
}
public void setFlag(OptionsFlag opt, bool set_flag) {
if( set_flag ){
this.optionsFlag |= (uint)opt;
} else {
this.optionsFlag &= ~(uint)opt;
}
}
public bool getFlag(OptionsFlag opt) {
return ((this.optionsFlag & (uint)opt) != 0);
}

public Options Clone(){
return this.MemberwiseClone() as Options;
}

public override bool Equals(System.Object obj) {
Options optionsObj = obj as Options;
if( optionsObj == null ){
return false;
}

do {
if( optionsFlag != optionsObj.optionsFlag ){
return false;
}
} while( false );

return true;
}
public override int GetHashCode() {
return this.optionsFlag.GetHashCode();
}
}
public Options options;
Options optionsClone;

public void restore_options() {
// optionsCloneにデータ退避
this.optionsClone = this.options.Clone();
}
public void auto_save_options() {
if( options.Equals(optionsClone) != true ){
// optionsCloneと比較して、変更がある場合、保存
this.save_options( true );
this.restore_options();
}
}

メンバー変数を追加の度に、Equalsも追加しないといけないので、
データが多くなるなら、memcmpみたいな対応した方がよいはず。。。
実は Equalsでチェックすると、インスタンスが異なる場合もメンバを比較するものだと思っていました。
コード書いた後、毎回セーブにいくので調べて、間違えに気づき、
仕方ないので、Equalsをoverrideしてメンバ比較するようにして、
GetHashCodeも必要っていわれたので、追加してという流れで、後手後手のコードです。
※GetHashCodeはメンバ変数のGetHashCodeでよい、複数の場合はXOR

optionsメニューに入ったときに、restore_options() やって
メニューから出るときに、auto_save_options() やってます。
2012-12-01(Sat)

12月に入ったので。。。

もう一ヶ月たってしまいました、だんだん今月リリース結構厳しいかもなと思ってきました。
今はメニューの遷移とか作ってます。

今日知ったのですが、Prehabって入れ子にしたら駄目(Unity3.5)なんですね、いくつかやっちゃってました。
なんかデータ更新しても変更が来ないときあるなって思ってましたが、調べたら偉い人が言ってました。
ネストされたPrefabの代わりとしてリンクしたPrefabを使おう

リンクしたPrefabって、Inspectorなんかで紐付けるやつなのかな、
Instantiatingしなければいけなくなって面倒くさいなって思いました。
データ更新しても、変更いかなかくて、Prefab作り直すよりは遥かにましですが。。。

11月やったのはこんな感じ
・データ保存関連対応
・ゲーム中の2DをNGUIに置き換え、開始時のカウントダウン(仮)
・ゲーム終了時のlocalランキング表示(仮)
・入力判定調査修正、FingerGestures削除、入力もresolutionScale変換するように
・SE再生関連の管理追加
・Swarm組み込み
・AdMob表示するように

仮なところが多いです、ほとんどが仮かも、全部仮のような。
ゲーム部分を殆どいじってないですですね、入力判定の差し替えしかやってないよ

大きく残っているのは、
・メニュー、optionsとか、leaderboradとか
・ゲーム中のBGどうするか
・サウンド関連(BGM)どうするか
・リリースに必要なこと、署名入りビルドやアイコンなど
・vibration対応したい

ブラッシュアップしなきゃいけない箇所は山盛りなので、後一ヶ月でできるとかは怪しいです。
とにかく残っているところを潰していくしかないかな。
簡単なカジュアルゲームの筈なのに。。。
一回ちゃんと作れば、次とかはかなり使いまわせるので、まじめにやっといて損はないはず!
次とかあればですが。。。

Advertising


カテゴリ
記事一覧
最新記事
最新コメント
最新トラックバック
月別アーカイブ
プロフィール

tasogare66

Author:tasogare66
ひっそり週末プログラム
@tasogare66

【Androidアプリ】


Wipes Arrow
(スワイプアクション)

review site
Uni本
リンク
RSSリンクの表示
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。