UnityOSCを使おう

UnityOSCをDLしてプロジェクトに追加しよう

UnityOSCをダウンロードしてプロジェクトに追加します。

ダウンロードしたファイルの中から、srcフォルダに張っている以下のファイルが必要になります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
UnityOSC-master
src
  Editor/
    OSCHelper.cs
  OSC
    OSCBundle.cs
    OSCClient.cs
    OSCPacket.cs
    OSCServer.cs
  OSCHandler.cs

Editorのディレクトリは必ずAssetsフォルダ直下に置く必要がありますが、他は移動させても大丈夫です。

テスト用のコードを書こう

こちらのGitHubのサンプルを流用します。

oscControl.cs

ポート番号を外から変更できるように下記の変更を加えておきます

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//...

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityOSC;

public class oscControl : MonoBehaviour {

	#region Network Settings //----------追記
	public int InComingPort; //----------追記
	#endregion //----------追記

	private Dictionary<string, ServerLog> servers;

	// Script initialization
	void Start() {
		OSCHandler.Instance.Init(InComingPort); //init OSC //----------変更
		servers = new Dictionary<string, ServerLog>();
	}

	// NOTE: The received messages at each server are updated here
	// Hence, this update depends on your application architecture
	// How many frames per second or Update() calls per frame?
	void Update() {

		OSCHandler.Instance.UpdateLogs();
		servers = OSCHandler.Instance.Servers;

		foreach( KeyValuePair<string, ServerLog> item in servers )
		{
			// If we have received at least one packet,
			// show the last received from the log in the Debug console
			if(item.Value.log.Count > 0)
			{
				int lastPacketIndex = item.Value.packets.Count - 1;

				UnityEngine.Debug.Log(String.Format("SERVER: {0} ADDRESS: {1} VALUE 0: {2}",
					item.Key, // Server name
					item.Value.packets[lastPacketIndex].Address, // OSC address
					item.Value.packets[lastPacketIndex].Data[0].ToString())); //First data value
			}
		}
	}
}

OSCHandler.Instance.Initのメソッドにポートを動的に渡せるようにしたので、引数の数が違うこのようなエラーができます。

OSCHandler.csには受け取った引数をポート番号として渡すように修正を加える必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public void Init(int inComingPort)//----------変更
{
  //Initialize OSC clients (transmitters)
  //Example:		
  //CreateClient("SuperCollider", IPAddress.Parse("127.0.0.1"), 5555);

  //Initialize OSC servers (listeners)
  //Example:

  CreateServer("iPhone", inComingPort);//----------変更
}

これでエラーが消えます。

受信側のPC側のIPアドレスを調べよう

次にデータを送信するiPhone側の設定が必要なのですが、受信側のPCのIPアドレスが必要になるので調べておきましょう。 コンソールを立ち上げて下記のコマンドを入力します。

1
$ ifconfig

こんな感じのログが出てくるのでen0inetのアドレスを控えておきます。

送信側のiPhoneの設定をしよう

次にiPhone側の設定をしましょう。 アプリは何でも大丈夫ですが、サンプルではTouch OSCを使用しました。 設定画面では、先ほどのIPアドレスをHostに設定し、ポートの番号を確認します。

Unity側で設定をしよう

あとはUnity側での設定になります。 空のゲームオブジェクトを作成し、先ほど作成したプログラムoscControl.csをアタッチしましょう。 In ComingPortには送信側のiPhoneでチェックしたポート番号を入力します。

Window > OSCHelperを開いて受信ができている事を確認しましょう。