1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【OSC】【Unity】OSCCore を用いた OSC 通信実装 1

Last updated at Posted at 2025-11-14

はじめに

本記事では、Unityで OSCCore を用いた、OSC通信を実装します。

実装するものはシンプルに、string型とint型の値を送信して、受信側でその値をハンドリングします。これを、macOS PC のローカル環境で、実際に動作するか確認します。

(ここの例のオブジェクト名や実装方法は適宜変えてください、あくまでサンプルです。)

ここでの紹介は、macOS PC のローカル環境動作のみです。

以下のように記載がありますが、双方向通信を行いたい場合などは、build した実機環境で、正しく動作するか早めに確認しましょう。

Windows, MacOS, Android, and iOS, using both Mono and IL2CPP runtimes.
It should work on any platform where you can use System.Net.Sockets, but it's not tested on Linux or consoles.

(私の環境では、MacOS・iOS・Windows で正しく動作することが確認できました。)

そもそもOSCとは

OSC を使って外部のデバイス・アプリを制御したり、外部からのデバイスから信号を受信に応じた処理を実行できたりします。

OSCの概要を知りたい方は、こちらのUnityJapanの動画を参考にするといいと思います。

対象読者

  • UnityアプリでOSC通信を実装したい方

環境

  • MacBookPro M3
  • Unity 2022.3.62f1

1. OSCCore を追加

Unity Package Manager で OscCore を Git URL から追加します。
追加するために、以下の URL を入力してください。
https://github.com/stella3d/OscCore.git

手順:
1.1 Unity エディタを開く
1.2 Window > Package Manager を選択
1.3 左上の "+" ボタンをクリック
1.4 "Add package from git URL..." を選択
1.5 上記の URL を貼り付け
1.6 "Add" ボタンをクリック

PackageManagerAddURL.png

これで OscCore ライブラリが Unity プロジェクトに追加され、OSC 通信機能を実装できるようになります。

2. Scene 上に Object を作成

最初にScene上で今回使用する、UI Objec Text(Text Received) と Button(Butto Sender) を作成します。そして、Empty Object OSCSenderControllerOSCReceiverControllerTextDisplayerも作成します。

ComponentsSampleScene.png

  • Text Received
    送信されたテキストを反映
  • Button Sender
    テキストなどの送信処理を実行するためのボタン
  • OSCSenderController
    送信処理を担当
  • OSCReceiverController
    受信処理を担当
  • TextDisplayer
    ValueをテキストとConsoleに表示担当

3. OSCSender と制御クラスを実装 (Client側)

OSCSencer Componet をアタッチ

OSCSenderController ObjectOSCSender Component を追加します。
デフォルトで、IPAddress 127.0.0.1Port 7000となっています。ローカルPCで確認するので、この値を使用します。別のPCへ送信する場合は、適宜IPアドレス・使用していないPortを指定する必要があります。

制御クラスを実装

OSCSenderController.cs
using UnityEngine;
using UnityEngine.UI;
using OscCore;

namespace OscCoreSample
{
    public class OSCSenderController : MonoBehaviour
    {
        [SerializeField] Button _sendButton;
        [SerializeField] OscSender _sender;
        
        // 送信側と受信側で同じ値を指定する
        [SerializeField] string _addressTestString = "/test/string";
        [SerializeField] string _addressTestInt = "/test/int";

        void Start()
        {
            // ボタンが押されたら送信処理を実行
            _sendButton.onClick.AddListener(HandleSendButtonClick);
        }

        void HandleSendButtonClick()
        {
            // 指定した address に String・Int型のValueを送信する例
            _sender.Client.Send(_addressTestString, "Hello, OSC!");
            _sender.Client.Send(_addressTestInt, 1);
        }
    }
}

ここでの、Address は、「/test/string」のように 「/」で始めるよう指定します。

「test/string」のように指定しないよう注意しましょう。

ボタンが押されたら、OSCSender が Wrapper している OSClient の Send メソッドを実行します。ここでは、string型とint型を送信しています。

_sender.Client.Send(_addressTestString, "Hello, OSC!");
_sender.Client.Send(_addressTestInt, 1);

OSCSenderController Object に実装したものをアタッチします。

4. OSC Receiver と Input を追加(Server側)

OSCReceiver Componet をアタッチ

OSCReceiverController ObjectOSCReceiver Component を追加します。
先ほどのSender側の実装に合わせて Portの値を7000に設定します。

Input Component をアタッチ

Sender側のSendメソッドの値を受けとって、特定の処理を実行するために、StringInputIntegerInput をアタッチします。Receiver には、それぞれ先ほど追加した OSCReceiver を指定します。Address に関しては、 Sender側の実装に合わせて入力します。

OnMessageReceivedには、受け取った値に応じて実行したい処理を登録します。
ここで、実行する処理については、次のセクションで実装します。

5. TextDisplayer 実装

TextDisplayer.cs
using UnityEngine;
using UnityEngine.UI;

public class TextDisplayer : MonoBehaviour
{
    [SerializeField] Text _displayText;
    
    public void Display(string message)
    {
        _displayText.text = message;
    }

    public void DebugInt(int value)
    {
        Debug.Log("Received int value: " + value);
    }
}

実装したものをTextDisplayer Objectにアタッチしてください。
そして各処理を、先ほどアタッチした Input の OnMessageReceived で参照するようにしてください。

6. 動作確認

Unity Editor上で実際に動作確認します。
Sendボタンを押すと、中央に受け取った文字(値)が表示されていることが確認できます。
しかし、Console上では、1の値を送信したはずが、0の値が表示されてしまいます。
これは、インスペクター上の初期値で処理が実行されてしまっているようです。

スクリーンショット 2025-11-10 19.32.55.png

うまく動かない場合のチェックポイント

  • ポート番号がSender/Receiver共に7000と一致した値であるか
  • OSCのAddressが正しく「/」から始まっていてるか
  • StringInputとIntegerInputのReceiverが正しく設定されているか
  • OnMessageReceivedに正しいメソッドが登録されているか

まとめ

本記事では、UnityでOSCCoreを使用してOSC通信を実装する方法を解説しました。OSCSenderとOSCReceiverのComponentを活用することで、比較的簡単にstring型のデータを送受信できることが確認できました。

しかし、動作確認の結果、IntegerInputを使用した際に期待した値が正しく表示されないという問題が発生しました。このように、OSCCoreが提供するラッパークラス(IntegerInput・PropertyOutputなど)には、場合によって期待通りに動作しないケースがあるようです。

より確実で柔軟な実装を行いたい場合は、これらのラッパークラスがどのようにOSCClient・OSCServerを扱っているかソースコードを参考にしながら、独自実装することをお勧めします。
(今回の記事では記載していませんが、独自実装したものでは、string型以外にもint型などを正しく受け取ることも出来ました。いずれこちらも記事にするかもしれません。)

また、macOSのローカル環境での動作確認でしたが、実際のアプリケーション開発では、異なるデバイス間での通信や、より複雑なデータ構造の送受信も必要になってくるでしょう。その際は、早めに実機環境での動作確認を行うことをお勧めします。

OSC通信を活用することで、Unityアプリと外部デバイス・アプリケーション間の連携が可能になり、インタラクティブな表現の幅が大きく広がります。

ぜひこの基礎を活かして、より面白いOSC連携アプリケーションを開発してみてください!
楽しい開発をはじめましょう!

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?