序文
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リストのエントリ値を変更することで拡張可能です。