Unity / VRゲーム開発日記@長崎

Unityを使ったVRのゲーム開発をやってます。

Unity5でReflection Probeを使った反射を試してみた

Unity5で物体に周りの風景を反射させてみたかったんですが、
思ったより手続きが煩雑。


以下のAssetを解析していけば、色々とわかると思うけど、
設定値とかを細かく見ていかないといけなそう。

■Shader Calibration Scene - Asset Store
https://www.assetstore.unity3d.com/jp/#!/content/25422


今回は空のシーンから反射の反映までに行った手順について。


================================================


とりあえず、シーンに、Cubeと床を適当に追加。

f:id:icoc_dev:20151116101116j:plain



マテリアルも適当に作って、Cubeに反映。

f:id:icoc_dev:20151116102515j:plain

反射した時の画像をよく移すために
「Mettalic」と「Somothness」を「1」に設定。



反射させるためには、「Reflection Probe」というComponentが必要みたいなので、
Cubeに追加。

※[11/16追記]
「Reflection Probe」は反射を影響させる範囲を示すものとして設置するみたい。
なので、反射させたいものにつけるのではなく、反射させたいエリアに独立したものとして
置くべきものっぽい。

一個おいておけば、そのReflectionProbe対象範囲にあるオブジェクトは
MettalicやSomotthnessの状態に合わせて勝手に反射する感じ。

また、デフォルトだとAwake時の配置でしか反射されず、
オブジェクトが移動した時などに、写っている映像が反映されなくなるので調整。


f:id:icoc_dev:20151116101322j:plain

Type → Realtime
Reflesh Mode → Every frame
Box Projection → True (※今回はCubeなのでとりあえず設定してみたらうまく行った)
Resolution → 512 (個々の数値が高いほど綺麗な画像が映る(処理はもちろん重くなるはず))


あとは反射がリアルタイムに行われてるのがわかりやすいように
適当なオブジェクトと、回転スクリプトとかを追加。


↓結果



Unity5でReflection Probeを使った反射を試してみた - YouTube



Reflection Probe自体は、オブジェクトの回転と同期しないみたいで
反射のされ方がおかしく見えます。
スクリプトで更新しないといけないのかな??

※[11/16追記]上記通り、オブジェクトにつけるものじゃなく
環境に設置するものなので、一般的には回転の必要が無いはず。




とりあえずやってみたところなので、
また色々と試して使い方がわかってきたら新しく記事あげます。

Unity5でOculusを制御

Unity5では、デフォルトでVR出力ができるようになって便利になりましたが、
ラッキングセンサの ON / OFF とかどうやるんだろうと迷った。


2015/11/11 現在、OculusよりUnity5向けサンプルSDKが提供されてるみたいで、
その中に、OVR系のクラスがあったので、とりあえずUnity5でもOculus情報の取得とかできそう。


f:id:icoc_dev:20151111135234j:plain
※リンク先の下の方

Developer Center — Downloads | Oculus
https://developer.oculus.com/downloads/


ただし、Unity4の頃とは構成が若干変わってるので、
使えなくなった関数などもあり。


リファレンスないのかな??

Animatorの再生再開(暫定)

AnimatorでStopしたアニメーションを、そのまま再生させる方法が不明。


今回は、毎回デフォルトステートから再生させれば良いパターンだったので、

animator.Stop();

をした後、再開させたい場面で

animator.enabled = false;
animator.enabled = true;

ってやると、再開された。


animator.Play()


という、再開の関数もあるのだけど、
引数にhash値が必要で、直前に停止していた時のステートのhash値をどう取ればよいのか
わからなかった。


animator.Resume()



って関数つけてくれればいいんだけど・・・

サブカメラを使ったミラー(鏡)の擬似実装

サブカメラを使ったミラー機能の実装。


カメラだと、描画するレイヤを設定できるので、
例えばプレイヤーだけ鏡に映さないとかも可能そう。


まず、ProjectにRender Textureを追加。
f:id:icoc_dev:20150422095946j:plain



Render Textureの設定はこんな感じ。
f:id:icoc_dev:20150422095947j:plain

Sizeが大きいほど、きれいな鏡になる。


Hierarchyにミラー用のカメラと、鏡となる平面オブジェクト(Quad)を追加。
あと、写ってるのがわかるように適当にオブジェクトとライトも追加。
f:id:icoc_dev:20150422095940j:plain


