脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

C#でファイルの読み書きの方法

Read

StreamWriter writer = new StreamWriter(path);
writer.Write(value);
writer.Close();
  • pathは保存したいファイルのパス
    • Unityとかだと『Application.streamingAssetsPath + "/" + filename』みたいな
  • valueは保存したいデータ

Write

StreamReader reader = new StreamReader(path);
string value = reader.ReadToEnd();
reader.Close();
  • 上記と同じ
  • ファイルが隠しファイル(Hidden属性をもっている場合)はReadはできるがWriteはできない

EasyMovieTextureで動画をポーズ/再開させる

前回のポストの続きになります
portaltan.hatenablog.com

前回は起動したら単純に一回だけ再生するというシンプルすぎるアプリでしたが、今回は自前のスクリプトを貼りつけて、ユーザの入力に応じてポーズなどの処理をできるようにしましょう

1. デフォルトのスクリプトの再生設定を削除

  • Sphere100のMedia Player CtrlのInspector上でStr File Nameの項目を削除します

(これで自動再生されなくなります)
f:id:portaltan:20160712145358p:plain

2. 自前のスクリプトの作成

  • 今回はEasyTest.csという名前にしました
using UnityEngine;
using System.Collections;

public class EasyTest : MonoBehaviour {
	public MediaPlayerCtrl EasyMovieTex;

	void Start () {
		EasyMovieTex.Load ("slider.mp4");
		EasyMovieTex.Play ();
	}
}

3. スクリプトをSphere100へ貼りつけます

  • EasyTest.csスクリプトをhierarchyビューのSphere100へD&Dで貼りつけます
  • Inspector上のEasyTest(Script)で、Easy Movie TexにSphere100をアサインします

f:id:portaltan:20160712150312p:plain

ここまでで以前同様に起動したら一回だけ再生する状態になりました

4. ポーズ処理の追加

再生中にスペースを押したらポーズし、ポーズ中にスペースを押すと再開するような処理をUpdate内に書いていきます

using UnityEngine;
using System.Collections;

public class EasyTest : MonoBehaviour {
	public MediaPlayerCtrl EasyMovieTex;

	void Start () {
		EasyMovieTex.Load ("slider.mp4");
		EasyMovieTex.Play ();
	}

	void Update () {
		if (EasyMovieTex.GetCurrentState ().ToString () == "NOT_READY") {
			Debug.Log ("Preparing");
		} else if (EasyMovieTex.GetCurrentState ().ToString () == "END") {
			Debug.Log ("Finished");
		}

		if (Input.GetKeyUp (KeyCode.Space)) {
			switch (EasyMovieTex.GetCurrentState ().ToString ()) {
			case "PLAYING":
				EasyMovieTex.Pause ();
				break;		
			case "PAUSED":
				EasyMovieTex.Play ();
				break;
			}
		}
	}
}

以上です。
最初の4行は再生の準備中と終了時にはログを表示させています

EasyMovieTextureでGearVR用の360動画アプリを作成する

Unityには標準でMovieTextureという動画を再生する機能がありますが、この機能はAndroidには対応していないので、GearVRでは利用できません。

UnityでGearVRの360動画アプリを作成する方法はいくつかあるようですが、現在はEasyMovieTextureというassetを利用して作成することが主流なようです。
https://www.assetstore.unity3d.com/jp/#!/content/10032


以下はEasyMovieTextureの使い方の簡単な説明です

1. EasyMovieTextureのimport

まずはEasyMovieTextureをimportします
f:id:portaltan:20160707175409p:plain

  • 2016/07/07現在65ドルです
  • importすると動画再生に必要なコンポーネントやデモシーン、デモ動画がプロジェクトにimportされます

2. EasyMovieTexture Editor Mode(beta)のimport

EasyMovieTextureによる動画機能は、Unityのシミュレータで確認することができません。
つまりどういうことかと言うと、確認には毎回Andoridにプロジェクトを書き出して実機で確認する必要があります。
これは凄い手間だったのですが、現在は作者様がベータ版としてUnityのEditor上でシミュレーションできるUpgrade packを用意してくださったので、こちらもダウンロードしてimportしておきます
f:id:portaltan:20160707180141p:plain

3. 360動画の用意

Equireqtagular形式の360動画を用意し、Assets/StreamingAssetsにimportします

  • 配置先はここでないといけません
  • Unity標準のMovieTextureのようにimport時に変換は行われません
  • 今回はTheta公式サイトからダウンロードしてきた滑り台の動画を使用します

f:id:portaltan:20160707182003p:plain
ギャラリー | RICOH THETA

4. 動画を投影する天球マテリアルの準備

Blenderとかでも自分で作れるようですが、私は以下のサイトで公開してくださっている天球マテリアルを利用させて頂いています
No hack, no work • UnityとOculusで360度パノラマ全天周動画を見る方法【無料編】

  • Sphere100.fbxをimport
  • importしたSphere100をHierarchyビューへD&D
  • Scaleを適当に100, 100, 100とかに拡大

f:id:portaltan:20160707180919p:plain

5. Texutureの設定

このままでは天球自体の影が出来て動画が暗くなってしまうので、Texutreの種類をStandardからUnlit/Textureへ変更します
f:id:portaltan:20160707182814p:plain

6. 動画スクリプトの貼りつけ

EasyMovieTexture/Scripts/MediaPlayerCtrlをHierarchyビューのSphere100へ貼りつけます
f:id:portaltan:20160707181155p:plain
貼りつけるとInspectorにMedia Player Ctrlという項目ができます
ここでちょっとややこしいのですが、HierarchyビューのSphere100自身をTargetMaterialという項目にD&Dします
f:id:portaltan:20160707181502p:plain

7. 再生する動画の指定

次にStr File NameにStreamingAssets以下に配置した再生したい動画ファイル名を入力します

  • 拡張子も必要です

f:id:portaltan:20160707182237p:plain

8. 確認します

ここまでで再生の準備は完了したので再生してみましょう
以下のように360動画が再生されることが確認できます
f:id:portaltan:20160707182552p:plain


今回はただ単純にアプリを起動したら1回だけ再生するという単純なアプリだったので、次回はポーズなど動画操作をする方法を載せたいと思います

Oculus Rift DK2からCV1に変えたらUnityで認識しなくなった([VRDevice] Initialization of device oculus failed)

f:id:portaltan:20160622170457j:plain

問題

Oculus Rift DK2で今まで開発をしていたのですが、そろそろCV1に変えようということで以下の公式サイトからインストーラをダウンロードしてセットアップは無事完了したのですが、UnityがCV1を認識してくれなくなりました。
Oculus Rift Setup | Oculus

エラーメッセージを見ると以下のようなエラーが出ていました
[VRDevice] Initialization of device oculus failed

解決法

その1

Unityをupdateする

5.3.2とか5.3.3では使用しているOVRPluginが古いらしくCV1を認識してくれません
2016/6/22現在最新の5.3.5を利用すると認識されるようになります

その2

Pluginだけ最新のものに入れ替える

どうしてもUnityのversionをあげたくない場合は、OculusのHPから最新のOVRPluginをダウンロードしてUnityのディレクトリに配置しましょう
https://developer.oculus.com/downloads/game-engines/1.3.2/OVRPlugin_for_Unity_5/

配置先はデフォルトの場合
C:\Program Files\Unity\Editor\Data\VR\oculus
です

ansible実行時のオプションTips

特定のサーバにのみ実行したい場合

-l <実行したいhost>

ansible-playbook playbook_example.yml -l 192.168.33.11

特定のHostsグループのみに実行したい場合

-l <実行したいhostグループ>

hostsファイル
[web]
192.168.11.11
192.168.11.12

[storage]
192.168.11.21
192.168.11.22
ansible-playbook playbook_example.yml -l storage

指定したタクスからはじめたい場合

--start-at <タスク名>

ansible-playbook playbook_example.yml --start-at='install package'

1タスクずつ確認しながら実行したい場合

--step

タスク毎に引き続き実行するか確認が入る(y/n/c)

  • y: 実行
  • n: スキップして次のタスクへ
  • c: キャンセル

playbookの確認

--check

実際に実行はせずテストが出来る

sudo のパスワードを実行時に指定する方法

-K

vagrant環境などsudoのパスワード入力が要求されない場合はいらないが、実際の環境では当然パスワード入力が必要になるのでこのオプションで指定する

指定したタクスのみ実行したい場合

playbookの中でtagsを指定し、実行時にタグ名で指定する

--tags=<タグ名>


playbook

- hosts: webserver
  sudo: yes
  tasks:
    - name: download package
      get_url:
        url: https://hogehoge.deb
        dest: /usr/local/src/hogehoge.deb
        validate_certs: no
      tags:
        - download

    - name: install package
      command: dpkg -i /usr/local/src/hogehoge.deb
      tags:
        - install

実行オプション

ansible-playbook playbook_example.yml --tags=download
ansible-playbook playbook_example.yml --tags=install

grafanaでAPIを使ってCUIからダッシュボードを作成する方法

CUIから

1. API keyの発行

grafanaのGUIからAPI keyを発行します
f:id:portaltan:20160527090420p:plain

ユーザ名を入力し、RoleをAdminに変更してAddボタンを押します
f:id:portaltan:20160527090552p:plain

APIのKeyが表示されるのでメモしておきます
f:id:portaltan:20160527090759p:plain

2. jsonファイルの作成

ダッシュボードの設定ファイルをjsonで作成します
名前はなんでもいいです(今回はtest.json)にしました

{
  "dashboard": {
    "id": null,
     .
     .
     .
   },
   "overwrite": false
}
  • 1行目のようにdashboardと指定しないとclassification errorで作成されません
  • idをnullにすると新規に作成します
  • overwrite: falseは既存のダッシュボードの設定を上書きしないという設定です(念のため)
3. APIからダッシュボードの作成

コマンドは

curl -H "Authorization: Bearer {YOUR_AUTH_KEY}" http://{YOUR_GRAFANA_ADDRESS}/api/dashboards/db -H "Accept: application/json" -H "Content-type: application/json" -X POST -d @{JSON_FILE_NAME} 

curl http://192.168.33.13:3000/api/dashboards/db \
-H "Authorization: Bearer hogehogehogeohgeohgeohgeohgoehgoehgoeg" \
-H "Accept: application/json" \
-H "Content-type: application/json" \
-X POST -d @test.json

問題なく作成が完了すれば
{"slug":"ダッシュボード名","status":"success","version":0}
と表示されます。

以上で完了です

4. 確認

以下のコマンドでダッシュボード情報も取得できます

curl -H "Authorization: Bearer {YOUR_AUTH_KEY}" http://{YOUR_GRAFANA_ADDRESS}/api/dashboards/db/{DASHBOARD_NAME}

GUIから

ちなみにGUIから作成するときは以下のImportから作ります
f:id:portaltan:20160527092624p:plain