質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VIVE

VIVEは、VR向けヘッドマウントディスプレイです。センサーによって部屋自体をVR空間にするルームスケールが大きな特徴。プレイヤーはその空間を自由に歩き回ることが可能なため、高い没入感を体験できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2296閲覧

コントローラーのレーザーが消えない。Unityを使ったVIVEのソフト

JohnMichael

総合スコア11

VIVE

VIVEは、VR向けヘッドマウントディスプレイです。センサーによって部屋自体をVR空間にするルームスケールが大きな特徴。プレイヤーはその空間を自由に歩き回ることが可能なため、高い没入感を体験できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/01/22 09:41

前提・実現したいこと

コントローラーのレーザーを時間経過で消したい。

Unityを使ったVIVE(SteamVR)のソフトを作成してます。

https://github.com/yumemi-inc/vr-studies/wiki/102-2-%E3%83%AC%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC

↑のサイトのスクリプトを拝借してコントローラーからレーザーが出るようにしました。
↓がそのスクリプトです。

C#

1using UnityEngine; 2 3public class LaserController : MonoBehaviour 4{ 5 6 protected GameObject laser; 7 protected GameObject cursor; 8 9 public float thickness = 0.002f; 10 public float cursorSize = 0.04f; 11 public Color laserColor = new Color(1, 1, 0); 12 13 void Start() 14 { 15 16 //レーザーポインタを作成する 17 CreateLaserPointer(); 18 } 19 20 //------------------------------------------------------------------------------------------------------------------------------// 21 protected void CreateLaserPointer() 22 { 23 24 laser = GameObject.CreatePrimitive(PrimitiveType.Cube); 25 laser.transform.SetParent(transform, false); 26 laser.transform.localScale = new Vector3(thickness, thickness, 2.0f); 27 laser.transform.localPosition = new Vector3(0.0f, 0.0f, 1.0f); 28 laser.GetComponent<MeshRenderer>().material.color = laserColor; 29 Object.DestroyImmediate(laser.GetComponent<BoxCollider>()); 30 31 cursor = GameObject.CreatePrimitive(PrimitiveType.Sphere); 32 cursor.transform.SetParent(transform, false); 33 cursor.transform.localScale = new Vector3(cursorSize, cursorSize, cursorSize); 34 cursor.transform.localPosition = new Vector3(0.0f, 0.0f, 2.0f); 35 cursor.GetComponent<MeshRenderer>().material.color = laserColor; 36 Object.DestroyImmediate(cursor.GetComponent<SphereCollider>()); 37 } 38 39 public void AdjustLaserDistance(float distance) 40 { 41 42 if (laser == null) { return; } 43 distance += 0.01f; 44 45 //レーザーの長さを調整 46 laser.transform.localScale = new Vector3(thickness, thickness, distance); 47 laser.transform.localPosition = new Vector3(0.0f, 0.0f, distance * 0.5f); 48 cursor.transform.localPosition = new Vector3(0.0f, 0.0f, distance); 49 } 50}

時間経過でボタンを出現させてレーザーで選択する(ボタンを押す)仕組みを作っています。
ボタンがないときはレーザーが邪魔になるので、ボタンが出現している間だけレーザーを出そうと考えました。

レーザーのスクリプトはコントローラーのコンポーネントに張り付けているので,そのコンポーネントのチェックボックスをつけたり外したりすることでレーザーのONとOFFを切り替えられるようにしました。
↓5秒でレーザーを出現させ、10秒で消すという仕組みのスクリプトです。
これもコントローラーのコンポーネントに張り付けました。

C#

1using System.Collections; 2using UnityEngine; 3 4public class LaserDelete : MonoBehaviour { 5 6 private LaserController Lasers; 7 8 void Start() 9 { 10 StartCoroutine("startPush"); 11 Lasers = GetComponent<LaserController>(); 12 } 13 14 15 IEnumerator startPush() 16 { 17 18 yield return new WaitForSeconds(5.0f); 19 Lasers.enabled = !Lasers.enabled; 20 21 yield return new WaitForSeconds(10.0f); 22 Lasers.enabled = !Lasers.enabled; 23 24 } 25}

発生した問題

以上2つのスクリプトをコントローラに張り付け、レーザーのコンポーネントのチェックは外し実行してみました。

5秒経過するとレーザーのコンポーネントにチェックが入り、見事にレーザーが出現しました。

しかし、10秒後にレーザーのコンポーネントのチェックは外れたのですが、いくら待ってもレーザーは消えませんでした。
コンポーネントのON,OFFは切り替えることができたので、恐らくレーザーのスクリプトに問題があるのではないかと思われます。

どこをどのように修正したらよろしいでしょうか。

ちなみに当たり前ですが、最初からコンポーネントのチェックを外して実行するとレーザーは現れませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

LaserControllerはレーザー用オブジェクト(CubeとSphere)を作っただけ。
後からLaserControllerをオフにしようが、CubeとSphereには何の影響も無いので、結果的に何も起こりません。

あとちなみに「そのコンポーネントのチェックボックスをつけたり外したりすることでレーザーのONとOFFを切り替えられるようにしました。」とありますが、なっていません。
最初の1回しかオンにならないので「切り替え」ではないかと。(Startは最初にオンになったタイミングでしか呼ばれないから)

なので以下のようなメソッドを追加した方が良いかと思います。

//LaserControllerに以下メソッド追加 //(Start内のCreateLaserPointer();は削除してください) public void UseLaser (bool isOn) { if (isOn) { CreateLaserPointer(); } else { Destroy(laser); Destroy(cursor); } } public void UseLaser () { //反転用 UseLaser(laser == null); } //反転用は高速で何回も呼び出すとバグるかも。その場合はDestroyの代わりにDestroyImmediateを使ってください。 //LaserDeleteから呼び出し //オンにしたい時 Lasers.UseLaser(true); //オフにしたい時 Lasers.UseLaser(false); //オンオフを反転したい時 Lasers.UseLaser();

投稿2019/01/22 10:06

sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JohnMichael

2019/01/23 01:36

解決しました!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問