SimpleSpriteGUI.cs解析詳細
SimpleSpriteGUI.cs解析詳細
SimpleSpriteGUI.csの解析
MonoBehaviourを継承していない純粋なクラス。基本的にマトリックス計算で変換の合成行列を得て矩形の計算と描画を行うようになっている
生成してる行列は
- 描画用の行列
- 表示矩形領域rectの値を求める為の行列
のふたつ。移動はx,-yの二次元で回転はZ軸を中心とした角度、それと2軸のスケール。
- create
初期化処理
- draw
is_visible及びis_update_matrixの状態フラグにより描画を実行
- setTexture
テクスチャ画像のセット及びピヴォットのセット
- setPosition
- setScale
- setAngle
各更新。is_update_matrixをtrueに
setColor
setAlpha
各更新
- calc_matrix
マトリックスの更新
操作対象はx,y軸に対して
positionのy軸を逆にしてpivot分を減算して移動。これを画面中央へ移動
matrix_trans_rect 行列作成
単位行列を適用
移動要素を積算
ピヴォット分移動
Z軸を中心にangle回転
ピヴォット分戻す
Z軸を中心に-angle回転
ピヴォット分移動
スケール
ピヴォット分戻す
の順番で積算して合成行列を作成・・・
???この意味がよく分らない。何故、動かして戻してを繰り返すのだろうか????
最終的にここで作成された合成行列はrectの作成の為に積算される
又、逆行列が描画用のマトリックスと積算(割り算)される
- calc_rect
矩形の計算
疑問点を探る為単純なマトリックスを利用したGUI表示のコードを作成
using UnityEngine;
using System.Collections;
public class GUITest1 : MonoBehaviour {
public Texture texture; float angle; Vector3 pivot,scale;
void Start () { scale = new Vector3(1.5f,1.5f,1); pivot = new Vector3(texture.width/2.0f, texture.height/2.0f, 0.0f); }
void OnGUI () { DrawMatrix(); }
void DrawMatrix () { angle = Time.timeSinceLevelLoad*60; Matrix4x4 mat; mat= Matrix4x4.identity;
mat *= Matrix4x4.TRS(new Vector3(256,256,0),Quaternion.identity,Vector3.one); mat *= Matrix4x4.TRS(pivot,Quaternion.identity,Vector3.one); mat *= Matrix4x4.TRS(Vector3.zero,Quaternion.AngleAxis(angle,Vector3.forward),scale); mat *= Matrix4x4.TRS(-pivot,Quaternion.identity,Vector3.one);
GUI.matrix = mat; GUI.DrawTexture(new Rect(0,0,texture.width,texture.height),texture); }
}
問題なく動いているように見える
SimpleSpriteのソースコードではRectを求めていたが、その必要性が解らない。今後もう少し検証の必要性を感じる
しかしunityの新しく追加された2D機能でこれを調べる意味は薄くなってしまったように感じる。この件は時間が出来たら調べる事にする
- 最終更新:2013-12-11 18:28:32