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

:::note
本記事は、[前回作った通常ゲージ](https://qiita.com/konbu9640/items/d3a53b626aa8f20fb540)の続きです。

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

本記事で、成功ゾーン（下図の黄色部分）を実装します。
このゾーンを動的に、すなわち数値を渡したらそれに応じて着色するゾーンが変動するようにします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323630323533372f32346630333561662d303634332d656431392d363035622d3362633237356361613937622e706e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/cbd36952-06a0-f434-7455-848a6baf68c2.png)


# 用意するスプライト
着色スプライトです。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/963d5f9c-3b5b-142e-e4a2-ff925564211b.png)

土台スプライトと同じ画像サイズの、白長方形です。これはマスクとして利用します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/fe74f7fd-a7ea-21c5-5b1e-1ac8735f6972.png)

# 作戦
緑の着色スプライトと同じように土台の上にバサッと上乗せして...
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/5df6a9d1-3fbe-bb5b-210b-7bd25d037a3b.png)

先ほど用意した長方形のスプライトでマスクを作り、うまい感じに横方向に圧縮すると...
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/9898988d-6f1b-c3d1-a1b6-acd1b43616d0.png)

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

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

# 実装
### スクリプト
前回の記事のGauge.csを継承します。
必ずInitialize()を読んで、変数に初期値を渡す必要があります。
```C#: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);
    }
}
```

### オブジェクト
構成は下図のように。
前回から`ExcellentZone`と`RectMask`が増えています。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/984d304f-257d-9723-6ac6-32907270e91d.png)

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

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

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

これで、完成！！