FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »uGUI
このページの記事一覧

【Unity】UI のフォーカスを外すコードと「Attempting to select while already selecting an object.」  


 最近まで気が付かなかったのだが、Unity の UI を使っていると、例えばマウスでボタンをクリックした後に、キーボードの [Enter] キーを押すとそのままフォーカスが残っていて、無駄に連打されてしまうことがある。

 そこでフォーカスを外す方法を調べたら「EventSystem.current.SetSelectedGameObject(null) を使うと良い」とあったので使ってみたのだが(※interactable を一旦 false にする手もあるが、元に戻す必要がある)、ごく稀にタイミングによっては以下のエラーが出ることがある。

Attempting to select while already selecting an object.
UnityEngine.EventSystems.EventSystem:SetSelectedGameObject(GameObject)
・・・(中略)・・・
UnityEngine.EventSystems.EventSystem:Update()

(※) Unity 2018.4.13f1 / Windows10(x64) で確認

 最初の1行(Attempting to select while already selecting an object.)を google翻訳にかけると…

既にオブジェクトを選択しているときに選択しようとしています。

 いまいち意味がわからなかったので「Attempting to select while already selecting an object.」でググってみると、以下の記事が出てきた。

選択中扱いとするゲームオブジェクトの管理
Event System SetSelectedGameObject Error, but code still runs fine.
Unity UI 4.6 inputfield bug or behavoir?

 ああ、なるほど「現在選択中のオブジェクトと EventSystem.SetSelectedGameObject」 の引数のオブジェクトと比較して、同じだったらエラー出してる」んだね、と理解できた。

 また、フォーラムでは「EventSystem.alreadySelecting」(EventSystem が SetSelectedGameObject に存在する場合は true を返す)を使うと良い、みたいなことが書かれてあったので、試してみたのだが、「フォーカスを外す」ときの引数に null を渡す場合、やはりたまにエラーが出ることがある。まぁ、Debug.LogError なら実害は無いのだが、なんとなく気持ち悪いので、他の方法がないかと試してみたら、以下のコードで上手くいった。

//現在アクティブとみなされる GameObject が null でないとき
if (EventSystem.current.currentSelectedGameObject != null)
{
EventSystem.current.SetSelectedGameObject(null); //フォーカスを外す
}

EventSystem.currentSelectedGameObject

 まぁ、使っているコードが EventSystem の static なメソッドのみなので、static なクラスに関数を作っても良いと思う。地味な挙動だが、かえってサンプルコードみたいのが出て来なかったので、備忘録として残しておく。





(関連記事)
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る
【Unity】IncrementalCompiler でのエラー:Unloading broken assembly Packages/com.unity.incrementalcompiler/Editor/Plugins/Unity.PureCSharpTests.dll, this assembly can cause crashes in the runtime
【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない
【Unity】EventTrigger のコールバック引数変わった?


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  Unityトラブルシューティング  uGUI 
tb: 0   cm: --

【Unity】タブ切り替えの UI をコードを書かないで作る  


 今回はスクリプト無しでタブ切り替え(TabStrip, Tabs Widget)を作る方法を紹介しよう。と言っても私が考えたわけではなく、内容的には海外記事の翻訳したものを、自分なりにアレンジしたものだったりする(笑)。

Unity UI: Easy Tabs (no scripting)



 タブの UI の実装に関しては、大抵スクリプトで画像を切替える方法がオーソドックスな気がするが、今回のように Toggle を上手く利用する方法もなるほどと感じたので、日本語記事にしておくと初心者にも役に立つんじゃないかと考えた(ググってもなぜかタブ実装の詳しい日本語記事が見つからなかったので)。それに何にしてもコードを書かずに済ませられるなら、それだけ労力を減らせるので、そういった方法は積極的に導入していくと良いと思う(アプリが大きくなるにつれ、大量のコードの管理・デバッグに時間を取られてしまうため)。


(※) Unity 2018.4.12f1 / Windows10(x64) で確認



■タブの backgroud 画像を用意する



 とりあえず、参考記事を真似して、もっと簡単な画像を用意したので、必要ならダウンロードして使って欲しい。もちろんダウンロードした素材は自由に加工して使って貰っても構わない(zip には psd と完成例の unitypackage も付けておく)。

