Unity3D コンポーネント | 静的ヒストグラムを描画する

序文

Unity にはヒストグラムを直接描画する方法はありませんが、画像のマトリックス変換のパラメーターの値を変更することで、静的なヒストグラム効果を実現できます。

準備

最初に、ヒストグラムがキャンバスに表示できる最大値を配置します。
ヒストグラム表示
ここで行っているのは 2 つの値の比較です。赤の列は速度、青の列は圧力、横軸は時間です。カラムの高さ 80 は、最大速度 10m/s、最大圧力 4000N に相当します。

まず、後の計算の便宜上、列(画像)の行列変換パラメータのアンカーポイントを低く設定します。下図のように
アンカー プリセット
、画像の長さをコードで変更できる場合、アンカーポイントから増減します。

スクリプト コードの変更

タイプを定義する

//在脚本开头使用gameobject定义
//或者可以通过Using UnityEngine.UI;定义image类型将需要控制的柱(image)定义
    public GameObject Speedimage_1;
    public GameObject Speedimage_2;
    public GameObject Speedimage_3;
    public GameObject Speedimage_4;
    public GameObject Speedimage_5;
    public GameObject Speedimage_6;
    public GameObject Speedimage_7;
    public GameObject Speedimage_8;
    public GameObject Speedimage_9;
    public GameObject Speedimage_10;
//定义list,这里的Speed是最终柱的高度;
//因为一共需要十个柱,对于第十一个需要将第一个进行移除list;
    private List<float> Speed = new List<float>(10);

リストを埋める

//将每次需要展示的值进行填充,这部分代码仅做展示,具体代码按需求更改。
	Speed.Add(speed0);
	Speed.Add(speed1);
	Speed.Add(speed2);
	Speed.Add(speed3);
	Speed.Add(speed4);
	Speed.Add(speed5);
	Speed.Add(speed6);
	Speed.Add(speed7);
	Speed.Add(speed8);
	Speed.Add(speed9);

初期化と充填

// 在Start或者Awake函数中进行第一次填充,这块是对第一次填充进行初始化和填充。
// 下面的Speed[i] / 10 * 80是将实际值按比例缩小至0~80,当第一次没对list进行填充时即是初始化。
// 实际就是寻找上一步定义的image中的RectTransform的sizeDelta参数并进行修改。
        Speedimage_1.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(10, Speed[1] / 10 * 80);//改变长宽
        Speedimage_2.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(10, Speed[2] / 10 * 80);//改变长宽
        Speedimage_3.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(10, Speed[3] / 10 * 80);//改变长宽
        Speedimage_4.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(10, Speed[4] / 10 * 80);//改变长宽
        Speedimage_5.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(10, Speed[5] / 10 * 80);//改变长宽
        Speedimage_6.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(10, Speed[6] / 10 * 80);//改变长宽
        Speedimage_7.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(10, Speed[7] / 10 * 80);//改变长宽
        Speedimage_8.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(10, Speed[8] / 10 * 80);//改变长宽
        Speedimage_9.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(10, Speed[9] / 10 * 80);//改变长宽
        Speedimage_10.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(10, Speed[10] / 10 * 80);//改变长宽

サイクルモード

// 填充过程中可以通过list的移除第一位功能达到循环填充的效果
            Speed.RemoveAt(0);

エピローグ

基本的な実装は上記の通りですが、他にも機能があればSpeedリストのエントリ値を変更することで拡張可能です。

おすすめ

転載: blog.csdn.net/qq_44879321/article/details/122522779