質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

824閲覧

プロパティを用いて、distance1の値が変わったら移動平均を実行させるようにしたい

wing

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/07/28 19:10

編集2021/07/29 02:13

前提・実現したいこと

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#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2021/07/28 21:57

usingの下3行見た段階で明らかにコンパイルすら通らなそうなコードなんだけども、そんなものを提示する意味あると思う?
YAmaGNZ

2021/07/28 22:10

前回の質問で貰ったコードを使うよう方向転換したけど、前の質問でもまだコードが貰える可能性があるから前の質問は放置してるの? ようはデバッグしたくない動くコードくれってことでしょ?
YAmaGNZ

2021/07/29 03:10

「更新される値が更新されたらという条件」とはどういうことでしょうか? 前回の質問内容から考えると前回と同じ値であっても平均に含めるのではないかと思います。 そうなのであれば、「更新されたらという条件」というのか「計算した時」なのではないですか? そうなると、計算した後に処理するだけでよいと思いませんか?
guest

回答1

0

(C#初心者なので的外れかもしれませんが)
「値が変わった際にどうの」いうなら,
単純に double distance1; とするのではなくて,こんな感じのものにしてしまえばどうでしょうか.

CSharp

1//double型の値を1つ保有するものであって, 2//当該double型の値が変化した際にその旨を通知する機能を有する 3internal class MyDouble 4{ 5 private double m_Val; 6 public MyDouble( double init_val=0 ){ m_Val=init_val; } 7 public double Value 8 { 9 get{ return m_Val; } 10 set 11 { 12 if( m_Val == value )return; 13 m_Val = value; 14 if( OnValueChanged!=null )OnValueChanged( m_Val ); 15 } 16 } 17 public Action<double> OnValueChanged{ private get; set; } 18} 19 20//doubleじゃくてこの型にしちゃう 21MyDouble distance1;

投稿2021/07/29 02:54

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問