2015年8月1日土曜日

unity推奨されるデータの保存サンプル

iOSとAndroidでも使用できるunityのデータ保存のサンプルソースです。
保存データ用のクラスをシリアライズして保存しています。
確かunityの推奨している保存方法の一つだったと思います。
iOSnoバージョンが古いとエラーが発生するので旧式の端末ではテストできないかも?

//使用例
    private SaveDatas sd ;
    private string SAVE ="key文字列";
    private void DataSave2(){
        SaveKanri.Save(SAVE, sd);
        PlayerPrefs.Save();

    }
    private SaveDatas DataLoad2(){
        SaveDatas data_str = SaveKanri.Load<SaveDatas>(SAVE);
        if( data_str != null){
            return data_str;
        }else{
            return new SaveDatas();
        }


//管理クラス
using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class SaveKanri : MonoBehaviour{
    
    public SaveKanri(){
    }
    
    public static bool Save<T>(string prefKey,T obj){
        MemoryStream memoryStream = new MemoryStream();
        #if UNITY_IPHONE || UNITY_IOS
        System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
        #endif
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize( memoryStream, obj );
        
        string str = System.Convert.ToBase64String( memoryStream.ToArray() );
        try {
            PlayerPrefs.SetString ( prefKey, str );
        } 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;
    }

}

//保存するデータクラス
using System.Collections;
[System.Serializable()]
public class SaveDatas{
    [System.Serializable()]
    public class InnerClass{
        public string instr1;
        public int inint;
    }

    public string str1;
    public int[] int10;
    public InnerClass inClass;
    
}


以前までusing PlayerPrefs = PreviewLabs.PlayerPrefs;を使用して保存していました。最近どうもPreviewLabs.PlayerPrefsで以下のエラーが発生して他の保存方法に切り替えました。
以下がエラーログ
PlayerPrefs.Flush NullReferenceException Object reference not set to an instance of an object

2015年7月30日木曜日

Unity 日付型のチェック

Unityで文字列が日付型であるかをチェックするサンプル
C#だとout修飾 子が必要なんですね。

using System;
        DateTime dt;        string str ="2001/1/11";
        if(DateTime.TryParse(str,out dt)){}

関連エラーログ

 error CS1502: The best overloaded method match for `System.DateTime.TryParse(string, out System.DateTime)' has some invalid arguments
 error CS1620: Argument `#2' is missing `out' modifier
error CS1501: No overload for method `TryParse' takes `1' arguments

2015年7月29日水曜日

iTunesConnectが繋がらないTunes Connect is temporarily unavailable.

数時間前からiTunesConnectが繋がりません。
ブラウザは読み込み中のままになるか以下の表示になるかです。
Tunes Connect is temporarily unavailable.
特にメンテナンスの通知はありませんでした。単にサーバーの障害でしょうか?
Safariを使用しても同様です。
ツイッターでも同様の報告が上がっています。
appleは相変わらず黙りです。

2015年7月28日火曜日

Unity uGUIテキストボックスの値の取得と変更

UnityのテキストボックスはuGUIのinputfieldになります。
inputfieldには二つの子オブジェクトがあり、その一つのTextオブジェクトのTextスクリプトのtextフィールドが入力されたあたいになります。
訂正inputfieldのtextフィールドからしか書き込みができませんでした。
以下がテキストデータの取得と変更のサンプルです。

using UnityEngine.UI;

        Text txt;
        txt = GameObject.Find ("I
putfield/Text").GetComponents<Text>()[0];

        Debug.Log (txt.text);//現在の値を表示
txt.text="変更";

訂正

    InputField inp;
        inp = GameObject.Find ("Namae").GetComponents<InputField>()[0];
        inp.text ="inpu!";
        Debug.Log (inp.text);



この文法はよく使うので覚えておくといいです。GameObject.Find ("Iputfield/Text").GetComponents<Text>()[0];

2015年7月21日火曜日

Unity uGUI Image画像を動的に変更する

インスペクタから画像を設定して、適当なボタンに画像変更()を割り当てます。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class スクリプト
 : MonoBehaviour {

    public Sprite 画像1;
    public Sprite 画像2;


    private GameObject obj;
    private Image image;

    void Start () {
        obj = GameObject.Find("image(imageオブジェクトの名前)").gameObject as GameObject;
        image = obj.GetComponent<Image> ();
    }

    public void 画像変更(){
        image.sprite = 画像2;
    }

}

Unity uGUI Textの文字がボケる場合のチェック

 uGUIのTextオブジェクトの文字がぼやけることがあります。
Unityのdpi制御が解像度に依存する仕組みだからです。
以下の原因かもしれません。

  • Gameウインドウの解像度がディスプレイの解像度より大きくなっている
  • campusオブジェクトのアスペクトを以下のように固定している

文字がぼやける設定
campus scaleに注意
GUIのアスペクト比を固定すると発生しやすい事象です。

2015年7月17日金曜日

google play開発者サービスで原因不明の問題が発生しました

スマホゲーム中に以下のエラーが発生しました。
ダイアログ「google play開発者サービスで原因不明の問題が発生しました」
PCもスマホも定期的に初期化をしないと様々な不具合が発生します。
解決方法

  • GooglePlay開発者サービスをインストールしなおす。

GooglePlay開発者サービスのダウンロードは以下です。
https://play.google.com/store/apps/details?id=com.google.android.gms&hl=ja

端末固有の不具合の可能性もあるのでビューから自分の端末を選択して調べてみましょう。