2015年9月9日水曜日

unity c#:数値の符号を取り除く

三次元で座標や加速度を計算する際にプラスとマイナスが混ざって分かりにくいです。
unityでは符号を取り除く関数Mathf.Abs()があります。
以下のように絶対数を返してくれます。
Mathf.Abs(10.5f)=10.5f
Mathf.Abs(-10.5f)=10.5f
引数はintとfloatどちらも使えます。

unity2d:キャラクターを瞬きさせるサンプル

2dキャラクターの瞬きを実装するには、一定秒数間隔で動作するコルーチンを使用します。
以下の方法を使えば一定時間置きに動作させられます。

    void 瞬き開始() {
        //ループコルーチン
        StartCoroutine(loop());
    }
    private bool FLML=true;//終了フラグ
    private float fme=5f,MABATAKI=10f;//10秒間隔で瞬き
    private IEnumerator loop() {
        // ループ n秒間隔

        FLML = true;
        while (FLML) {
            yield return new WaitForSeconds(fme);
            onTimer();
        }
    }
    private bool FLM=true;
    private void onTimer() {
        if (FLM) {
            目を閉じる
            FLM =false;
            fme=0.2f;//閉じている時間は短く
        } else {
            目を開ける
            FLM =true;
            fme=MABATAKI;
        }
    }


キーワード。コルーチン、タイマー

private bool FLM=true;が抜けていたので修正しました。

編集したmp3ファイルの先頭に無音部分が追加される

ゲームの交換音を切れ目なくループさせようとしたところ、Audacityで編集した音声ファイルの開始部分に無音部分が追加されていた
追加された無音時間は0.05秒。ノイズの効果音だと一瞬の切れ目が耳についてしまいます。

原因

mp3は圧縮の構造上無音部分が追加されてしまう。

解決方法

wev、ogg、accなどの形式で保存する。
Audacityならoggで保存できます。unityでもogg形式を扱えます。

2015年9月4日金曜日

amazon本日の無料アプリが終了

 amazonの日替わり無料アプリ配布が2015年8月26日に終了しました。
欧米では代わりになるサービス「amazon underground」が開始されています。
 「amazon underground」は有料アプリを無料で使用できるサービスです。利用者にとっては本日の無料アプリと同じです。※一日限りではなく常時配布されている。
 違いは開発者への見返りです。アプリの使用時間に応じてamazonが開発者へ代金を支払います。※今までは開発者には一銭も入ってこなかった。
 日本でのサービス開始は2〜3ヶ月後かと思われます。

2015年8月16日日曜日

Wimaxの帯域減少による速度計測2

Wimaxは9月いっぱいで帯域が4分の1になります。

今日の計測結果(室内)

  • あなたの回線速度
  • 6.919
  • Mbps


高崎は8月の時点では速度の変化はみられません。

2015年8月7日金曜日

unity 経過時間の取得

unity C#で経過時間と日数の取得方法。
ここに(dateOld)過去の日付を渡す。

using System;
//経過日数
    public int KeikaNissu(DateTime dateOld){
        DateTime no;
        n = DateTime.Now;
        o =dateOld;
        TimeSpan k = n - o;
        return (int)k.TotalDays;
    }

//経過時間    public int KeikaJikan(DateTime dateOld){
        DateTime no;
        n = DateTime.Now;
        o =dateOld;
        TimeSpan k = n - o;
        return (int)k.TotalHours;
    }

2015年8月1日土曜日

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

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

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

    }
    private SaveDatas DataLoad2(){
        SaveDatas data_str = SaveKanri.Load<SaveDatas>(SAVE);
        ifdata_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.SerializememoryStreamobj );
        
        string str = System.Convert.ToBase64StringmemoryStream.ToArray() );
        try {
            PlayerPrefs.SetString ( prefKeystr );
        } catchPlayerPrefsException ) {
            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.GetStringprefKey );
        
        MemoryStream dataStream = new MemoryStreamSystem.Convert.FromBase64String(serializedData) );
        T deserializedObject = (T)bf.DeserializedataStream );
        
        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