【Unity】円形ゲージの作り方

2021年3月27日土曜日

C# Unity Unity2D

この記事をシェアする
  • B!


  ゲームのチャージアクションなどでお馴染み、今回はこの、丸が大きくなったり小さくなったりする円形のゲージをUnityで作りたいと思います。

 前回(https://kochoyume.blogspot.com/2021/03/unity.roulette.html)の「コマンドルーレット」と同じく、円形ゲージの作り方もなかなかネットの波で見つけられません。円形のゲージ、というのも意外と種類がありますので、最初のgifのゲージ以外の円形ゲージもさらっと見た上で、本題に入っていきます。

 (目次つけてますので、皆さんの目的にあうところから読んでください)


ブログランキング・にほんブログ村へ にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ Unityへ にほんブログ村 IT技術ブログ C#へ

実行環境について

Unityバージョン:2019.4.18f1
Visual Studio Community 2019バージョン:16.9.1

円形ゲージのいろいろ

そもそも円形ゲージっていっぱいある…

前振りもいれましたが、本題に入る前にまず円形ゲージの種類の確認です。
円形ゲージ、という言葉を敢えて定義すると、「円形のゲージ」になってしまうんですが、ガワが丸いゲージって結構Unityいっぱいあるんですよね…。

①Slider

多くのUnityプログラマーがHPゲージとして使っているUI。

(Sliderの使い方をご存じない方は、Sliderをわかりやすく説明しておられる先輩諸氏のブログを探してみてください。おおよそ説明しますと、Sliderの子オブジェクトからHandle Slide Areaを削除、残りの子オブジェクトをうまい感じにサイズ調整して…という感じです)

こいつを円形にするのは簡単で、Sliderの子オブジェクトのBackgroundと孫オブジェクトのFill、ご両人のImageコンポーネントのソース画像をKnobにするだけです。
そうするとどうなるかというと…こうなります↓↓


…こんな使い方したSliderに、需要はないと思います…。
いちおう、これは左から右に、赤い円が出ていますが、この方向は上から下へとか、変更可能です。それを含めても需要ないかな…。

Unityプログラマーの皆さんとしては、慣れたSlider使いたいところかもしれないのですが、今回の目的にあいそうにありません…。

②Fill Amount

これは、ImageのUIの一機能になります。ご存じない方も多いかもしれない、Unityの影の薄い機能ですね。

どこにそんなのあったのか、と言いますと、ImageのUIのインスペクター、ImageコンポーネントのImageタイプで"Filled(埋めてある)"を選択するだけで実装できます。

基本的にImageのUIなので、Sliderよりインスペクター画面の要素がごちゃごちゃしていないのが良い部分でしょうか。Fill AmountでHPゲージも作れますので、興味がある方は後ほど調べてみてください!

さて、こいつは影薄いながらも、Sliderとは一風変わったことが色々とできます。
Fill Amountを使って三つほど円形のゲージを作ってみたので、ご覧ください↓↓




円グラフのような(謎表現)もの、雨の日の車のワイパーみたいなもの、学生時代理科の実験でフラスコに液体を入れた記憶を彷彿とさせるようなものまでーー。
何に使うかわかりませんが、Fill Amountは種類が豊富なんですよね。

Unityが最初から用意している円形ゲージと呼べるものはこのくらいですが、私が作りたいものはこの中にありませんでした。
仕方ない、自作しようじゃないか!というのが、今回の本題ですね。

小さくなって大きくなる円形ゲージ

作りたい円形ゲージを一言でまとめると、こうなってしまいます。
なんだか締まらないですが、早速作っていきましょう。

☆UIの配置

特に難しい配置ではないです。
Canvasを設置、その子オブジェクトにImageのUI、さらにその子オブジェクトにもう一度ImageのUIを設置、これで終了です。

最初のImageのUIは、名前をBackgroundにしておきましょうか。
適当なサイズに調整して、その後インスペクターウィンドウ、Imageコンポーネントからソース画像を"Knob"選択、あとは色を適当に決めます。色は、Backgroundの子オブジェクトのImageとかぶらなければなんでもいいです。

次に、その子オブジェクトのImageですが、こいつは最初に、インスペクターからRect transformのコンポーネントにいって、アンカープリセットをstretch×stretchにしてから、上下左右Z座標に至るまで0にします↓↓


画像みたいな感じですね。
後はBackgroundでもしましたが、Imageコンポーネントのソース画像をKnobに、色を適当に調整、これで準備完了です。

さて、これからスクリプトを書くわけですが、そこでどこを弄るのかというと、画像のRect transformの「拡大/縮小」、英語版の"scale"になります!
実際に適当な値を入れて弄るとわかりやすいですが、ここを弄るとImageが大きくなったり小さくなったりします。それをスクリプトで、って感じですね。

スクリプト作成


ではでは、スクリプトです。
このスクリプトを、Backgroundの子オブジェクトのImageにつけたらいいかと思います。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //UI弄るなら必須

public class SircleGuageSystem : MonoBehaviour
{
    float speed = 0.01f; //後で速度変更しやすいように敢えて変数にしている
    float i = 0;
    bool Increase = true;
    RectTransform rectTransform;

    // Start is called before the first frame update
    void Start()
    {
        rectTransform = this.GetComponent<RectTransform>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Increase)
        {
            i += speed;
        }
        else
        {
            i -= speed;
        }
        if (i >= 1)
        {
            Increase = false;
        }
        if (i <= 0)
        {
            Increase = true;
        }
        rectTransform.localScale = new Vector3(i, i, 0);
    }

こんな感じでしょうか。
rect transformコンポーネントのscaleを弄るのはlocalscaleですね。これは文字通り、対応する座標がローカル座標なのが厄介でしょうか。
Unityにはローカル座標とワールド座標というのがある、というのはUnity学習の上での鬼門らしいので、ちょっとばかし忘れてる方は復習したほうがよさそうですね…!

今回書いたスクリプトは、本当に円が大きくなったり小さくなったりするだけのものになります。
こいつを止めたいならspeedに0を代入すればいいですし、チャージアクションで得た情報を次の行動につなげたい、といった用途ならば、iを他のスクリプトに送れるようにすればいいでしょう。

そのへんの考え方とか、スクリプトの参考例は前回の記事に書いていますので、よかったら見てみてください。

最後に

スクリプトで色々と手を抜きましたが、まぁさらっと書けました。
あまり詳しくすると、ページを開ける際の処理が重くなるという問題がありまして…皆様の慈悲深い御心で許していただきたく思います(*- -)(*_ _)ペコリ


ブログランキング・にほんブログ村へ にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ Unityへ にほんブログ村 IT技術ブログ C#へ

自己紹介

自分の写真
大学では文学部日本文学科出身という生粋の文系。チャットゲームの運営の在宅業務に携わったことでプログラミングに興味を持ち、2020年末、SAMURAI ENGINEERに入塾。2021年4月末に卒塾。 ※お問い合わせある方は、ブログのお問い合わせページからどうぞ~

ページビューの合計

応援をお願いします!

もしよかったらTwitterのフォローと応援ポチをよろしくです~
PVアクセスランキング にほんブログ村
ブログランキング・にほんブログ村へにほんブログ村 IT技術ブログへにほんブログ村 IT技術ブログ Unityへ
にほんブログ村 IT技術ブログ C#へ

QooQ