カメラの設定。
ProjectionをOrthographicにして、平面オブジェクトの目の前に設置。
Sizeの値で鏡に写るオブジェクトの大きさが変わる。
f:id:icoc_dev:20150422095944j:plain



QuadにRender Textureを反映。

そのままだと、カメラに写ったままの表示で鏡にならないので、
ScaleのXをマイナスにして反転。

ShaderをSelf-Illumin/Diffuseに設定すると
良い感じに明るくなった。

f:id:icoc_dev:20150422095950j:plain



とりあえず、鏡っぽくなりました。
f:id:icoc_dev:20150422101258j:plain




配置のスクショ
f:id:icoc_dev:20150422102214j:plain

ジェスチャーの追加 | Kinect v2 with MS-SDK

前回記事に引き続き、MS-SDKについて。


MS-SDKは、ジェスチャーの認識機能があり、
デフォルトで、ジャンプやスクワット、
手でのスワイプ動作などがある。


ジェスチャーの表現方法としては、
手や足などが、指定時間内にどのように変化したかを
確認する形となる。



また、新しいジェスチャーを追加するには、
その表現をコードで直書きしないといけない。


ここがちょっと面倒。


既存のジェスチャの表現は、
KinectGestures.cs
というファイルに記述されている。


このファイルに

CheckForGesture

という関数があり、各ジェスチャごとにcase文が存在する。
なので、自分でジェスチャを追加するには、表現したいジェスチャに近い
case文をコピってカスタマイズという流れ。



また、case文はenumとなってるので、
ファイル冒頭の

public enum Gestures

にジェスチャ名を追加しておく必要がある。




ちなみに、既存のジェスチャとして登録されているのは以下のとおり

public enum Gestures
{
	None = 0,
	RaiseRightHand,
	RaiseLeftHand,
	Psi,
	Tpose,
	Stop,
	Wave,
	SwipeLeft,
	SwipeRight,
	SwipeUp,
	SwipeDown,
	ZoomOut,
	ZoomIn,
	Wheel,
	Jump,
	Squat,
	Push,
	Pull,
	LeanLeft,
	LeanRight,
	KickLeft,
	KickRight,
}

例としてJumpの表現を確認してみる。

case Gestures.Jump:
	switch(gestureData.state)
	{
		case 0:  // gesture detection - phase 1
			if(jointsTracked[hipCenterIndex] && 
				(jointsPos[hipCenterIndex].y > 0.6f) && (jointsPos[hipCenterIndex].y < 1.2f))
			{
				SetGestureJoint(ref gestureData, timestamp, hipCenterIndex, jointsPos[hipCenterIndex]);
				gestureData.progress = 0.5f;
			}
			break;
	
		case 1:  // gesture phase 2 = complete
			if((timestamp - gestureData.timestamp) < 1.5f)
			{
				bool isInPose = jointsTracked[hipCenterIndex] &&
					(jointsPos[hipCenterIndex].y - gestureData.jointPos.y) > 0.15f && 
					Mathf.Abs(jointsPos[hipCenterIndex].x - gestureData.jointPos.x) < 0.2f;

				if(isInPose)
				{
					Vector3 jointPos = jointsPos[gestureData.joint];
					CheckPoseComplete(ref gestureData, timestamp, jointPos, isInPose, 0f);
				}
			}
			else
			{
				// cancel the gesture
				SetGestureCancelled(ref gestureData);
			}
			break;
	}
	break;

まず、変化の状態としてgestureData.stateを見ており、
2段階の変化を見ている様子。


フェーズ1では、
jointsTracked[hipCenterIndex]
が有効か、また有効なら
jointsPos[hipCenterIndex]のy座標が
0.6f~1.2fに収まるかを見ている。

この条件に当てはまれば、フェーズ1をクリアし、
ジャンプの準備が整ったと見る様子。

そのあとは、
フェーズ2へ。


フェーズ2ではtimestampが1.5f以下かというのを見ているので、
1.5秒以内に次の動作へ移ったかという事だろう。
この時間以上であれば、elseとなるので、
ジェスチャーをキャンセルして、またフェーズ1の条件を
満たすのを待つこととなる。


