UnityからProcessingへOSCを投げる

processingでアプリつくったはいいが、UnityのほうがトラッキングしやすいマーカなんかがあるとUnityからProcessingにOSC投げたくなる。ということでその方法を考えてみる。

![Screen Shot 2015-09-01 at 21.35.38.png](https://qiita-image-store.s3.amazonaws.com/0/53282/f14e8a35-da12-5bfb-bacf-8debda9408a7.png)


Processing使うのは久しぶり。Ver2.1が筆者のPCに入っていた。
ProcessingでOSCをreceiveするにはoscP5をinstallする。


次はUnity。今回使うのはVuforiaです。ARアプリ作る特によく使うのかと。任意の画像をマーカーに容易に設定できるというのは、ARToolkitより優れている点か。

Vuforiaでマーカ登録するとかはこの投稿では割愛。
ひとまず、Unityの任意のシーンにImageTarget objectがあり、Image Target Behaviour scriptにマーカーとなる画像が設定されているとする。
そして、この画像の座標をOSCでProcessing側に投げる方法について。

参考にしたのは以下。
http://learning.codasign.com/index.php?title=Sending_and_Receiving_OSC_Data_Using_Processing


```
import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;

void setup() {
  size(400, 400);
  // start oscP5, telling it to listen for incoming messages at port 12000
  oscP5 = new OscP5(this, 12000);
  
  // set the remote location to be the localhost on port 12000
  myRemoteLocation = new NetAddress("127.0.0.1", 12000);
}

void draw() {
  // do funky stuff here
  
}

void oscEvent(OscMessage theOscMessage){
  // get the first value as an integer
  int firstValue = theOscMessage.get(0).intValue();
  
  // get the second value as a float
  //float secondValue = theOscMessage.get(1).floatValue();
  
  // get the third value as a string
  //String thirdValue = theOscMessage.get(2).stringValue();
  
  // print out the message
  print("OSC Message Recieved");
  //print(theOscMessage.addrPattern()  + " ");
  //println(firstValue + " " + secondValue + " " + thirdValue);
  println(firstValue);
}

```

UnityでOSCをsendするにはUnityOSCを使うことにした。
https://github.com/jorgegarcia/UnityOSC

まず任意のfolderにclone
![Screen Shot 2015-09-01 at 22.10.54.png](https://qiita-image-store.s3.amazonaws.com/0/53282/23b74923-bd95-b8db-9f98-b472550c1127.png)


UnityOSC Assetをprojectにimport。
**追記**
久しぶりに同じことをやろうとしたら何をimportするのか忘れた。
[こちらのブログ記事](http://koki0702.hatenablog.com/entry/unity_article_02)を参考にさせていただいて、構成を思い出した。
githubでcloneするとUnityOSCフォルダ以下に複数フォルダがあるが、取り込む必要があるのはsrcのみである。(testsを入れようとするとエラーがでる。)

任意のオブジェクトにOSCHandlerをaddする。
![Screen Shot 2015-09-03 at 18.38.15.png](https://qiita-image-store.s3.amazonaws.com/0/53282/a928e406-7f02-ad10-a04e-2315d816fad9.png)

OSCHandlerのコードをprocessingにOSCを送れるように修正。
void initだけ設定を加える。

```
	public void Init()
	{
        //Initialize OSC clients (transmitters)
        //Example:		
		CreateClient("myRemoteLocation", IPAddress.Parse("127.0.0.1"), 12000);

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

        //CreateServer("AndroidPhone", 6666);
	}
```

OSCをsendするメソッドは新規にscriptを追加して処理を書く。
例えばOSCController.csとか。

```
using UnityEngine;
using System.Collections;

public class OSCController : MonoBehaviour {

	// Use this for initialization
	void Start () {
		// this line triggers the magic
		OSCHandler.Instance.Init ();
		
		int testInteger = 54321;
		OSCHandler.Instance.SendMessageToClient ("myRemoteLocation", "127.0.0.1:12000", testInteger);
	
	}
	
	// Update is called once per frame
	void Update () {
		int testInteger = 54321;
		int random = Random.Range (0, 10000);
		OSCHandler.Instance.SendMessageToClient ("myRemoteLocation", "127.0.0.1:12000", random);
	
	}
}
```

Unity & ProcessingをrunするとprocessingにOSCを送れているのがわかる。
![Screen Shot 2015-09-03 at 18.48.18.png](https://qiita-image-store.s3.amazonaws.com/0/53282/18c3f681-5ef5-e923-ff18-2087d1d85647.png)