>>サンプルの素材をダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)


 プロジェクトビューで適当なフォルダを作ったら、zip に入っている「Tab_altas.png」をドラッグドロップなどして、インポートして欲しい(.unitypackage はこの記事の完成例となっている。プレファブ化して利用するのも良いだろう)。

 「Tab_altas.png」をインポートしたら、まずはインスペクタで「Texture Type」を「Sprite (2D and UI)」に、「Sprite Mode」を「Multiple」にしよう。これは1つの画像を複数のスプライトとして利用する設定だ。



 次にそのままインスペクタから「Sprite Editor」を開いて、上部の [Slice]を押して、「Type」で「Grid By Cell Size」で「Pixel Size」を 64x64 にして、[Slice] して欲しい。これでグリッド状に 64x64 でスプライトが等分割される。



 分割したら、各スプライトをクリックすると、右下に「Sprite」の設定が出るので、Name(名前)や Border(引き伸ばしの領域)を設定しておこう。名前は左から「Tab_panel」「Tab_item」(わかり易い名前なら何でも良い)と付けておき、Border は各スプライトの LRTB を全て 18 にしておいて欲しい。完了したら、右上の [Apply] を押しておく。画像の引き伸ばし領域の設定に関しては以下の記事がわかり易いだろう。

UnityのSpriteを引き伸ばす際に綺麗に引き伸ばす方法 SpriteEditor






■タブの UI を作る

 スプライトの設定ができたら、本題のタブの UI を作っていこう。まずは背景のベースとなる画像(Image)を1つ置く。場所はどこでも良いが、とりあえず中央に置いておきたいので RectTransform の Pos を全て (0, 0, 0) にしておく。



 また、ついでに Image を置いたときに自動で追加された Canvas の「Canvas Scaler」を適当に設定しておく。ここでは「UI Scale Mode」を「Scale With Screen Size」に、「Reference Resolution」を「1920 x 1080」にしておいた。この辺りは自分の環境によって変えて欲しい。



 先ほど置いた Image も「TabPanel」と名前を変えておき、サイズも適当に決めておこう。ここでは 600 x 500 にしておいた。そして Image に「Tab_altas」の分割スプライトの「Tab_panel」を設定しておく



 次にタブの画像を並べるレイアウト用の空オブジェクトを作ろう。「TabPanel」をヒエラルキーで選択して、右クリックで「Create Empty」して、名前を「TabContainer」としておく。そして、[Add Component] から「Toggle Group」と「Horizontal Layout Group」を追加しておく。設定は自分の環境に合わせればよいが、「Child Control Size」と「Child Force Expand」をオンにしておけば、自動でレイアウトしてくれる。



また「TabContainer」の RectTransform は Pivot や引き伸ばしなどの設定をしておこう。これも画像などのサイズによるので、自由に設定しても構わない。設定例はキャプチャを参考にして欲しい。


 TabContainer を適当に設定したら、次に各タブを作っていこう。TabContainer を右クリックして、Toggle を置く。初期位置がおかしくなってたりしたら、一旦 Toggle をオフ→オンにすると自動レイアウトになっている場合、再配置される(セーブなど何らかの操作をすると再計算される)。

 置いた Toggle はわかり易いように「Tab 1」とでも名前を変えておき、「Toggle」コンポーネントの「Group」に、先ほど「TabContainer」にアタッチした「Toggle Group」を登録しておく。



 そして「Tab 1」を展開し、「Bacground」の Image にスプライト「Tab_atlas」の「Tab_item」を設定する。Color も A(アルファ)を下げておく。RectTransform は適当で良いが、上下ストレッチを設定しておこう。



 また、更に下の階層の「Checkmark」にも「Tab_item」を設定し、同じように RectTransform をストレッチ設定にしておく。あとはテキストとなる「Label」も適当に設定しておくと良いだろう。



 タブが1つできたら、「Tab 1」を [Ctrl + D] で適当に複製しよう。名前は適当に付けて欲しい。また複製したタブの「Toggle」コンポーネントの「IsOn」は全てオフにしておく(これも設定したら、一旦オブジェクトをオフ→オンすると再描画できる)。



 タブを並べたら、次に切り替える内容を作ろう。これも自分の環境によって何でも構わないが、「TabPanel」以下に適当に同じサイズの空オブジェクトをタブと同じ数だけ作り、内容を各オブジェクトに入れておく、ここでは「PageContainer」を作って「Page 1~3」を作ってテキストを入れておいただけだ。好きにやって貰って構わない。これらも「Page 1」以外は非表示にしておく(タブのオン/オフの初期状態に合わせておく)。



 Page 1~3 を作ったら、各対応タブに戻り、「Toggle」コンポーネントの「On Value Changed (Boolean)」にコールバックを設定しよう。これは Toggle.IsOn のオン/オフ状態が変化したときに、実行されるメソッドなどを登録するものだ。ここに各対応する「Page」の表示/非表示を設定する。具体的には「Tab 1」には「Page 1」の「GameObject.SetActive (Dynamic)」をセットし、同様に「Tab 2」には「Page 2」を、「Tab 3」には「Page 3」をセットする。ここでは表示の切り替えだけなのでコードを書く必要はないが、色々コールバックに仕込みたいなら以下の記事を参考にして欲しい。