そして、1.5秒以内の動作で
jointsPos[hipCenterIndex]とgestureData.jointPosの
y座標の差が0.15以上かというのを見ている。


gestureData.jointPosが前回位置だと思われるので、
おしりの位置が前回より15cm以上上がってるかというのを見ているっぽい。


また、x値が0.2fかというのも見ているので、
横移動が大きい場合は、ジャンプとみなさない様子。




以上がジャンプの表現の解析。



2段階での表現となると、線形の動きしか取れなそう。
3段階のフェーズが他にないので、拡張できるかは要調査。


歩くとか、手を叩くとか、そのくらいの動作なら
簡単に追加できそうかな?



■前回記事icoc-dev.hatenablog.com

Kinect Managerのプロパティについて | Kinect v2 with MS-SDK

Kinect v2 with MS-SDKについて、使い方がよくわからないので
現在詳細調査中。


ちなみに、Kinect v2 with MS-SDKはUnityでKinect v2を使うための
有料Assetです。


この間買った時は、4.6対応だったけど、
今見たら5.0以上が必須になってる!?


早めに購入しておいてよかった。


まだ5には移行できてません(TT)



とりえず、今回はKinect Managerのプロパティについて、
ソースに書かれてる英語を機械翻訳してみました。
一部手を加えてます。


使い方詳細分かり次第また記事書きます。

f:id:icoc_dev:20150408143626j:plain


変数名 解説(機械翻訳あり)
float sensorHeight センサーの地上からの高さ(メートル)
float sensorAngle センサーの仰角(度)
bool hintHeightAngle 検出されたセンサの高さと角度についてのヒントを示している。ユーザーがセンサーの前に滞在する必要があります。
bool computeUserMap ユーザーマップの利用
bool computeColorMap カラーマップの利用
bool computeInfraredMap 赤外線の利用
bool displayUserMap ユーザーマップのテスト表示
bool displayColorMap カラーマップのテスト表示
bool displaySkeletonLines 骨格のテスト表示
float DisplayMapsWidthPercent 「カメラ幅の%として、深さとカラーマップで使用される画像の幅を指定します。高さは幅に応じて計算されます。
パーセントがゼロである場合、それは「奥行き画像の選択された幅と高さに一致するように内部で計算される
bool useMultiSourceReader 可能な場合、マルチソースリーダーを使用
float minUserDistance ケルトンデータを処理するために、最小のユーザ距離
float maxUserDistance 最大のユーザーの距離があれば。 0は、MAX-距離制限がないことを意味し
bool detectClosestUser 唯一の最も近いユーザーを検出またはありません
bool ignoreInferredJoints 唯一の追跡ジョイントを使用します(と推定されるものを無視する)
Smoothing smoothing 平滑化パラメータの選択
bool useBoneOrientationConstraints 骨配向制約の使用
bool allowHandRotations 手首と手の回転を許可する
List<AvatarController> avatarControllers Kinectのユーザによって制御されますAvatarController-オブジェクトのリスト
KinectGestures.Gestures playerCalibrationPose 必要に応じてキャリブレーションは、各プレイヤーのポーズ
List<KinectGestures.Gestures> playerCommonGestures ジェスチャのリストは、各プレーヤーのために検出される
float minTimeBetweenGestures ジェスチャーの検出間の最小時間
List<MonoBehaviour> gestureListeners ジェスチャーリスナーのリスト。彼らはKinectGestures.GestureListenerInterfaceを実装する必要があります
GUIText calibrationText メッセージを表示するためのGUIテキスト。
GUIText gesturesDebugText ジェスチャーのデバッグメッセージを表示するためのGUIテキスト。

Kinect v2 with MS-SDK
https://www.assetstore.unity3d.com/jp/#!/content/18708


Unityモデルに動きを反映させるのには以下のサイトが参考になりました。www.ozmiq.com

Oculus向け音ゲー「Oculus Music!!」をGlobal Game Jam 2015で制作しました!

ここの開発日記にOculusと冠しておきながら、
長らく何も手を出せていませんでしたが、
先日、Global Game Jam(以下GGJ)に参加して、
Oculus向けのゲームを制作してきました!!


制作したものはこんな感じです。


OculusMusic in Global Game Jam 2015 - YouTube



プレイしてる所。


Playing Oculus Music. - YouTube

ルール

