ã¯ããã«
ã¢ã«ããã¯5å¨å¹´ãè¿ããå æ¥ãã¼ãã£ã¼ãéããã¾ããããã®æã«å±ç¤ºç©ã¨ãã¦æ«é²ããUnityã¨Oculus Rift DK2ã使ã£ãã²ã¼ã ãä½ã£ã話ããããã¨æãã¾ãã
ä»åä½ã£ããã®ã¯éç³ãé¿ããªããã³ã¤ã³ãåã£ã¦è¡ã£ã¦ã´ã¼ã«ãç®æããã¬ã¼ã¹ã²ã¼ã ã§ãããã®è¨äºã§ã¯æ§ã
ãªã¢ã»ãããçµã¿åããã¦Unityã使ã£ã¦ã©ã®ããã«ãã¦çæéã§ã¬ã¼ã¹ã²ã¼ã ãä½ãä¸ããããç´¹ä»ãããã¨æãã¾ãã
åæ
éçºãå§ããã¨ãã®ç§ã¯ãã®ãããªæãã§ããã
- Unityã¯å°ãããã£ããã¨ããã
- Oculuséçºã¯å
- ä¸è¬çãªããã°ã©ãã³ã°ã¹ãã«ã¯æã£ã¦ãã
ãã¨ãå¹³æ¥ã¯æ¥åã§å¿ããããå¶ä½ã¯ãã£ã±ãåæ¥ã®éããæé㧠ããã¾ããããã£ã¦å®åæéã¯4ã5æ¥ã¨ãã£ãã¨ããã§ãã
ã¾ããæ¬æ稿ã§ç´¹ä»ããã½ã¼ã¹ã³ã¼ãã¯ããããããããããã«Unityä¸å¿ è¦ãªé¨åãçãã¦ããã¨ãããããããããã®ã¾ã¾ã§ã¯åä½ãã¾ãããããããããäºæ¿ãã ããã
ã³ã³ã»ããã¡ã¤ãã³ã°
ãã¼ãã£ã®ã³ã³ã»ããããç¥ãã¨ãããã¨ããããç¥ã«ã¡ãªãã ã¢ã»ãããã¤ãã£ã¦ã¿ããã¨ãããã¨ã§ãã®ã¢ã»ãããå©ç¨ããã²ã¼ã ãä½ããã¨ã«ãªãã¾ããã
ã¼ã³ãªã³ãç¡æã§å
¬éãã¦ããJapanese Matsuri Cityã¨ããã¢ã»ããã§ãã
ãã®æ®µéã§ã®ã¤ã¡ã¼ã¸ã§ã¯
- è¡ãæ©ãåã
- ã³ã¤ã³ã¨ããéãããããã¤ã¼ãç³»ã²ã¼ã
- å¶éæéå ã«ã©ããããã®ã³ã¤ã³ãéãããããã競ã
æãã®ã²ã¼ã ã«ãããããªã¨æ§æ³ãã¾ããã
ã¾ãã¯Japanese Matsuri Cityã®ä¸ãèµ°ãåãããã«ãããã¨ãç®æãã¾ããã
試ä½1
Unityã®ãã¼ã¸ã§ã³ã¯ææ°ã®5.0ç³»ã使ãã¾ããã Unityã§Oculusã使ãã®ã¯é常ã«ç°¡åã§ãã Oculusã®Developerãã¼ã¸ããOculus PC SDK Unity 4 Integration 0.6.0.0-betaããã¦ã³ãã¼ããã¦ãã¾ããUnity 5ã§ããã®ã¾ã¾å©ç¨ãããã¨ãã§ãã¾ãã
Unzipããã¨OculusUnityIntegration.unitypackageã¨ãããã¡ã¤ã«ãããã®ã§ããã®ãã¡ã¤ã«ãUnityã®ããã¸ã§ã¯ãã«importãã¾ãã
importããã¨OVR/Prefabsã®ãªãã«OVRCameraã¨OVRPlayerControllerã¨ãã2ã¤ã®prefabãããã¾ããããã¯ãããã
- OVRCamera:Oculusããè¦ãåºå®ä½ç½®ã®ã«ã¡ã©(移åä¸å¯)
- OVRPlayerController:Oculusããè¦ããã£ã©ã¯ã¿(ã³ã³ããã¼ã©ã¼ã«ãã移åå¯)
ã§ããä»åã¯åãã¾ããã¢ããªãä½ãããã®ã§OVRPlayerControllerã使ãã¾ãã OVRPlayerControllerãSceneã®ä¸ã«é ç½®ãã¾ããããã¦ãJapanese Matsuri Cityã®ãªãã¸ã§ã¯ãã«è¡çªå¤å®ãå ããããã«ãMesh Colliderã追å ãã¾ãã
Oculus Riftãã¤ãªãã¦å®è¡ããã¨ãããªæãã§è¦ããããã«ãªãã¾ããã
æ¹è¯
試ä½ï¼ã®æ®µéã§ã¯
- ç»é¢ãå転ãããã¨é ã
- ããã«ç»é¢ã®ç«¯ã«å°éãã¦ãã¾ã£ã¦é¢ç½ãç¡ã
ãªã©ã®èª²é¡ãããã¾ããã ããã«å¯¾å¿ããããã«ã²ã¼ã ã®æ¹åæ§ãå¤ããå¿ è¦ãåºã¦ãã¾ããã
é ãã«ããã³ã¼ã¹ãä½ã
VRé ãã®ä¸»ãªåå ã¯ãç¾å®ä¸çã«ãªãä¸èªç¶ãªç§»åã«ãããã®ã§ããç¹ã«ç»é¢ãã³ã³ããã¼ã©ã¼ã§å転ãããæä½ã¯ã»ãã®æ°ç§ã§ãé ã£ã¦ãã¾ãã¾ããããã§ãJapanese Matsuri Cityã®ã¢ã»ããããã®ã¾ã¾ä½¿ãã¨ããè¨ç»ãå¤æ´ãã¦ãOculusã«é©ããä¸ã®ãããªã¾ã£ãããªã³ã¼ã¹ãä½æãã¾ãããã³ã¼ã¹ã®ç«¯ã«éæãªå£ãç¨æãã¦ãã¬ã¼ã¤ã¼ã誤ã£ã¦ã³ã¼ã¹ããåºã¦ããªãããç´°å·¥ããã¦ãã¾ãã
éªéãã£ã©ãä½ã
ä½ããªããã ã¾ã£ããã®ã³ã¼ã¹ãèµ°ãã®ã¯ã¤ã¾ããªãã®ã§éªéãã£ã©ãç¨æãããã¨ã«ãã¾ãããéªéãã£ã©ã¯ä»å天ããè½ã¡ã¦ããéç³ã¨ãããã¨ã«ãã¾ããã ä¸è¨ã®ãããªã³ã¼ãã§éç³ãåºç¾ããã¦ãã¾ãã intervalã¨ããå¤æ°ã§éç³ãåºç¾ããå¨æãè¨å®ãã¾ãããã¬ã¼ã åä½ã§å¼ã°ããUpdateã¡ã½ããã§æå»ãé²ãã¦ãããå¨æã«éãããInstantiateã§éç³ãä½æãã¾ããéç³ãä½æãã座æ¨ã¯ãã¬ã¼ã¤ã¼ã®ç¾å¨ä½ç½®ããã¨ã«ãã¦ãã¾ãã
# pragma strict
var meteo : GameObject;
var interval : float = 0.1;
private var timer : float;
private var prevPlayerZ : float = 0.0f;
function Start () { timer = 0.0; }
function Update () {
timer -= Time.deltaTime;
if ( timer < 0.0 ) {
var player : GameObject = GameObject.FindWithTag("Player");
var velocityZ : float = player.transform.position.z - prevPlayerZ;
var offsetX : float = Random.Range(0, 20) - 10;
var offsetZ : float = Random.Range(0, 5) - 20 + velocityZ * 10;
var position : Vector3 = Vector3(offsetX + player.transform.position.x, 20, offsetZ + player.transform.position.z);
prevPlayerZ = player.transform.position.z;
Instantiate(meteo, position, transform.rotation);
Instantiate(meteo, position + Vector3(0, 0, 20), transform.rotation);
Instantiate(meteo, position + Vector3(0, 0, 30), transform.rotation);
timer = interval;
}
}
éç³ã¯Sphereãå ã«éç³ã表ç¾ãããããªã¢ã«ã追å ãã¦ãã¾ããä»åã¯ç«ã®çã£ã½ãæãã«ãã¦ã¿ã¾ããã
ã³ã¤ã³ãä½ã
ãã¯ã¼ã¢ããã¢ã¤ãã ãããã³ã¹ã³ã¢ã¢ããã®ã¢ã¤ãã ã¨ãã¦ã³ã¤ã³ãä½ãã¾ããã
åã«ã¹ã³ã¢ã¢ãããããã ãã§ãªãããã¬ã¼ã¤ã¼ãã¹ãã¼ãã¢ãããããå¹æãå®ç¾ãã¾ããããã®æä½ã¯OVR Player Controllerã®Componentã®ä¸ã®Accelarationã¨ããå¤æ°ãæä½ãããã¨ã§å®ç¾ã§ãã¾ããã¹ãã¼ãã¢ããããä¸æ¹ã«ãªãã¨ã²ã¼ã ãã©ã³ã¹çã«æãããããããéç³ã«ããã£ãå ´åã¯ã¹ãã¼ããã¦ã³ãããå¹æãã¤ãã¾ããAccelarationã®å¤ã0ããããã¯è² æ°ã«ãªã£ã¦ãã¾ãã¨ã²ã¼ã ãæãç«ããªããªããããAccelarationã¯åæå¤æªæºã«ã¯ãªããªãããã«ãã¾ãã
ãã®ã¢ããªã¯Javascriptã使ã£ã¦å¶ä½ãã¦ãã¾ããããOVR Player Controllerã¯C#ã®ã¯ã©ã¹ã ã£ããããGetComponentã使ã£ã¦ã®ã¢ã¯ã»ã¹ã¯ã§ãã¾ããã§ããããã®ãããAccelarationãæä½ããC#ã®ã¯ã©ã¹ã¨ã¡ã½ãããæã¤Componentãç¬èªã«ç¨æãã¦ãJavascriptå´ããã¯SendMessageã使ã£ã¦ã¢ã¯ã»ã¹ããã¨ããæ¹æ³ãåãã¾ããã (調ã¹ã¦ã¿ãã¨ä»ã«ãæ¹æ³ãããã¿ããã§ãã) ã¾ããã²ã¼ã ãªã¼ãã¼ã®æã«ã³ã³ããã¼ã©ã¼æä½ãã§ããªãããã«ãããããcontrollerã®enabledãfalseã«å¤æ´ãã¦ãã¾ãã
å¼ã¶å´
function Meteo() {
var player : GameObject = GameObject.FindGameObjectWithTag("Player");
player.SendMessage("Meteo");
}
function GetCoin() {
var player : GameObject = GameObject.FindGameObjectWithTag("Player");
player.SendMessage("GetCoin");
}
å¼ã°ããå´
using UnityEngine;
using System.Collections;
public class PlayerEventListener : MonoBehaviour {
private float initAcceleration;
void GetCoin() {
OVRPlayerController controller = GetComponent<OVRPlayerController> ();
controller.Acceleration += 0.1f; // ã³ã¤ã³ãåã£ããå é
}
void Meteo() {
OVRPlayerController controller = GetComponent<OVRPlayerController> ();
if (controller.Acceleration > initAcceleration) controller.Acceleration -= 0.1f;
// éç³ã«ããã£ããæ¸é
}
}
å¶éæéãã¤ãã
ã²ã¼ã ãããããããã«å¶éæéãã¤ãã¾ãããã®ããã«ã¯ ã²ã¼ã é²è¡ä¸âã²ã¼ã çµäºã¨ããç¶æ é·ç§»ã¨æéã管çãããªãã¸ã§ã¯ããå¿ è¦ã§ããä»åã¯ãGameModelãã¨ããååã®ç©ºã®GameObjectã追å ãã¦ãããã§æéã管çããããã¨ã«ãã¾ãããç¶æ é·ç§»ã«é¢ãã¦ã¯gameStateã¨ããå¤æ°ãç¨æãã¦æ±ãã¾ãã
# pragma strict
var time : float = 60.0;
var readyTime : float = 5.0;
var timeObject : GameObject;
private var gameState : int = 0;
// 0 -> å¾
æ©ç¶æ
// 1 -> ã²ã¼ã ä¸
// 2 -> ã²ã¼ã ãªã¼ãã¼
function Update () {
if(gameState == 0) {
// ã²ã¼ã éå§ãå¾
æ©
readyTime -= Time.deltaTime;
if (readyTime <= 0.0f){
gameState = 1;
}
} else if(gameState == 1) {
// ã²ã¼ã ä¸
time -= Time.deltaTime;
if ( time <= 0.0f ) {
time = 0.0f;
GameOver(false);
}
}
}
function GameOver(isCleared : boolean) {
gameState = 2;
// ã²ã¼ã ãªã¼ãã¼
}
ã¹ã³ã¢ãä½ã
ã¹ã³ã¢ã¯éç³ã«è§¦ããã¨-100ç¹ãã³ã¤ã³ã«è§¦ããã¨500ç¹ã«è¨å®ãã¾ããã ã´ã¼ã«ããã¨5000+æ®ãæéÃ500ç¹ãå ç®ãã¾ãã ã¹ã³ã¢è¨ç®ã¨å¶éæéã¯ãGameModelãã«éç´ãã¦ãã¾ãã 触ããæã«ã¯AudioSourceã使ã£ã¦é³å£°ãé³´ããã¾ãã
var score : int = 0;
public var meteoDownScore : int = 100;
public var coinUpScore : int = 500;
function ScoreUp (up : int) {
if (gameState == 1) ChangeScore(up);
}
function ScoreDown (down : int) {
if (gameState == 1) ChangeScore(-down);
}
private function ChangeScore(change : int) {
score += change;
}
function Meteo() {
var player : GameObject = GameObject.FindGameObjectWithTag("Player");
player.SendMessage("Meteo"); ScoreDown(meteoDownScore);
var src = GetComponent(AudioSource);
src.clip = meteoClip;
src.Play();
}
function GetCoin() {
var player : GameObject = GameObject.FindGameObjectWithTag("Player");
player.SendMessage("GetCoin");
ScoreUp(coinUpScore);
var src = GetComponent(AudioSource);
src.clip = coinClip;
src.Play();
}
function Goal() {
var goalscore = 5000 + Mathf.Floor(500 * time);
ScoreUp(goalscore);
GameOver(true);
}
æéãã¹ã³ã¢ã表示ãã
ã¹ã³ã¢ãæéãOculusã®ç»é¢ä¸ã«è¡¨ç¤ºããã«ã¯OVRPlayerControllerããããªã¼ããã©ã£ãã¨ããã«ããCenterEyeAnchor/OVRTrackerBounds/Canvasã®ä¸ã«Panelã追å ãã¦ããã®Panelã«TextMeshããããã¾ãã
ç»é¢ä¸ã®ä½ç½®ã¯ä»ã®ã¨ããå®æ©ã§è¡¨ç¤ºãããªãã調æ´ãã¦ãããããªãããã§ããç»é¢ç«¯ã«è¡¨ç¤ºãããã¨èªããªãã®ã§ããªãã¹ãä¸å¤®ã«å¯ãã¦ããã¨ããã§ãã
ã´ã¼ã«æ¼åºãä½ã
æå¾ã«ã´ã¼ã«æ¼åºã追å ãã¾ããã ã´ã¼ã«ããæã«ã¯ãCongratulations!ãã®è¡¨ç¤ºã¨ã´ã¼ã«å°ç¹ã«è¡¨ç¤ºãããè±ç«ã®ãªãã¸ã§ã¯ãã§ç¥ç¦ãã¾ãã
æ¯ãè¿ã
ããå°ãæéãåããã
- ãéªéãã£ã©(人éã¿ã¤ã)ããããã«ç»å ´ããã
- ã³ã³ããã¼ã©ã¼æä½ãããå°ãã¬ã¼ã¹é¢¨ã«æ¹è¯ãã
- ã©ã¤ãã«ã«ã¼ãç»å ´ããã¦ç«¶èµ°ãã
ã¨ãã£ãè¦ç´ ãå ãããã£ããªã¨æãã¾ããã
Unityã®ææ°çã®5.1ã§ã¯Oculusãã¢ã»ããã¨ããå½¢ã§ã¯ãªãæ¨æºãµãã¼ãããã¦ããã«ä½¿ãããããªããããªã®ã§ãä»å¾è©¦ãã¦ã¿ããã¨æãã¾ãã