前提・実現したいこと
Unityのソースコード内のdistance1の値が更新されたら、移動平均を行い、その結果をtextUUI.textに表示させたいと考えています。以前の移動平均の問題をしらべていると、配列に同じ値が入っており、同じ数を5回足して、5で割っている状態だったので、それを改善した後と思いプロパティを使いたいと考えているが、疑問点が出たので質問しました。
発生している問題・エラーメッセージ
・textUUI.textが表示されない
・distance1の値のように、更新される値が更新されたらという条件をどうやって作ってやればいいかわからない
・get,setのプロパティを利用したいが、その際、上記のようなイベントを起こすためのより良いソースの書き方が分からない。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5using UnityEngine.UI; 6using Mathd; 7using System.Linq; 8 9public class Pointer : MonoBehaviour 10{ 11 12 //distance 13 public static double distance; 14 public static double distance1; 15 public static double distance2; 16 17 public Text textUI; 18 public Text textUUI; 19 public Text textUUUI; 20 21 void start() 22 { 23 省略 24 } 25 26 void Update() 27 { 28 29 double step; 30 step = speed * Time.deltaTime; 31 32 //movingAverage = new MovingAverage(); 33 34 //RSSI持ってくるかも 35 RSSI = script.total; 36 RSSI1 = script.total1; 37 RSSI2 = script.total2; 38 39 TxPower = script.Strength; 40 TxPower1 = script.Strength1; 41 TxPower2 = script.Strength2; 42 43 //B1の距離 44 distance = Math.Pow(10.0, (TxPower - RSSI) / 20.0); 45 //B2の距離 46 distance1 = Math.Pow(10.0, (TxPower1 - RSSI1) / 20.0); 47 //B3の距離 48 distance2 = Math.Pow(10.0, (TxPower2 - RSSI2) / 20.0); 49 50 Maverage B2= new Maverage(); 51 textUI.text = "B1との距離" + distance.ToString() + "m" + "\nB2との距離" + distance1.ToString() + "m" + "\nB3との距離" + distance2.ToString() + "m" 52 + "\nB1のRSSI" + RSSI.ToString() + "db" + "\nB2のRSSI" + RSSI1.ToString() + "db" + "\nB3のRSSI" + RSSI2.ToString() + "db"; 53 textUUI.text = B2.M1.ToString(); 54 55 56 57 58 59 60 } 61 62 63 { 64 MovingAverage movingAverage1; 65 private double sum1; 66 private double total1; 67 private double[] ma1 = new double[5]; 68 public double M1 69 { 70 set 71 { 72 total1 = value; 73 double tmpd1; 74 tmpd1 = distance1; 75 if (tmpd1!=distance1) 76 { 77 movingAverage1 = new MovingAverage(5); 78 movingAverage1.Push(distance1); 79 total1 = movingAverage1.Value; 80 } 81 } 82 get 83 { 84 return total1; 85 } 86 } 87 88 public double M1Value 89 { 90 get { return sum1 /= 5; } 91 } 92 93 94 } 95 96 public class MovingAverage 97 { 98 private uint length; 99 private uint validLength = 0; 100 private uint writePointer=0; 101 private double[] arr; 102 103 public MovingAverage(uint length) 104 { 105 this.length = length; 106 this.arr = new double[length]; 107 } 108 109 public void Push(double x) 110 { 111 this.arr[writePointer++] = x; 112 writePointer %= length; 113 validLength = validLength < length ? validLength + 1 : length; 114 } 115 116 public double Value 117 { 118 get 119 { 120 return arr.Sum() / validLength; 121 } 122 } 123 } 124}
試したこと
プロパティについて調べたり、自分なりにソースを作った。
補足情報(FW/ツールのバージョンなど)
Unity2019.4.15f1
C#
usingの下3行見た段階で明らかにコンパイルすら通らなそうなコードなんだけども、そんなものを提示する意味あると思う?
前回の質問で貰ったコードを使うよう方向転換したけど、前の質問でもまだコードが貰える可能性があるから前の質問は放置してるの?
ようはデバッグしたくない動くコードくれってことでしょ?
「更新される値が更新されたらという条件」とはどういうことでしょうか?
前回の質問内容から考えると前回と同じ値であっても平均に含めるのではないかと思います。
そうなのであれば、「更新されたらという条件」というのか「計算した時」なのではないですか?
そうなると、計算した後に処理するだけでよいと思いませんか?