中央に半透明の緑丸が常時表示されていて、それが照準になります。
周り6方向にある白い丸に照準を合わせると照準が赤く光ります。

音楽が流れると、画面中央の地球から円形のノートが表示されるので、
そのノートと、白い丸が重なった時に、その照準を見つめていれば、
OK判定となります。

たまに、円形の中が赤で塗りつぶされているのがあるので、
その時は、照準を合わせた上で、ボタン(なんでもOK)を押すとOK判定です。


一般の音ゲーにあるようにGOOD、JUST、BADなどの判定はなく、
OKかMISSのみとなっています。



音楽が終了すると、画面中央にスコアが表示されて
ゲーム終了です。

実行ファイル

GGJの公式サイトに実行ファイルをアップしているので、
OculusDK2をお持ちの方は、是非試してみてください♪
http://globalgamejam.org/2015/games/oculusmusic


制作について

今回は、GGJへの初めての参加で、どういった雰囲気かもわからなかったので、
ちょっと緊張気味だったのですが、当日行った班決めで良いメンバーに恵まれて、
楽しみながら制作することが出来ました。


また、Oculusでチェックできるのが自分のPCのみだったので、
作業の分担などがうまくできず、チームのみんなには迷惑をかけっぱなしだったんですが、
そんな中でも、チームの方は想像力を働かせて、ゲームにマッチした
コードやリソースの制作をしてくれてなんとか完成にまで至りました。


Oculus向けのコンテンツ自体も初めての制作だったんですが、
ゲームとしては結構ちゃんと音ゲーになっていて、
ヘッドマウントディスプレイのゲーム性の一つの方向性を示せたのではと思っています。

気をつけた所

Oculus向けのコンテンツで一番気になっていたのが
移動時に感じる3D特有の酔いでした。
そこはできるだけ無くしたかったので、今回は
移動自体をなくし、立ち止まった状態で顔だけの操作にしました。


多くの方に試遊していただいたんですが、酔いのコメントはそんなに多くなかったので
その辺はうまく解決できていたのかなと思います。


ただ、やはり世界を動き回れるっていうのも大きな魅力の一つなので
今後、移動しても酔わないような工夫を色々と挑戦していこうと思います。


f:id:icoc_dev:20150127101052p:plain

リンク

■Global Game Jam 公式サイト
http://globalgamejam.org/


■Global Game Jam 日本
http://ggj.igda.jp/


■Global Game Jam 福岡
http://www.zusaar.com/event/11847004

クリスマスタイトルリリースしました☆

8bitゲーム、今年度中に続報!!
って釘打ってましたが、進捗の関係で
もう少し先にになりそうです。

