念願の夢、自作VRでの歩行
と言いつつ今回紹介するのは歩行と言っていいのか。
動画有るんで、良ければ再生とチャンネル登録お願いします。
まずは目次。
1.UnityでVRを作り、自由に歩きたい
2.GameObjectの構成紹介
3.スクリプトの紹介
このようになります。
1.UnityでVRを作り歩きたい!
まず、UnityでVRを作る中で、
「自分の作った世界を歩きたい!」
となりました。
まあ、せっかくですからね。
そんな訳で悩みに悩んで数か月。(実働では30時間位だろうけど)
なんとか簡単な物が完成しました。
ぶっちゃけネットで調べても中々ちゃんと動くスクリプトって見つからないので、2018/12/10日時点で、自分が作ったものを載せておきます。
(既に誰か作ってたら、すまんな。)
2.GameObjectの構成
ざっくりとこんな感じです。
Playerの下に、動くカメラとVR用のシステム、それに8方向の矢印それぞれという感じです。
矢印の中身は、スクリプトが各方向用の数字になっているので、そこだけ違います。
後に書くスクリプトと合わせてご覧くださいな。
この構成上、視線を動かした時に動くものがMainCameraだけなので、Playerや各矢印は回転しません。
ただ、プレイヤーのRigidBodyで回転を止めるチェックを入れていないと、物にぶつかった拍子に回転し続けます。(2枚目参照)
3.スクリプト紹介 (スクリプトのコピー用は一番下です。)
まずは、移動量の一括管理スクリプトです。
わざわざ8方向全て書き換えるのが面倒なので、front = 0.05fの0.05を書き換えるだけにします。
注意点としては、staticを使ってどこからでも読み書きできるので、他のスクリプトで数字を書き換えない事。
frontが上下左右。nanameが45度方向になります。
naname = front*0.7fとしてるのは、上下左右と移動量を合わせるためです。基本的に書き換える事は無いと思います。
矢印のスクリプトです。
視線の認識をした二つの「public void enterPointer」と「public void exitPointer」で認識。
startで先程の変数管理スクリプトから、上下左右用のfrontを設定するか、斜め用のnanameを設定します。
後は、if(time >= 1)内で、1秒以上視線が当たっている時、Update毎にプレイヤーのポジションを追加すると言う状態です。
実際たどり着いてみれば、何の事も無い簡単なスクリプトで行けてしまいましたね。
ずっと自分は、一つの矢印を使い、trasform.forwardで組もうとしていたので、こんな単純な事を見失っていました。
それとforwardは書いたスクリプトを付けたオブジェクトのZ方向に進みます。
意外と迷う事だと思いますので、今回は使いませんが書いておきます。
さてここまで、VR上で歩行に近いシステムの紹介をしました。
どうぞVR制作にお使いくださいな。
それでは、最後までお読み頂きありがとうございました!
今後kou0128もVR制作に力を入れていきますので、応援よろしくお願い致します。
また見てね!
スクリプト紹介
HensuuKanri.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HensuuKanri : MonoBehaviour {
public static float front = 0.05f;
public static float naname = front*0.7f;
}
ScriptFront.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScriptFront : MonoBehaviour {
private bool counter; //カウンタ
private float time; //経過時間
public GameObject Player1;
private float x;
// Use this for initialization
void Start () {
counter = false;
time = 0;
x = HensuuKanri.front;
}
// Update is called once per frame
void Update () {
if (counter) {
time += Time.deltaTime;
if (time >= 1) {
Player1.transform.position += new Vector3 (0.0f,0.0f,x);
}
}
}
public void enterPointer(){
Debug.Log ("Enter Pointer");
counter = true;
}
public void exitPointer(){
Debug.Log ("Exit Pointer");
counter = false;
time = 0;
}
}
ScriptFrontRight.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScriptFrontRight : MonoBehaviour {
private bool counter; //カウンタ
private float time; //経過時間
public GameObject Player1;
private float x;
// Use this for initialization
void Start () {
counter = false;
time = 0;
x = HensuuKanri.naname;
}
// Update is called once per frame
void Update () {
if (counter) {
time += Time.deltaTime;
if (time >= 1) {
Player1.transform.position += new Vector3 (x,0.0f,x);
}
}
}
public void enterPointer(){
Debug.Log ("Enter Pointer");
counter = true;
}
public void exitPointer(){
Debug.Log ("Exit Pointer");
counter = false;
time = 0;
}
}
0 件のコメント:
コメントを投稿