【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録



 もし、クリックしたときのトランジション(色の変化)がいらないなら、各 Toggle の Transition の Target Graphic を None(元の画像を外す)にしておけば良い。



 これで完成だ。シーンを保存して動作を確かめてみよう。


VRM Live Viewer では、これをそのまま使っている。
色や文字を太字に変化するようにすれば、見た目も結構良くなる。
何よりタブ切り替えのコードを書かなくて済むので実装が楽だ(笑)。






(関連記事)
【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録
【Unity】【C#】制限付きでテキストのサイズに合わせて他のオブジェクトのサイズも変化させる
【Unity】【C#】RectTransform の矩形の実座標を取得する
【Unity】【C#】uGUI ドロップダウンの要素をコードで設定と取得、外観のカスタマイズなど
【Unity】【C#】インスペクタの表示項目を動的に変更する
【Unity】【C#】独自のギズモ(Gizmo)を表示する


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  uGUI  サンプル 
tb: 0   cm: --

【Unity】【C#】制限付きでテキストのサイズに合わせて他のオブジェクトのサイズも変化させる  


 ContentSizeFitter を使えば近い感じにもなるが、最小~最大みたいになると、レイアウトの入れ子になったり、オブジェクトを階層化しなくてはならなかったりと複雑になる気がするので、もっと簡単にできるものないかとググってみたら、やはり同じ様なものがあった

TextSizeAdjuster



 ただ試してみたら、ちょっと私が欲しい挙動と違ったので、元のスクリプトを参考に改造してみた。簡単に言えば「テキストの幅が最小~最大サイズまでは伸縮し、最大を超えたら折り返す」みたいにできるようにスクリプトに書き換えた。

 まぁ、自動レイアウトを駆使すれば同じことはできるかもしれないが、実は私も自動レイアウトは苦手なので、今回のスクリプト1つで簡単に実現できるのなら、それもアリかと(笑)。

【Unity】uGUIの自動レイアウトが分かりにくいと評判なので解説してみる

(※) Unity 2018.4.8f1 / Windows10(x64) で確認



■テキストのサイズに合わせて他のオブジェクトのサイズも変化させる(サイズ制限付き)

●TextSizeSync.cs
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif

/// <summary>
/// https://gist.github.com/iwashihead/db6e88e7de74f43c43fb9ebbd6769516
/// を改造
/// Text の preferredWidth / preferredHeight に合わせて
/// 他の RectTransform のサイズも変更する.
/// </summary>
[ExecuteInEditMode]
//[ExecuteAlways]
public class TextSizeSync : MonoBehaviour
{
//サイズを調整する方向
public enum AdjustMode
{
Width, Height, Both,
}
public AdjustMode adjustMode = AdjustMode.Width;

public bool alwaysAdjust = false; //Update でテキスト変化を検出

public Text referenceText; //サイズを参照するテキスト

public float minWidth = -1; //調整する最小幅 (※負で無視)
public float maxWidth = -1; //調整する最大幅 (※負で無視)
public float minHeight = -1; //調整する最小高 (※負で無視)
public float maxHeight = -1; //調整する最大高 (※負で無視)

//同期させるオブジェクトの余白(テキストサイズ+余白になる)
public RectOffset padding = new RectOffset();

//サイズを同期させるオブジェクト
public RectTransform[] syncRectTransforms = new RectTransform[0];


//Editor only
private void Reset()
{
if (referenceText == null)
referenceText = GetComponent<Text>();
}

//Editor only
private void OnValidate()
{
if (referenceText != null)
Adjust();
}

private void OnEnable()
{
if (referenceText != null)
Adjust();
}

// Use this for initialization
private void Start()
{
Adjust();
}

// Update is called once per frame
private void LateUpdate()
{
if (alwaysAdjust && IsTextChanged)
Adjust();
}

string _oldText;

//テキストの内容が変化したか?
public bool IsTextChanged {
get {
if (_oldText == null || _oldText != referenceText.text)
{
_oldText = referenceText.text;
return true;
}
return false;
}
}

//サイズの調整
public void Adjust()
{
switch (adjustMode)
{
case AdjustMode.Width:
AdjustWidth();
break;
case AdjustMode.Height:
AdjustHeight();
break;
case AdjustMode.Both:
AdjustBoth();
break;
}

AdjustSyncRectTransforms();
}


Vector2 _size = Vector2.zero;

//幅を調整
void AdjustWidth()
{
var w = ClampWidth(referenceText.preferredWidth);
var h = referenceText.rectTransform.sizeDelta.y;
_size.Set(w, h);
referenceText.rectTransform.sizeDelta = _size;
}

//高さを調整
void AdjustHeight()
{
var w = referenceText.rectTransform.sizeDelta.x;
var h = ClampHeight(referenceText.preferredHeight);
_size.Set(w, h);
referenceText.rectTransform.sizeDelta = _size;
}

//幅・高さの両方を調整
void AdjustBoth()
{
var w = ClampWidth(referenceText.preferredWidth);
var h = ClampHeight(referenceText.preferredHeight);
_size.Set(w, h);
referenceText.rectTransform.sizeDelta = _size;
}

//幅の制限
float ClampWidth(float w)
{
if (minWidth >= 0) w = Mathf.Max(minWidth, w);
if (maxWidth >= 0) w = Mathf.Min(maxWidth, w);
return w;
}

//高さの制限
float ClampHeight(float h)
{
if (minHeight >= 0) h = Mathf.Max(minHeight, h);
if (maxHeight >= 0) h = Mathf.Min(maxHeight, h);
return h;
}

//他の RectTransform のサイズ同期(余白付き)
void AdjustSyncRectTransforms()
{
var w = ClampWidth(referenceText.preferredWidth);
var h = ClampHeight(referenceText.preferredHeight);

foreach (var rt in syncRectTransforms)
{
var x = rt.sizeDelta.x;
var y = rt.sizeDelta.y;
switch (adjustMode)
{
case AdjustMode.Width:
x = padding.left + w + padding.right;
break;
case AdjustMode.Height:
y = padding.top + h + padding.bottom;
break;
case AdjustMode.Both:
x = padding.left + w + padding.right;
y = padding.top + h + padding.bottom;
break;
}
_size.Set(x, y);
rt.sizeDelta = _size;
}
}
}


#if UNITY_EDITOR
//※エディタ用
//OnValidate() では他のコンポーネント変化が検知できないので、
//インスペクタの更新で変化をチェックする
[CustomEditor(typeof(TextSizeSync))]
public class TextSizeSyncEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();

var obj = target as TextSizeSync;
if (obj.IsTextChanged)
{
obj.Adjust();
}
}
}
#endif

 色々付け加えたので長くなった(笑)。まぁ、少し古いバージョン(.NET3.5)でも対応できるようにしてるせいもあるけどね。
"[ExecuteInEditMode]" なんかもいつの間にか "[ExecuteAlways]" になったらしいしね。

 使い方は、参照する Text と同じ GameObject にアタッチし、変化させたいオブジェクトを syncRectTransforms に登録するだけだ。あとは最小~最大サイズや余白を設定しておく。






●例えば以下のようタグを囲むのに使っている


※ただし、レイアウトの計算は同じフレーム内では上手く反映されないので、1フレーム遅らせて反映させた方が確実。



 ちなみに、gif アニメの ContetnSizeFitter と TextSizeAdjuster の設定は以下のようになる。



●ContentSizeFitter ① を使い、LayoutElement で MinWidth を設定





●ContentSizeFitter ② を使い、LayoutElement で MinWidth, PereferedWidth を設定