すみません(^^;



ところで、今日はクリスマス〜〜
各地で爆発希望がつぶやかれる日ですね!!



リア充の方も、そうでない方も、
今日は是非こちらのアプリで遊んでみてください〜




こねこじゃんぷ「三匹のこねこのクリスマス」/Kittens jump in Xmas - YouTube



以前にリリースしていた、にゃんにゃんじゃんぷのクリスマスバージョンです。
主役が三匹のこねこになっていて、キャラも選べるようになっています。


できるだけキラキラさせることをイメージして作ってみました。



iPhone版はリリース直後いつも、DL数がある程度伸びるんですが、
今回のはそれがなくて、ちょっとDL数が厳しいので、
ぜひ、クリスマス過ぎに見た人もダウンロードのご協力お願いしますw


Game Centerで、キャラ毎のランキングなどもあります。



iPhone版DL
https://itunes.apple.com/jp/app/konekojanpu-san-pinokonekonokurisumasu/id949442149?mt=8&ign-mpt=uo%3D4



Android版DL
https://play.google.com/store/apps/details?id=jp.co.icoc.prj014

8bit風RPG:戦闘シーンちら見せ

前回お知らせしました
現在開発中のVita向けRPG


今回は、戦闘シーンと
モンスターを少し紹介します。



戦闘シーンはこんな感じ。
f:id:icoc_dev:20141127125604p:plain


定番の魔法使い
f:id:icoc_dev:20141127125613p:plain


ゴーレムっぽいあれ。
f:id:icoc_dev:20141127125618p:plain


知る人ぞ知る、
オパビニアさんにもご出演いただきます!
f:id:icoc_dev:20141127125609p:plain



開発中のキャラなので、
リリース版でいなくなってたらすみません(^^;

8bit風RPG開発中

現在、PlaysStation VIta向けに8bit風のRPGを開発中です。


今回は開発中の画面をちょっとだけ紹介。
(キャラがまだまっすぐ勇者(^^;

f:id:icoc_dev:20141121100729j:plain


年内にはもっと具体的な続報を報告できると思いますので、
しばしおまちを〜

MonoDevelopのソリューション部分のフォント設定

MonoDevelopのソリューション部分のフォント設定について、
ちょっと迷ったのでメモ。


f:id:icoc_dev:20141113105557j:plain



設定手順

MonoDevelop-Unity > Preferences
で設定メニューを表示。

f:id:icoc_dev:20141113110621j:plain



・Environment項目内のFontsを選択。

・パッドのFont列を選択し、Editを選ぶ。

f:id:icoc_dev:20141113110701j:plain



フォント種やサイズを選択し、OKで確定。


f:id:icoc_dev:20141113110728j:plain

時職人の作り方(3)- アイコンの構造

誰得というもっぱらなうわさの、
時職人の作り方 、第三回。


今回はアイコンの構造についてです。

アイコンの種類

アイコンには以下の状態があります。

・選択不可
f:id:icoc_dev:20141106154758j:plain


・選択可能:未クリア
f:id:icoc_dev:20141106154804j:plain


・選択中
f:id:icoc_dev:20141106154812j:plain


・クリア済み
f:id:icoc_dev:20141106154816j:plain


・Justタイムでクリア済み
f:id:icoc_dev:20141106154820j:plain




アイコンの状態は5つありますが、
アイコンの表示状態としては、以下のenumを割り当てて管理しています。

enum Frame
{

	Lock,
	NonClear,
	Selected,
	Clear,
	
}


Lock = 選択不可
NonClear = 選択可能;未クリア
Selected = 選択中
Clear = クリア済み

この上で、Justタイムのものには、
後付で王冠を乗っけるという考えです。

アイコンの構造


各ステージアイコンには、
クリア秒数も表示しています。


f:id:icoc_dev:20141106160846j:plain
※こんな感じで、アイコンの前に数字を表示



ここは単純にフォントを乗っければよいですが、
この時はまだフォントの使い方がよくわかってなく(^^;


数値に対応した画像を用意して、
テクスチャの座標を切り替えて表示するという形をとってます。


※テクスチャの切り替えについては、ちょっと長くなりそうなので次回…


具体的なObjectの構造はこんな感じ。

f:id:icoc_dev:20141106161404j:plain


icon_0-0 … エリア 1 、 ステージ 1 のアイコン
内部管理では0始まりにしているので、実際のエリア、ステージ番号と1つずれます。


Crown … Just用のアイコン

No0 … 一桁用の数値

No1、No2 … 二桁用の数値


こんなかんじで、フォントを使わなかったために、
No管理のオブジェクトが無駄に多いです。


この構造をPrefabで用意しておいて、
ステージ画面遷移時にInstantiateで実体化。
という流れになります。

王冠や、ケタ違いの数値は予めくっつけておき、
表示のOn/Offで見た目を制御してます。


そんなに構造が複雑でもないので、
部分部分追加するよりは、こっちの方が仕組みが単純な気はします。


複雑な構造の場合は、無駄なオブジェクトがついてると
Editor上がごちゃごちゃしがちなので、
必要な物をあとづけとかのほうが良いかもですね。


次回は、フォント部分として利用した、
テクスチャをアニメーション切り替えとして利用する方法についてです。

InputManager、Axesの値を別プロジェクトに移す

InputManagerの値はInspector上で設定する形になっています。


f:id:icoc_dev:20141030175807j:plain

これを別プロジェクトに移したかったのですが、
Componentではないので、エディター上でコピーはできませんでした。


この設定は、どうやらプロジェクト直下にある
ProjectSettingsフォルダに書き込まれているみたいです。


なので、このフォルダにあるInputManager.assetのファイルを移すだけで、
設定が移行出来ました。


試してないですが、
他の設定値もファイルを移せばうまく行きそうな気がします。


ただ、一回設定がなくなると再度エディタ上で設定を構築するのは
結構大変なので、上書きする前に、ProjectSettingsのバックアップをとっておく事を
おすすめします。