2015年10月30日金曜日

Unityスプライトの回転と反転

  Unityでスプライトやオブジェクトを回転されるサンプルコード。
単純に向きを変える場合を想定しています。

    private GameObject go=回転対象;

回転

  private void Kaiten(){
        Coms.SetZRP (go.transform90f);

    }


左右反転

    private void Hanten(){

        Coms.SetYRP (go.transform180f);
    }


    public void SetZRP(this Transform transformfloat x)
    {
        Vector3 newPosition = 
            new Vector3(transform.localRotation.x,transform.localRotation.ytransform.localRotation.z+x);
        
        transform.Rotate(newPosition);
    }
    public void SetYRP(this Transform transformfloat x)
    {
        Vector3 newPosition = 
            new Vector3(transform.localRotation.x,transform.localRotation.y+xtransform.localRotation.z);
        
        transform.Rotate(newPosition);
    }


反転はキャラクターの向きを左右に切り替える時に使用します。
Unityのトランスフォーム操作はゲッタセッタを使用する場合とイコールで代入する場合がありややこしいです。


2015年10月29日木曜日

Unity 時間差をつけて音を鳴らす

Unityで時間差をつけて音を鳴らしたい場合のサンプルです。
MonoBehaviourを継承しているクラスから使用できます。
引数は(this、オーディオソース、待ち時間秒)です。

以下サンプル

  public void Jikansa(MonoBehaviour mb,AudioSource ad,float time) {
        //ループコルーチン
        mb.StartCoroutine(JikansaMati(ad,time));
    }
    private IEnumerator JikansaMati(AudioSource ad,float time) {
        yield return new WaitForSeconds(time);
        Narasu(ad);
        
    }
    private void Narasu(AudioSource ad){
        if (isMute == false) {
            ad.Play ();
        }
    }


MonoBehaviourを継承していないクラスからのStartCoroutine使用を想定しています。
UnityのオーディオソースはOnAudioSetPositionやOnAudioReadなどの開始や変更のコールバックはあるのですが、終了のコールバックがありません。
audio.clip.lengthをタイマーにしてコールバックの代わりに使うなど工夫が必要です。

Unity複数のスプリプトをセット化するRequireComponent

Unityではゲームオブジェクトにスクリプト(クラス)を貼り付けてアタッチします。
その際にスクリプトをセットでアタッチしないといけない場合があります。
例えば、コライダーとリジットボディのような。
複数のスクリプトのアタッチを忘れないようにするのが
RequireComponentです。
以下の場所に宣言することでアタッチの際にスクリプトを自動追加します。
using System.Collections;
[RequireComponent(typeof(スクリプト名))]
public class ABC : MonoBehaviour{}
スクリプトからスクリプトをアタッチしているわけではありません。
デフォルトでゲームオブジェクトにセットされます。

2015年10月27日火曜日

unity アニメーターの遷移を自動で戻す

unityのアニメーターの遷移についてメモ。
デフォルトのアニメーションを起点にしてアクションを付ける場合。例えば

待機→攻撃→待機

など。攻撃動作が終わったら自動的に待機に戻りたい場合。
triggerを使用します。
    void Start () {
        anime = GameObject.Find ("オブジェクト").GetComponent<Animator> ();
    }
    
    public void ACT(){
        //anime.SetBool ("bool",true);
        anime.SetTrigger ("trigger名");
    }
}


triggerはSetTriggerで呼ばれた時に真になり、次のアニメーションへ遷移すると 偽になります。なので
待機→trigger→攻撃→適当なboolですぐに遷移→待機といった具合になります。
一度の攻撃アニメーションで元に戻ります。(最低表示時間を1アニメーションに)

2015年10月23日金曜日

Unity C# String二次配列からデータを検索するサンプル

