まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

UnityでiPhoneを使ってライトをコントロールする

下記ではMIDI機器を使用しましたが、今度はiPhoneでライトをコントロールしました。
prince9.hatenablog.com

ただタッチで細かい操作は事故りそうなので、個人的にはMIDI機器使用が確実と思われます。

f:id:prince9:20181016201155g:plain

プロジェクトファイルはこちらです。
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」をタップする。
f:id:prince9:20181016195251p:plain
すでにUIが出ている場合は●ボタンを押す
f:id:prince9:20181016195526p:plain
4.「Host」に1.でメモしたPC側のIPアドレスを入力して、そのまま「完了」ボタンを押していく
f:id:prince9:20181016195411p:plain
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を操作したか」「どんな値か」が表示されているのを確認する
f:id:prince9:20181016195135p:plain
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」と入力する
f:id:prince9:20181016145826p:plain
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」を使用した場合は、下記のようになります。
f:id:prince9:20181016200551p:plain