📚

Unityで同じデータが連続して来た場合の処理をする

に公開

1. 概要

マイクの音量を受け取るアプリケーションを制作していた際に、送信側はしきい値以上の値だけを送るようにしていた。

https://note.com/hikohiro/n/n01007cb70c85#070b3def-e527-488e-ab85-ee987b759d70
上記サイトを参考にwebsocketを使っていたが、受信したものをメインスレッドで使う場合にUpdateを使う方法を取っていたので、最後に送られてきたしきい値以上の値を常に更新し続けるようになっていた。

サイトでも紹介されていたUniRxを使えば解決しそうな気もするが、一旦同じ値が連続した場合に音量を0にする方法を実装することにした。何かしらのエラーで同じ値が届き続けた場合にも対応できそうだし。

2. 環境

  • MacBook Pro (16-inch, 2019) / macOS Big Sur
  • Unity 2021.3.16.f1

3. 方法

3.1 Queueに値を保持する

以下の記事を参考に、Queueに値を保持する。
https://qiita.com/qavion/items/5d2b74ae51517d9e8d9f#加速度を取得する

3.2 Linqで判定する

以下の記事を参考に、Linqを使ってDistinctすることで重複を消す。重複を消した結果が1であれば要素がすべて同じだったということになる。便利!
https://teratail.com/questions/140064#reply-211844

using System.Collections.Generic;
using System.Linq;

public class Sample: MonoBehaviour 
{
    private Queue<float> values = new Queue<float>();
    private readonly int NUM = 100;
    
    void Start ()
    {
        // キューを0で埋めておく
        for (int i=0; i < NUM; i++)
        {
            values.Enqueue(0);
        }
    }
    
    void Update()
    {
        float volume = 0f;
	// ここにvolumeになにか値が入る処理が入る

        values.Dequeue();
        values.Enqueue(volume);

        if(values.Distinct().Count() == 1)
        {
            volume = 0;
        }

Discussion