unity用のルックアップ関数のサンプルソースです。
CSVを読み込んでString2次配列に入れるサンプルはこちら
unityでCSVを読み取るサンプル

    //探す文字、CSVデータ、探す列、返す列
    public string lookup(string name,string[,] str,int sagasu,int kaesu){
        string tmp = "";

        for (int i=0i<str.GetLength(0); i++) {
                        if (name.Equals(str[isagasu])) {
                                tmp = str [ikaesu];
                                i = str.Length;
                        }
                }

        return tmp;
        }


エクセルのルックアップ関数ってこんな感じでしたっけ?
GetLengthとlengthを間違えることがあるので覚書。
lengthは2次配列全ての要素数。GetLength(0)は[x、y]のyを省いた要素数。次元を一つ減らして数えるイメージです。

2015年10月19日月曜日

unity Could not fetch error messages from compilerInvalidOperationException

UnityでCould not fetch error messages from compilerInvalidOperationExceptionが発生しました。MonoDeveloperでファイルのディレクトリを移動したせいです。
以下エラーログ。
Could not fetch error messages from compilerInvalidOperationException: The process must exit before getting the requested information.
System.Diagnostics.Process.get_ExitCode ()
(wrapper remoting-invoke-with-check) System.Diagnostics.Process:get_ExitCode ()
UnityEditor.Utils.Program.get_ExitCode () (at /Users/builduser/buildslave/unity/build/Editor/Mono/Utils/Program.cs:104)
UnityEditor.Scripting.Compilers.ScriptCompilerBase.CompilationHadFailure () (at /Users/builduser/buildslave/unity/build/Editor/Mono/Scripting/Compilers/ScriptCompilerBase.cs:105)
UnityEditor.Scripting.Compilers.ScriptCompilerBase.DumpStreamOutputToLog () (at /Users/builduser/buildslave/unity/build/Editor/Mono/Scripting/Compilers/ScriptCompilerBase.cs:116)
UnityEditor.Scripting.Compilers.ScriptCompilerBase.GetCompilerMessages () (at /Users/builduser/buildslave/unity/build/Editor/Mono/Scripting/Compilers/ScriptCompilerBase.cs:98)
どうやらUnityとMonoDeveloperでのメッセージがやり取りできないとこのこと。

解決策

UnityとMonoDeveloperを再起動。

Unityリソースから動的にスプライトを変更

Resources/Spritesフォルダをあらかじめ作成してそこにスプライトを入れてください。マルチスプライトを使用する場合は配列で取得してマルチスプライト名をFinedで取得します。

リソースフォルダからスプライトを取得
    public Sprite getSprite(string name) {
        
        // Resources/Sprites/SpritesName 

Sprite sp = Resources.Load<Sprite>("Sprites/"+name);
        return sp;
    }

ゲームオブジェクトのスプライトを変更
    public static void SetSprite(this GameObject go,Sprite sp)
    {
        SpriteRenderer sr;
        sr = go.GetComponent<SpriteRenderer>();

        sr.sprite = sp;
    }

2015年10月14日水曜日

GooglePlayとiTuneStoreアプリの検索順位SEO比較

GooglePlayとiTuneStoreのアプリの検索順位の重点を比較してみました。

共通

ダウンロード数
評価数(3星以上の)

GooglePlay

アプリのページがGoogleのサーチエンジンと同じ評価方式。そのため被リンクが多くなるにつれて順位があがる。
 日本語での被リンクが増えるため日本向けに順位が高く設定される。
日本向けのアプリに強い。

iTuneStore(Apple)

iTuneConnectで設定したアプリ名とキーワードが優先される。
 言語に影響されないため、世界共通の順位になる。
外国向けのアプリが強くなる。

Can't add script component "script_name" because Unityエラーメッセージ

スクリプトをゲームオブジェクトにアタッチしようとしたら以下のエラーメッセージが。
Can't add script component "script_name" because
要するにスプリプトが見つからないとこのとです。
Unity上のスプリプト名とMono上のクラス名一致しない場合に起こるエラーです。
クラス名をXXXAPKと書いたつもりがXXXAKPになっていました。
unityとmonoは日本語入力に弱いため英数入力でファイル作成をしなければ入力がキャンセルされてしまいます。F10で半角にしてもだめです。