●TextSizeAdjuster と ContentSizeFitter を使う

TextSizeAdjuster






 まぁ、自動レイアウトを極めれば色々できるかも知れないが、とにかく組み合わせを考えるのが大変なので、何重にもレイアウトの入れ子になるくらいなら、簡単なスクリプトを作るのも1つの手かも知れない(笑)。

【Unity】uGUIの自動レイアウトが分かりにくいと評判なので解説してみる
【Unity】逆引き自動レイアウトのトレーニング。UIをLayoutGroupで並べる
逆引き、UnityのuGUIのレイアウトトレーニング(uGUI RectTransform入門その2)






(関連記事)
【Unity】タブ切り替えの UI をコードを書かないで作る
【Unity】【C#】RectTransform の矩形の実座標を取得する
【Unity】【C#】uGUI ドロップダウンの要素をコードで設定と取得、外観のカスタマイズなど
【Unity】【C#】インスペクタの表示項目を動的に変更する
【Unity】【C#】独自のギズモ(Gizmo)を表示する


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityリファレンス  uGUI 
tb: 0   cm: --

【Unity】【C#】RectTransform の矩形の実座標を取得する(GetWorldCorners)  


 ちょっとパネルのドラッグ機能を付けたときに必要だったので、備忘録的にメモ。


 特にスマホなどは解像度によって見た目の大きさと実際のピクセルサイズが違うので、動的に取得する必要があった。調べたらすぐにわかったが、視覚的な解説が無かったので、簡単に書いてみた。

(※) Unity 2018.2.1f1 / Windows10(x64) で確認


●RectTransform の矩形の実際の座標を取得する
using UnityEngine;

public class Sample : MonoBehaviour {

public RectTransform target;

//RectTransform の矩形の実座標を Rect にして返す
public Rect GetRect(RectTransform rt)
{
Vector3[] corners = new Vector3[4];
rt.GetWorldCorners(corners);
return new Rect(corners[0], corners[2] - corners[0]);
}

//Rect 型にして、左下-右上座標を表示
void DisplayRect()
{
Rect rect = GetRect(target);
Debug.Log("(" + rect.xMin + ", " + rect.yMin + ") - ("
+ rect.xMax + ", " + rect.yMax + ")");
}

//4コーナー(左下, 左上, 右上, 右下)座標を表示
void DisplayCorners()
{
Vector3[] corners = new Vector3[4];
target.GetWorldCorners(corners);

for (var i = 0; i < 4; i++)
{
Debug.Log("corners[" + i + "] : " + corners[i]);
}
}

// Use this for initialization
private void Start () {
if (target == null)
target = GetComponent();

DisplayCorners();
DisplayRect();
}
}

corners[0] : (460.0, 240.0, 0.0)
corners[1] : (460.0, 480.0, 0.0)
corners[2] : (820.0, 480.0, 0.0)
corners[3] : (820.0, 240.0, 0.0)
(460, 240) - (820, 480)

 RectTransform.GetWorldCorners() は画面の左下を(0, 0)、右上が解像度の最大座標として、[0]:左下, [1]:左上, [2]:右上, [3]:右下 の座標を返す。


 この例では Canvas の設定が「Canvas Scaler」で「UI Scale Mode>Scale With Screen Size」, 「Reference Resolution>800x600 となっていて、パネルのサイズは 300x200 となっている。また、画面解像度は 1280x720 になっているときの値だ。


 ちなみに画面解像度を 2560x1440 にすると以下の値となる。
corners[0] : (920.0, 480.0, 0.0)
corners[1] : (920.0, 960.0, 0.0)
corners[2] : (1640.0, 960.0, 0.0)
corners[3] : (1640.0, 480.0, 0.0)
(920, 480) - (1640, 960)

 また、DisplayCorners() は公式のサンプルそのものだが、ちょっと手を加えて Rect 型で返す関数を GetRect() としても定義しておいた。矩形領域だけなら [0]:左下 - [2]:右上 の座標だけでも十分なことも多いからだ。


 冒頭に書いたパネル上での使用方法は、パネルをロックしたときに、パネル外ではカメラ回転、パネル内では無視するために座標を取っている(パネル上でマウスでカーソル合わせたりして、動かすたびにカメラが回転するのは鬱陶しいので(笑))。

 私はエクスプローラからのファイルドラッグ&ドロップにも対応しているが、UIの矩形座標を取れば、ドロップした先で処理を分岐するのも可能だろう。色々使える気がする(笑)。






