fc2ブログ
    05 «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.» 07

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

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

     

    【ハルシオンブログ】Androidでバックボタンでアプリを終了させるとき? 

    こんにちは。
    大坂です。

    今日から11月ですね!
    今年もあと2ヶ月です…orz

    さて、今週もタイトル通りですが、Unityでアプリを作ったときのAndroidアプリのバックボタンのお話。
    終わらせるだけならこんな書き方ができるよってだけですが。

    とりあえず今までやってた方法。
    void Update () {
    if(Input.GetKeyDown(KeyCode.Escape)) {
    Application.Quit();
    }
    }

    これでバックボタン押すと終了します。
    これを1行にできる。
    void Start () {
    Input.backButtonLeavesApp = true;
    }

    これでもバックボタンを押すとアプリが終了されますね!
    簡単にアプリを終わらせたいだけならこれで十分な機能なので紹介でした。

    では超絶に短いですが今週もこれにてノシ

    Category: 開発日記(Unity)

    Thread: プログラミング

    Janre: コンピュータ

    Tag: Unity  Android  ボタン 
    tb 0 : cm 0   

    【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