10 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.» 12

ハルシオンシステムの気ままBlog

株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

 

【Unity】みなさん、データの保存ってどうやってます?俺はこうやっちゃってます。 

こんにちは!坂内です。
台風19号でかいっすね。直撃御免って感じですが、みなさん大丈夫でしょうか?
いきなり肌寒くなってきて、風邪にも注意でごわす。

さて、本日はUnityにおけるデータの保存についてちょこっと書いてみます。

皆さんUnityでゲームを作る際、データの保存はどのように行ってますか?
基本、少ないデータならばPlayerPrefs、もしくはテキストとかのデータファイルに書き込みってのが一般的なんですかね?
他にもDBとしてSQLiteとか使えるようですが、使ったことありません。うひひ

PlayerPrefsですと、「string」「int」「float」くらいしか使えませんよね?
これってめんどいですよね。色々なデータをわざわざintとかfloatに変えないと保存できないし、ロードの際にも逆に変換とかしないといけないと・・・・・
そういえば、どこかにPlayerPrefsXというのもありましたね。以前ちょっと使ったことはあります。

ってことで、僕はいつも以下のクラスを使っております。(これどこかのサイトで見つけたんだと思ったけど・・・どこか忘れました)

「FileController.cs」

using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class FileController : MonoBehaviour{

public FileController(){
}

public static bool Save<T>( string prefKey, T serializableObject ){
MemoryStream memoryStream = new MemoryStream();
#if UNITY_IPHONE || UNITY_IOS
System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
#endif
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize( memoryStream, serializableObject );

string tmp = System.Convert.ToBase64String( memoryStream.ToArray() );
try {
PlayerPrefs.SetString ( prefKey, tmp );
} catch( PlayerPrefsException ) {
return false;
}
return true;
}

public static T Load<T>( string prefKey ){
if (!PlayerPrefs.HasKey(prefKey)) return default(T);
#if UNITY_IPHONE || UNITY_IOS
System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
#endif
BinaryFormatter bf = new BinaryFormatter();
string serializedData = PlayerPrefs.GetString( prefKey );

MemoryStream dataStream = new MemoryStream( System.Convert.FromBase64String(serializedData) );
T deserializedObject = (T)bf.Deserialize( dataStream );

return deserializedObject;
}

public void save(SaveData data) {
// 保存用クラスにデータを格納.
FileController.Save("{PlayerPrefsに保存するキー}", data);
PlayerPrefs.Save();
}

public SaveData load() {
SaveData data_tmp = FileController.Load("{PlayerPrefsに保存するキー}");
if( data_tmp != null){
return data_tmp;
}else{
return null;
}
}


「SaveData.cs」実際に保存されるクラス
using System.Collections;

[System.Serializable()]
public class SaveData{
[System.Serializable()]
public class InnerClass{
public string ppppppp;
public int ggggggg;
}

public int aaaaaaa;
public float bbbbbb;
public string cccccccc;
public int[] ddddddd;
public InnerClass eeeeeeee;

}

と、まぁどんな形のクラスでもいいですが、シリアライズできるならそのままマルっと保存できちゃいます。
もちろん上記のように内部クラスがあっても問題ナッシング!
なんでも保存できちゃうのが素敵っすよね!
もちろん、AndroidiOSどっちも対応してます。

ということで、Unityのデータ保存ライフ楽しんで! アデュ~ノシ

スポンサーサイト

Category: 開発日記(Unity)

Tag: Unity  Android  iOS 
tb 0 : cm 0   

【Unity】NGUIでのロングタップ処理 

モンスラが好評です!ありがとうありがとう!
あと少しで1万DLいきまっす!!
現在は来年1,2月にリリースをしたいと思っている
RPGを開発中!RPG開発中!大事なことなので2回言いました。
これまた面白いものになりますので楽しみにしてください!

モンスラの新機能を考えながら新しいアプリのリリース!
はたまたiphoneにモンスラを移植するか・・・
何に手を付けたらいいのか悩んでいる坂内です。

さて、今日はNGUIにおけるロングタップについてです。
まぁ簡単なのでみなさんすでに実装されていると思いますが、
今回ロングタップを実装しようとして、なにか簡単にやる方法はないかと
ぐーぐる先生に聞いたのですが、なんも教えてもらえなかったので
適当に実装してみました。

手順は以下です。
NGUIでボタンつくりまーす
②スクリプト用意しまーっす。
③UIButtonだと、On Clickしかないため、UIButton Messageを用意しまーす。
④もいっこUIButton Messageを用意しまーっす。
終わり。

では順番に説明をば。
【1 ボタンつくりまーす】
 これはそのままですね、ボタンをNGUIのWigetWizardから作成します。

 適当な絵を用意したので、Labelは消しております。

 
【2 スクリプトを用意しまーっす】
 今回用意したスクリプトは以下になります。
 
using UnityEngine;
using System.Collections;

public class LongTap : MonoBehaviour {
float longTapDuration = 2.0f;
float lastTap;
bool tapFlg;

void OnTap(){
tapFlg = true;
lastTap = Time.realtimeSinceStartup;
}

void OnRelease(){
tapFlg = false;
}

void Update(){
if(tapFlg && Time.realtimeSinceStartup - lastTap > longTapDuration){
print("aaaaa");
tapFlg = false;
}
}

}

 はじめのlongTapDurationは、ロングタップの時間を指定しています、2秒ロングタップすれば
 ロングタップ時の処理を実行するってことっすね。
 lastTapは、タップを始めた時間を保存するやつっす。
 メソッドといえば、OnTapが押された時、OnReleaseは離された時の処理っす。
 Updateにて、「押されている、且つ押され始めてからlongTapDurationの時間が経った場合」の条件で
 print分を処理しています。
 この際、tapFlgをfalseにしないとずっと押されていると処理が行われてしまいまっす。
 
【3 UIButtonだと、On Clickしかないため、UIButton Messageを用意しまーす】
 ButtonにUIButton Messageを追加します。
 「Add Component」⇒「NGUI」⇒「Interaction」⇒「Button Message」で追加できます。
 追加したら、先ほどのスクリプトを設定しているオブジェクトを「Target」に設定し、
 「Trigger」をOnPressに変更し、「Function Name」に先ほどのスクリプトで作った
 OnTapにします。

 
【4 もいっこUIButton Messageを用意しまーっす】
 3と同じくUIButton Messageを追加します。
 追加したら先ほどと同じ感じで「Target」の設定を行います。
 「Trigger」はOnReleaseに変更し、「Function Name」にはOnReleaseを設定します。


これでおしまいっ!
いちおうこれでできましたが、もっと簡単な方法あったらおせーてくださいませっ!

ではっ ノシ

Category: 開発日記(Unity)

Thread: 日記

Janre: 日記

Tag: Android  Unity  NGUI  タップ 
tb 0 : cm 0   

【Unity】Unity&Orthelloによる2Dゲーム作成⑦ 

はい、こんにちわ坂内でっす。

Unity難しいでっす。
土曜出社してAndroidゲーム【モンスラ】バージョンアップしたでっす。

今回の目玉は必殺技の追加、クリティカルヒット追加、フェアリー追加でしたが、実は軽くなってるんです!

Drawcallが劇的に減ってるんですよ!

Ver1.1まではフルメンバー(村人200人+ユニット199人x6クラス)の場合、Drawcallが200ほど。
重いです!これ重いんですよ!

Ver1.1までは各クラスごとにAtlasを用意し、合計7Atlasを使用していました。
Ver2では少しでも軽くしようと、GUIまわりのAtlasを一つにしたり、ユニットのAtlasをつにまとめたりしたところ、なんとDrawCall30!!!

この劇的変化!! DrawCall 200 ⇒ 30!!

ただし、スマホだとさすがにSpriteの多さが問題か、重いんです!
DrawCallの問題だけじゃあぁないっすね!!
今後軽くする方法を検討してみますが、ちょっとこれ以上はきついかな?
タップ時の攻撃エフェクトを他のAtlasと1つにしてみようという案は考えてますが・・
あと、Unity4.3によって2Dゲームまわりにどのような変化がくるか楽しみですね!!

と、いうことで今後もモンスラよろしくお願いします!

Category: 開発日記(Unity)

Tag: Android  ゲーム  2Dゲーム  Sprite  Unity 
tb 0 : cm 0   

【Unity】Unity&Orthelloによる2Dゲーム作成⑤ 

はいはーい 月曜の坂内っす。

ちょっとしたOrthelloを使用した時のコツを。

普通のオブジェクトの場合、iTweenを使用することで簡単に透明度を変更できます。
透明度を1⇒0⇒1と繰り返すことで、オブジェクトの点滅を実装することができます。

cubeというオブジェクトを作成し、マテリアルを張ります。
透過が可能なShaderを指定します。
そして、以下のコード書くことでcubeオブジェクトの点滅が可能になります。
void Start(){
GameObject cube = GameObject.Find("cube");
iTween.ColorTo(cube,iTween.Hash("a",0,"looptype","pingpong","time",2f));
}

上記コードの説明をしますと、「cubeオブジェクトの色要素 a (アルファは透過度)を2秒かけて0にする。
0になったら今度は2秒かけて1にする(pingpongによって動作を繰り返す)」となります。

これで簡単に点滅が可能です。

しかし!BUT!!!
OrthelloSpriteは上記と同じことを行うとエラーがでてしまいます。
Material doesn't have a color property '_Color'
UnityEngine.Material:GetColor(String)
iTween:GenerateColorToTargets() (at Assets/iTween/Plugins/iTween.cs:3338)
iTween:GenerateTargets() (at Assets/iTween/Plugins/iTween.cs:3144)
iTween:TweenStart() (at Assets/iTween/Plugins/iTween.cs:4603)
c__Iterator7:MoveNext() (at Assets/iTween/Plugins/iTween.cs:6567)

ナゼカ?

エラーをみると、Colorプロパティが無いといわれます。
そう、OrthelloSpriteではShaderが「mobile/Particles/Alpha Blended」になるため、Colorプロパティが存在しないからです。

しかし、よく見るとOTSpriteの中に「Alpha」というプロパティが存在します。


これを0⇒1⇒0とすることで、点滅を実装することが可能です。

では、どのようにこれをいじるのか?

iTweenのメソッドには「ValueTo」というものが用意されています。
これは、値をaからbにするというもので、使い方は以下のように使います(たぶん)。
void Start(){
GameObject cube = GameObject.Find("cube");
iTween.ValueTo(gameObject,iTween.Hash("from",0,"to",1,
         "time",2f,"onupdate","ValueChange"));
}

void ValueChange(float value){
print (value);
}
0から1まで2秒かけて変わる。


となります。
これを踏まえて、以下のようにコードを書けば・・・・
using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class Test : MonoBehaviour {

OTSprite cubeSprite;

void Start(){
cubeSprite = GameObject.Find("cube").GetComponent();
iTween.ValueTo(gameObject,iTween.Hash("from",0,"to",1,"time",2f,
"looptype","pingpong","onupdate","ValueChange"));
}

void ValueChange(float value){
cubeSprite.alpha = value;
}
}

こんな感じで、OrthelloのSpriteを点滅することができます。

以上!なにかのお役に立てたらこれ幸い。

Category: 開発日記(Unity)

Thread: 日記

Janre: 日記

Tag: Android  Unity  Orthello  ゲーム  Sprite  iTween 
tb 0 : cm 0   

今までとはちょっと違いファンタジー風ゲーム作成はじめました  その弐 

月曜の坂内っす。

先週月曜に話をしていたファンタジーっぽいゲームなんですが、21日リリースします!いや、したいです!
なんとなーく できてきました。
これちょっと面白いんじゃないかなーというか、面白いです!
写真はリリースまでおあずけです!

①簡単操作
②仲間を増やす
③敵を倒してお金を稼ぐ
④装備アイテムも盛りだくさん!(アイテムは全部で50種以上!?)
⑤アチーブは全100個!!!!!!!

どっすか?興味でません?

あれ?開発者ブログじゃない?って声聞こえそうなので1つ。

Unityゲームを開発している時、画面に表示する文字列は専ら「3DText」を使用しています。
この話以前しましたっけ?ただ問題がありまして、3DTextを多量に使うと文字が欠けてしまったり、
上手く表示できなくなってしまいます。
原因はわかりません!
そのため、固定の文字列等は画像にして張り付けたりしてます。

なにか解決方法わかる方ご教授くださいませ!

以上!

Category: その他日記

Tag: Android  Unity  ゲーム  2Dゲーム  ファンタジー 
tb 0 : cm 0