UnityでiPhoneを使ってライトをコントロールする
下記ではMIDI機器を使用しましたが、今度はiPhoneでライトをコントロールしました。
prince9.hatenablog.com
ただタッチで細かい操作は事故りそうなので、個人的にはMIDI機器使用が確実と思われます。
プロジェクトファイルはこちらです。
www.dropbox.com
今回はOSCという通信規格を用います。Unityで使用するにあたり、hecomiさんのuOSCをお借りしました。
ありがとうございます。
tips.hecomi.com
iPhoneアプリ「TouchOSC」を使用する
※TouchOSC以外を使う場合は1.のみ行って、次の「OSCアプリの出力を調べる」に進んでください
1.使用するPCのIPアドレスを調べて、メモする
Macの場合:
minto.tech
WIndowsの場合:
https://laboradian.com/find-ip-on-windows10/laboradian.com
2.App Storeで「TouchOSC」アプリをダウンロードする
※「Mrmr」など無料のものもありますが、「TouchOSC」が個人的に使いやすかったです
3.立ち上げると下記のような設定画面が出てくるので、「CONNECTIONS」→「OSC」をタップする。
すでにUIが出ている場合は●ボタンを押す
4.「Host」に1.でメモしたPC側のIPアドレスを入力して、そのまま「完了」ボタンを押していく
5.「LAYOUT」を「Automat5」にする
6.右上の「Done」ボタンを押す
uOSCを読み込んで、OSCアプリの出力を調べる
1.下記にアクセスし、「.unitypackage」をクリックしてダウンロードする
github.com
2.Unityのプロジェクトを作成し、先ほどダウンロードした「.unitypackage」ファイルを「Assets」フォルダにドラッグ&ドロップする
3.「Import」ボタンを押して読み込む
4.「Assets」を右クリックし、「Create」→「C# Script」を選択する
5.4.に「OSCDataTestScript」等名前をつける
6.「GameObject」メニュー→「Create Empty」で空のオブジェクトを作成する
7.「Assets」フォルダ→「uOSC」→「Scripts」→「uOscServer」を「GameObject」にドラッグ&ドロップする
8.Hierarchyにある「GameObject」に「OSCDataTestScript」をドラッグ&ドロップする
9.Hierarchyにある「GameObject」をクリックし、「Inspector」→「Port」に「8000」と入力する
10.「Ctrl(Macはcommand) + Shift + C」キーを押して、コンソール画面を出す
11.「OSCDataTestScript」をダブルクリックして、下記のスクリプトを入力する
using System.Collections; using System.Collections.Generic; using UnityEngine; using uOSC; public class OSCDataTestScript : MonoBehaviour { // Use this for initialization void Start() { var server = GetComponent<uOscServer>(); server.onDataReceived.AddListener(OnDataReceived); } void OnDataReceived(Message message) { // address var msg = message.address + ": "; // values foreach (var value in message.values) { msg += value.GetString() + " "; } //どのUIかを出力 Debug.Log("どのUIか = " + message.address); /* 下記のDebug.LogはUIを動かしてどんな値が出力されるのかを表示する。 アプリによってint・float・string・ byte[]いずれかで出力されるので、 分からない場合は下記の「(float)message.values[0]」の「float」を「int・string・ byte[]」いずれかに変えて、エラーが出ないものにすると良いかも。 stringの場合は、下記のように数値に変えてやる必要あり 文字列から数値へ変換: float f1 = float.Parse("105.6"); */ Debug.Log("値 = " + (float)message.values[0]); } // Update is called once per frame void Update () { } }
12.Unityの実行ボタン(再生ボタンみたいなやつ)を押す
13.TouchOSCなどのOSCアプリ(IPhoneアプリ)を立ち上げ、UIをタッチしてみる
14.Unityの「Console」ウィンドウに「どのUIを操作したか」「どんな値か」が表示されているのを確認する
15.すべてのUIをタッチして、「どのUIか」の値をメモっておく。「/toggleA_1」「/1/faderA」など
オブジェクトと照明を作成する
1.新しくプロジェクトを作成し、先ほどダウンロードした「.unitypackage」ファイルを「Assets」フォルダにドラッグ&ドロップする
2.「Import」ボタンを押して読み込む
3.適当にオブジェクトとライトをを配置して、名前をつける
4.「GameObject」メニュー→「Create Empty」で空のオブジェクトを作成する(ライトを増やすことを想定して)
5.4.に名前をつける(ここでは「Lights」にしました)
6.ライトを5.にドラッグ&ドロップする
スクリプトを書く
1.「Assets」フォルダ→「uOSC」→「Scripts」→「uOscServer」を「GameObject」にドラッグ&ドロップする
2.「Assets」を右クリックし、「Create」→「C# Script」を選択する
3.2.に「OSCTestScript」等名前をつける
4.Hierarchyにある「Lights」に「OSCTestScript」をドラッグ&ドロップする
5.Hierarchyにある「Lights」をクリックし、「Inspector」→Portに「8000」と入力する
6.「OSCTestScript」をダブルクリックして、下記のスクリプトを入力する
using System.Collections; using System.Collections.Generic; using UnityEngine; using uOSC; //Lightsをクリックして、Portに「8000」と入力しておく public class OSCDataTestScript : MonoBehaviour { //ライト指定 public GameObject slight1; void Start() { //OSC関連 var server = GetComponent<uOscServer>(); server.onDataReceived.AddListener(OnDataReceived); } void OnDataReceived(Message message) { //TouchOSCを使った場合、データはfloatで出る(toggleDataがデータ) var toggleData = (float)message.values[0]; float LIntensity1 = slight1.GetComponent<Light>().intensity; Color lightC1 = slight1.GetComponent<Light>().color; foreach (var value in message.values) { //処理を書く。「message.address == "/toggleA_1"」の「" "」の部分は「uOSCを読み込んで、OSCアプリの出力を調べる」14.の項目で 出力された値を入力する LIntensity1 = (message.address == "/toggleA_1" && toggleData == 1.0f) ? 10.0f //いちばん左下のトグル(ボタン)をOnにすると、ライトもOn : (message.address == "/toggleA_1" && toggleData == 0.0f) ? 0.0f //Offにすると、ライトもOff : (message.address == "/1/faderA") ? toggleData * 10.0f //いちばん左のスライダーを動かすと、ライトの明るさが変わる : slight1.GetComponent<Light>().intensity = LIntensity1; //他のボタンなどを操作したときはそのまま lightC1 = (message.address == "/1/rotaryA") ? Color.HSVToRGB(toggleData, 1,1) //左上の半円のスライダー?を動かすと、色相(色味)が変わる : (message.address == "/toggleA_2" && toggleData == 1.0f) ? Color.HSVToRGB(0,0,1) //いちばん下の左から2番目のトグル(ボタン)をOnにすると、ライトの色を白にする : (message.address == "/toggleA_2" && toggleData == 0.0f) ? Color.HSVToRGB(0,0,0) //Offにすると、ライトの色が黒にする : slight1.GetComponent<Light>().color = lightC1; //他のボタンなどを操作したときはそのまま } //最終的な照明の明るさと色 slight1.GetComponent<Light>().intensity = LIntensity1; slight1.GetComponent<Light>().color = lightC1; } // Update is called once per frame void Update () { } }
7.Hierarchyにある「Lights」をクリックし、Inspectorの「Slight 1」にライトをドラッグ&ドロップする
8.Unityの実行ボタンを押して、iPhoneのOSCアプリを動かしてみる
スクリプト解説
三項演算子による条件分岐
基本的には下記と同じですが、今回はライトのON/OFFを「Color.clear(色)」ではなく「intensity(明るさ)」の値で管理しました。
同様に「If〜else」「Swtich〜case」を使わず、三項演算子で短く条件分岐を書いています。
prince9.hatenablog.com
・ライトのON/OFFを三項演算子で条件分岐
float LIntensity1 = slight1.GetComponent<Light>().intensity; LIntensity1 = (message.address == "/toggleA_1" && toggleData == 1.0f) ? 10.0f //いちばん左下のトグル(ボタン)をOnにすると、ライトもOn : (message.address == "/toggleA_1" && toggleData == 0.0f) ? 0.0f //Offにすると、ライトもOff : slight1.GetComponent<Light>().intensity = LIntensity1; //他のボタンなどを操作したときはそのまま slight1.GetComponent<Light>().intensity = LIntensity1;
・ライトの明るさを三項演算子で条件分岐
float LIntensity1 = slight1.GetComponent<Light>().intensity; //いちばん左のスライダーを動かすと、ライトの明るさが変わる LIntensity1 = (message.address == "/1/faderA") ? toggleData * 10.0f //他のボタンなどを操作したときはそのまま : slight1.GetComponent<Light>().intensity = LIntensity1; slight1.GetComponent<Light>().intensity = LIntensity1;
・ライトの色を三項演算子で条件分岐
Color lightC1 = slight1.GetComponent<Light>().color; //左上の半円のスライダー?を動かすと、色相(色味)が変わる lightC1 = (message.address == "/1/rotaryA") ? Color.HSVToRGB(toggleData, 1,1) //他のボタンなどを操作したときはそのまま : slight1.GetComponent<Light>().color = lightC1;
TouchOSCのどのUIを操作したか
「 "/toggleA_1"」はTouchOSCアプリのどのUIを動かしたかを示します。この場合は「いちばん左下のトグル(ボタン)」になります。
「"/1/faderA"」は「いちばん左の緑色のフェーダー」、「"/1/rotaryA"」は「いちばん左上の緑色の半円のUI」になります。
どのUIがどれに該当するのかは、「uOSCを読み込んで、OSCアプリの出力を調べる」14.の項目で調べています。
ちなみにTouchOSCの「Automat5」を使用した場合は、下記のようになります。