(関連記事)
【Unity】タブ切り替えの UI をコードを書かないで作る
【Unity】【C#】制限付きでテキストのサイズに合わせて他のオブジェクトのサイズも変化させる
【Unity】【C#】uGUI ドロップダウンの要素をコードで設定と取得、外観のカスタマイズなど
【Unity】VRM(VRoid)をライブステージで踊らせるアプリを作ってみた


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  uGUI 
tb: 0   cm: --

【Unity】【C#】UI-Text 版 FPS(フレームレート)をリアルタイムに測定して表示する  


 以前に作ったレガシーGUI を uGUI(UI.Text)に移植しただけのもの。

 StandardAssets には「FPSCounter」という FPS測定ライブラリも入っているが、ソースを見てみると、一定間隔の平均を求めてるようなので、できればリアルな(平均でない)値を見たいと思って、わざわざ移植した(と言ってもほとんどまるっとコピーだが(笑))。

(※) Unity 5.6.3p1 - 2018.2.1f1 / Windows10(x64) で確認



●UI-Text 版 リアルタイムにFPSを測定して表示する
using System.Text;
using UnityEngine;
using UnityEngine.UI;

// FPS 測定値を UI-Text に表示する
// http://fantom1x.blog130.fc2.com/blog-entry-307.html
public class FpsText : MonoBehaviour {

public Text targetText; //表示する UI-Text
public string displayFormat = "{0:F1} FPS"; //表示フォーマット(F0 とすれば小数点以下は無くなる)

//測定用
int tick = 0; //フレーム数
float elapsed = 0; //経過時間
float fps = 0; //フレームレート

StringBuilder sb = new StringBuilder(16);

// Use this for initialization
private void Start () {
if (targetText == null)
targetText = GetComponentInChildren<Text>();
}

// Update is called once per frame
private void Update () {
tick++;
elapsed += Time.deltaTime;
if (elapsed >= 1f) {
fps = tick / elapsed;
tick = 0;
elapsed = 0;

if (targetText != null)
{
sb.Length = 0;
sb.AppendFormat(displayFormat, fps);
targetText.text = sb.ToString();
}
}
}
}

 使い方は UI の Text などにアタッチし、targetText に表示する Text をセットすれば完了だ(未セットでも子要素までは自動で探す)。

 測定(計算)方法は Update() による Time.deltaTime で集計した単位時間あたりのフレーム数である。あくまでもフレーム更新での測定なので、現実時間に近い測定(連続した時間)にしたいなら Time.realtimeSinceStartup で測定するのも良いだろう(StandardAssets の FPSCounter は Time.realtimeSinceStartup での測定)。

 実は色々な FPSカウンターを見てみると、測定(計算)方法はまちまちなので、用途に合わせた選択をした方が良いだろう。例えば StandardAssets の「FPSCounter」では連続的な時間での平均的な fps 測定に、今回の「FpsText」では一定更新毎(連続的というより、更新約1秒ごとにフレーム数を測定という感じ)の測定には向いてるかも知れない。具体的に言えば、平均化されてる場合は、もたったりして、ある程度バラついてもフラットな値になるが、平均化されてない場合は、もたったりしてる瞬間は値が激変する。自分がどちらの値を欲してるかで決めれば良い。

 以前の記事にも書いたが完全にフレームごとの超詳細な測定をしたいなら、毎フレーム「1f / Time.deltaTime」で計算する方法もある。ただしこの場合、ほんの僅かなもたりでも(人間の感覚ではわからないくらい小さいものでも)値として出るので、通常使う分には向いてないかも知れない(また、物凄く更新が速いため、見づらいという欠点もある)。仕様はケースバイケースで合わせた方が良いだろう。


※この記事のスクリプトはプラグインのライブラリにも同梱されています。


※とりあえず試してみたい方には、最新版をビルドした apk デモをダウンロードできます。動作確認にもどうぞ。

プラグインデモをダウンロード
(Google Drive を利用)


Android 4.2以上
※「提供元不明アプリのインストール」許可が必要です。


(関連記事)
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示する
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  uGUI 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR