Unity StreamingAssetsからファイルを読み出す

Streaming Assets で iOSとAndroidの違いにハマったのでメモ。

string FilePath;
#if UNITY_IPHONE
  FilePath = Application.dataPath + "/Raw/" + filename;
#else
  string fullPath = "jar:file://" + Application.dataPath + "/!/assets/" + filename;
  WWW www = new WWW (fullPath);
    while (!www.isDone) {
  }
  FilePath = Application.persistentDataPath + filename;
  File.WriteAllBytes (toPath,www.bytes);
#endif

iOSはそのままパスからファイル読み込みできるけど、Androidは一度Application.persistentDataPathにコピーしてから開かないといけない。

Unity Export Packageは実機でtagの情報を引き継がない

別のプロジェクトで作ったものを、いったん.unitypackageでエキスポートしたのですが、インポートすると、エディタでは問題なく動くのに、実機転送すると動かなくなる現象があり、むちゃくちゃハマりました。

もとのプロジェクトでつけてたtagがエキスポートすると引き継がれないのですが、エディタ上でプレファブのインスペクタのタグをみると、普通にタグがかかれているため、バグの発見に時間がかかりました。タグはよく使っていたので今後は注意します。

と思ったら引き継がれてました。。。あれ、どこでタグが消えてしまったんだろう。。。

Unity の lookAt を おきかえる

UnityのlookAtは便利ですが、回転をさらに細かく制御しようと思うと難しいので置き換えます。


Rot.transform.LookAt (Vector3.zero);

こうするところを、


Vector3 relative = gameObject.transform.InverseTransformPoint(Vector3.zero);
float angle = Mathf.Atan2(relative.x, relative.z) * Mathf.Rad2Deg;
Rot.transform.localRotation = Quaternion.Euler(0,angle - 90.0f, 0);

こうしてあげると、Vector3.zeroをむきつつ90.0度Y軸回転をできます

VRシューティングゲーム「GCLOPS」をOculus Store for GearVR のギャラリーアプリで公開しました

GCLOPS

先週の「RingNinja」に続いて、GearVR向けのVRシューティングゲーム「GCLOPS」がOculus Storeのギャラリーアプリで公開されました。Oculus Store

半年前にOculus Storeに申請を出して1度リジェクトされて、そのあとApprovedされたにもかかわらず、keys onlyというステータスでストアでの公開はできませんでした。ストア公開されない理由は特に教えてもらえないので謎のままなのです。その後もエネミーのデザインをマッチョにしたり、動画を入れたり、UIを変えたりと、地道なバージョンアップを続けて、ついに12月8日に公開されました!

そもそも2016年1月にあった「Unity VR EXPO Shibuya」に出展しようと、ちょうど1年前くらいに出たばかりのGearVR向けにとりあえず作っていた射撃ゲームを全面改装しました。その射撃ゲームをテストしている姿がはたから見ていると、XMENのサイクリップスに見えたんですよね。360度見渡しながら右手でGEARVRのパッドを触って打つところとか。

GearVRだと移動ができないので、シューティングゲームはどうしても単調になってしまうのですが、そのあたりはアップデートで変えていきたいと思ってます。

それとVRだと広告モデルがまだないので、基本的に有料アプリかアプリ内課金が主流なのですが、このあたりは難しいところですね。やってみないと面白さのわからないVRこそ無料アプリで出して、広告かアプリ内課金をするというのがあっていると思うのですが、アプリ内課金の場合、追加課金をさせるだけのバリューが必要になってくるので、長時間遊べないVRでは悩み所だなと思いました。とりあえず有料アプリとして190円で出してます。

GearVR持ってる人は是非ダウンロードしてみてください。

Structure Sensor が届きました 、VR/ARもモバイルが本命という話

Structure sensor きた!全く新しいVR/ARのプロダクト作る! #vr #ar #structuresensor

正裕 黒川さん(@masahiro8.backham)が投稿した写真 –

Structure Senseor という iPhone / iPad を拡張する深度センサーをゲットしました。

とある相談を受けて深度センサーを使ったVR/ARのプロダクトを作る調査をしていました。KinectをはじめRealSenseなど深度を検出できるセンサーは結構色々と出ていて特にZEDはなかなかインパクトがあって良さげだったのですが、実はどれもモバイルでは使えなそうでした。相談は必ずしもモバイルである必要もなかったのですが、僕が考えるAR/VRはユーザーの行動に制限をさせないことが重要だと思ってます。

携帯電話とかスマホが普及したのも、デスクトップPCや固定電話を使わなくなったのも、ケーブルレスでパーソナルでユーザーの行動が自由になったからです。究極のユーザビリティというのはここなんだと思います。そしてユーザーの行動が自由になるほどよりパーソナルになっていく。スマホのVRは1人に1つはまぁ想像つかないことはないけど、RiftとかViveは基本的に1人で没入するものなのに家の中で絶対に1人1つは持たないでしょう。VRの主流は1人1台のモバイル端末に取って代わられてしまうと思います。固定電話と携帯電話、PCとスマホ、据え置きゲーム機と携帯ゲーム機みたいな感じで。

ですので僕はVR/ARももしスケールするとしたらモバイルである必要があると思ってます。現在の究極型はホロレンズですね。さすがに屋外でホロレンズは使う人を選ぶと思いますが、家の中とかオフィスの中でなら1人1台ホロレンズを使って生活する未来は想像がつかなくもないです。

そういうわけでバッカムではケーブルレスで自由なモバイルのVRが何か新しい体験を生み出せることを実証するためには現状でStructure Sensorが1番やりやすいと思ってゲットしました。

Unityでクラスをnewしてインスタンスを作る方法

UnityはたいていGameObjectにComponentを追加して実行するのですが、スクリプト内ででクラスをnewしてインスタンス作ることもできます。ただUnityの作法があって知らないとはまるのでメモっておきます。

 
インスタンス作る場合


ClassName object = gameObject.AddComponent<ClassName>();
object.method();

 
これでもOK


gameObject.AddComponent<ClassName>();
gameObject.GetComponent<ClassName>().method();

やってることは同じで、あらかじめGameObjectにComponentとしてクラスを登録してあげないといけない。登録したコンポーネントをGetComponentする感じですね。

VRのSDKを使わずにUnityでVRの作り方

カードボードなどのVRのSDKを入れなくてもUnityでVRを実装する方法を教えてもらったらめちゃくちゃ簡単でした。

2眼カメラを作る

まずは2眼のカメラの作り方から。仕組みは簡単で要は右目と左目のカメラを用意して表示範囲を左右半分づつにするだけです。

ヒエラルキーに両目のカメラを入れる空のGameObjectを0,0,0に置く。とりあえずVRHeadと名前をつけて、その中にカメラを2つ配置してEyeLeftとEyeRightと名前をつけます。これがそれぞれ右目と左目用のカメラになるわけですね。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-22-21-32-08

このままだとまだ画面は1つなので、

画面を2つに分割する

画面を2つに分割します。表示領域を左右に分割して表示すればよくて、まず左目用のEyeLeftを選択してインスペクターの中のCameraを開く。ここのViewport Rectの設定を変更すると表示領域が変わります。画面をRectとして、X,Yで表示開始座標、W,Hで幅と高さを設定してあげます。

左目はこんな感じ

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-22-21-35-24

右目はこんな感じ

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-22-21-37-32

これで画面が半分に分割されます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-22-21-38-07

 

デバイスの回転を実装

カメラはできたので、今度はデバイスの回転を拾って画面に回転を反映させる方法。やることは3つです。

1.デバイスのジャイロを使えるようにする

2.ジャイロの回転を拾う

3.VRHeadに回転を反映させる

これだけです。では先ほどのVRHeadに新しくスクリプトRvVRCameraを作ります。

using UnityEngine;
using System.Collections;

public class RvVRRotation : MonoBehaviour {

	public GameObject Head;

	// Use this for initialization
	void Start () {
		Input.gyro.enabled = true;
	}
	
	// Update is called once per frame
	void Update () {
		
		if (Input.gyro.enabled)
		{
			Quaternion direction = Input.gyro.attitude;
			Head.transform.localRotation = Quaternion.Euler(90, 0, 0) * (new Quaternion(-direction.x,-direction.y, direction.z, direction.w));
		}
	}
}

まず、

void Start () {
	Input.gyro.enabled = true;
}

ここでデバイスのジャイロを有効に

Quaternion direction = Input.gyro.attitude;

ここでジャイロの回転を取ってきます

Head.transform.localRotation = Quaternion.Euler(90, 0, 0) * (new Quaternion(-direction.x,-direction.y, direction.z, direction.w));

VRHeadにジャイロの回転を渡して画面に反映させる

あとはインスペクタのRvVRRotationのHeadにVRHeadを入れてあげればOK

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-22-21-55-50

これだけでスマホでVRができてしまいます!素晴らしく簡単な方法を教えてもらいました。

ただ他のVR用のSDKを入れると解決するのかはわからないのですが、Galaxy S6のジャイロがどうもノイズが多くて酔います。。iPhoneやNexus5ではそうでもないので、端末の問題だと思うんですけど、ローパスフィルタは必須ですね。

Unityで連番レンダリングできる「Renderator Pro」の使い方

Unityでレンダリングできる有料アセット「Renderator Pro」の使い方

Renderator Pro

簡単にUnityでレンダリングができるようになります。作ったゲームのシーンとかプロモの動画とかもこれを使えば簡単にできるのではないかと思います。

使い方

インポートしたRenderator Proをカメラにアタッチするだけで、あとはインスペクタから各種設定をしてPlayボタンを押すだけでどんどんレンダリングをはじめます。

メインカメラにRenderator_PRO_EN.csをアタッチします

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-4

はじめに設定アイコンからChoose save folderを選んでレンダリングした連番ファイルの保存フォルダを選択します。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-6

するとインスペクタのPathにフォルダが表示されるので、他の設定をします。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-7

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-9

width:画像の幅

height:画像の高さ

Length:時間をMinutes,Secondsで設定

Framerate:秒あたりのフレーム数

上記のキャプチャは、幅800ピクセル、高さ600ピクセルの解像度で秒間30フレームで5秒間のレンダリング設定、あとはQuit Play Modeにチェックを入れるとレンダリング後に動画で再生してくれます。

最後にPlayボタンを押してレンダリング開始。簡単でしかもGPUレンダリングなので早くて素晴らしいです。

ffmpegでpng連番をmp4にする

 

ffmpeg -r 24 -i Render%05d.png -vframes 479 -codec libx264 -pix_fmt yuv420p -r 24 out.mp4

Unityでスクリーンショットも画面キャプチャもできない!って時の対処方法

ほんとこれに悩まされました。。
なぜかMOBILE&VRのデモアプリだけ、Galaxyのハードウェアボタンでスクショをとろうと思っても、真っ黒けになってしまって、全く何が起こっていたのかわからなかったのだが、ようやく謎が解けました!

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-13

ここにチェックが入ってると、スクショも動画もとれないです!