2014年5月11日日曜日

テクスチャをスクロールするサンプル

Unityにてテクスチャをスクロールするサンプル。言語はC#



使用する関数は SetTextureOffset()。
テクスチャをオフセットして貼り付けることでスクロールを実現する。

SetTextureOffset("_MainTex", new Vector2(offsetX ,offsetY));

  • オフセット値(offsetX, offsetY
    テクスチャの縦横ピクセルサイズに関わらず、0~1.0未満の比率で指定となる。
    1.0は0.0と同義になる感じなのでテクスチャをREPEATで貼っておけば1.0以上でもオフセット指定はできる感じだが、一応0~1.0未満範囲で指定しておいたほうが間違いないと思う。
     
  • オフセット対象 ("_MainTex"
    シェーダーが「Bumped Diffuse」等の場合で、テクスチャとノーマルマップを共に使う場合は両方をオフセットする必要有り。
    _MainTex" はテクスチャを、"_BumpMap"はノーマルマップを指定する。

    シェーダーが Mobile/Bumpoed Diffuse の場合は、"_MainTex"指定だけで Normal Map も同時にオフセットする。

Androidアプリ等向けだと Mobile/ほにゃらら をよく使いそうなので、"_BumpMap"は使わないかもしれない。
※逆にこれの意味するところは、ノーマルマップを固定のままで、テクスチャだけはずらせない制限とも言えそう。

-----
/*
 *    @file    TexAnimate_Test.cs
 *    @note        なし 
 */
using UnityEngine;
using System.Collections;

public class TexAnimate_Test : MonoBehaviour {
    void Awake(){}
    void Start (){
        Init();
    }
    void OnApplicationFocus(){}
    void OnApplicationQuit(){}
    void OnApplicationPause(bool pauseStatus) {
        if(pauseStatus){ //Suspend (back to OS)
        }
        else{ //Resume (From OS)
        }
    }
    void OnGUI(){
        DrawGUI(); // 操作ボタン、2D文字描画
    }
    void Update() {
        //Debug.Log ("Update:");
        if(Application.platform == RuntimePlatform.Android && Input.GetKey(KeyCode.Escape)){//戻るボタン対応
            Application.Quit();
        }
        AnimateTexture(); // テクスチャスライド
    }
    //============================================================

    public float tex_offsetX = 0.0f; //!< テクスチャオフセット X。※Editorから操作も可
    public float tex_offsetY = 0.0f; //!< テクスチャオフセット Y。※Editorから操作も可

    public float C_tex_Add = 0.001f; //!< テクスチャ スライド分解能
    float tex_Add;
    void Init(){
        tex_Add = -C_tex_Add;
    }
    void AnimateTexture(){
        tex_offsetX += tex_Add;
        if(tex_offsetX<=0.0f){
            tex_offsetX = 1.0f - C_tex_Add;
        }
        if(tex_offsetX>=1.0f){
            tex_offsetX = 0.0f;
        }
        //    See detail: https://docs.unity3d.com/Documentation/ScriptReference/Material.SetTextureOffset.html
        //renderer.material.SetTextureOffset("_BumpMap", new Vector2(tex_offsetX, tex_offsetY));// Mobile/Bumpoed Diffuseでは不要
        renderer.material.SetTextureOffset("_MainTex", new Vector2(tex_offsetX, tex_offsetY));// Mobile/Bumpoed Diffuse ではNormal Mapも同時に動く
    }

    string DebugMessage = "";
    void DrawGUI(){
        //if(true)return;
        //Debug.Log ("OnGUI:");
        GUIStyle labelStyle;    //!< GUIフォント表示用スタイル
        int fontRetio = 18;
        
        labelStyle = new GUIStyle();
        labelStyle.fontSize = Screen.width / fontRetio; // Font size
        labelStyle.normal.textColor = Color.grey;
        labelStyle.wordWrap = true;
        GUI.Label(new Rect(0, 0, Screen.width-100, Screen.height-100), "Offset X="+tex_offsetX+"\nOffset Y="+tex_offsetY, labelStyle);

        float ScrnHor = (float)Screen.width;
        float ScrnVert = (float)Screen.height;
        Rect rectBtn = new Rect(ScrnHor*0.12f,ScrnVert*0.10f,ScrnHor*0.76f,ScrnVert*0.05f);
        if(GUI.Button(rectBtn, "[SLOW FWD]")) {
            tex_Add = -C_tex_Add;
        }
        rectBtn = new Rect(ScrnHor*0.12f,ScrnVert*0.15f,ScrnHor*0.76f,ScrnVert*0.05f);
        if(GUI.Button(rectBtn, "[SLOW BWD]")) {
            tex_Add = C_tex_Add;
        }
        rectBtn = new Rect(ScrnHor*0.12f,ScrnVert*0.20f,ScrnHor*0.76f,ScrnVert*0.05f);
        if(GUI.Button(rectBtn, "[STOP]")) {
            tex_Add = 0.0f;
        }
        rectBtn = new Rect(ScrnHor*0.12f,ScrnVert*0.25f,ScrnHor*0.76f,ScrnVert*0.05f);
        if(GUI.Button(rectBtn, "[FAST FWD]")) {
            tex_Add = -C_tex_Add * 10.0f;
        }
        rectBtn = new Rect(ScrnHor*0.12f,ScrnVert*0.30f,ScrnHor*0.76f,ScrnVert*0.05f);
        if(GUI.Button(rectBtn, "[FAST BWS]")) {
            tex_Add = C_tex_Add * 10.0f;
        }
    }
}
-----


Unity5用 Project: GitHubサイト右下の「Download ZIP」からダウンロード可。
https://github.com/maruton/Sample_TextureSlide

Unity4用 Project: Google Drive


※追記:Android実機用前提ソースのままなので、Unity上だとノーマルマップはスライドしません。
     ソース内 AnimateTexture() で"BumpMap"指定部分がコメントになっています。
     このコメントを外せば、Unity上でノーマルマップもスライドします。





0 件のコメント:

コメントを投稿