0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Unity】Spritesでゲージを作る、成功ゾーンを添えて②【サンプル有】

Last updated at Posted at 2022-11-19

本記事は、前回作った通常ゲージの続きです。

サンプルコード:https://github.com/konbraphat51/GaugePrototype
ブラウザ上で動くデモ:https://konbraphat51.github.io/GaugePrototypeWEBGL/

本記事で、成功ゾーン(下図の黄色部分)を実装します。
このゾーンを動的に、すなわち数値を渡したらそれに応じて着色するゾーンが変動するようにします。
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323630323533372f32346630333561662d303634332d656431392d363035622d3362633237356361613937622e706e.png

用意するスプライト

着色スプライトです。
3.png

土台スプライトと同じ画像サイズの、白長方形です。これはマスクとして利用します。
4.png

作戦

緑の着色スプライトと同じように土台の上にバサッと上乗せして...
3.png

先ほど用意した長方形のスプライトでマスクを作り、うまい感じに横方向に圧縮すると...
4.png

なんと、ゾーンっぽくなったじゃないですか。
しかも長方形マスクと土台スプライトの画像サイズを同じにしているので、マスクのScaleのX値を0.1にすると、全体の1割を着色していることになります。

これを動的に設定できるように行いましょう。

実装

スクリプト

前回の記事のGauge.csを継承します。
必ずInitialize()を読んで、変数に初期値を渡す必要があります。

GaugeWithExcellentArea.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Must to call Initialize() first
/// </summary>
public class GaugeWithExcellentArea : Gauge
{
    private float excellentWidthRatio = 0.1f;
    private float excellentCenterRatio = 0.5f;

    [SerializeField] private GameObject excellentRectMask;

    /// <summary>
    /// this must be called
    /// </summary>
    /// <param name="showingRatio"></param>
    /// <param name="excellentWidthRatio"></param>
    /// <param name="excellentCenterRatio"></param>
    public void Initialize(float showingRatio,
        float excellentWidthRatio,
        float excellentCenterRatio)
    {
        base.Initialize(showingRatio);

        //edit excellent zone rect
        SetExcellentAreaRect(excellentWidthRatio, excellentCenterRatio);
    }

    private void SetExcellentAreaRect(float widthRatio, float centerRatio)
    {
        float centerPosX = GetHorizontalPosition(centerRatio);

        excellentRectMask.transform.localScale = new Vector2(widthRatio, excellentRectMask.transform.localScale.y);
        excellentRectMask.transform.position = new Vector2(centerPosX, excellentRectMask.transform.position.y);
    }
}

オブジェクト

構成は下図のように。
前回からExcellentZoneRectMaskが増えています。
6.png

土台スプライト

土台にGaugeWithExcellentZone.csをアタッチ。(Gauge.csは取り外してください)
そしてこのコンポーネントに対応する子オブジェクトを付与していってください。
それ以外は前回のままです。

ExcellentZone

黄色の着色スプライトです。
これは緑色と同じく、positionは(0,0,-0.05)、そしてSorting Groupをアタッチ。

RectMask

これは用意した長方形画像で作ったマスクです。
これはExcellentZoneの子オブジェクトにしましょう。

これで、完成!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?