[Unity]VR上のボタンを押す度にカウントダウンが始まる仕組みを実装した

[自分用のメモなので雑です]

やりたいこと

・Leapmotionで操作しているVR上の手がボタンに触れた時にカウントダウンがスタートする

・カウントダウン(例えば5秒間)の間はボタンに触れても反応しないようにしたい

・カウントダウンが終わったら再びボタンがActiveになる(これも自動化したいけど多分私の実験だったら手動で管理したほうがいいので手動,あるキーを押したらボタンがアクティブになるようにした)

参考(https://qiita.com/saffron_furafoop/items/8e54763dc11a3f708985)

上のサイトと同じようなことをVR上のボタンを使って再現したかった.

public Button startButton;を使わずにpublic Object Button;でなんとかしたい(結論として startButton.enabled = false;的な便利な方法はObjectには使えなかったのでcolliderの切り替えで似たようなことをした)

【書いたやつ】

やってること

・GameObject ButtonでVR上のボタンを指定する.

・VRの手にPlayerのタグがある時ボタンに触れるとcollider(当たり判定)が消滅する.あとカウントダウンが始まる.

・ボタンに当たり判定が無いことが分かりやすいように色が黒くなるようにした.

※当たり判定があるとボタンに触れるたびにコルーチンが実行されてカウントダウンが最初からになるが判定を無効化してるため問題ナシ

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine.UI;

public class InstantiateTest : MonoBehaviour
{

   public GameObject Button;
   public Text timer;
   void Start()
   {
      
   }
   void OnCollisionEnter(Collision collision)
   {
       if (collision.gameObject.tag == "Player")
       {
           StartCoroutine(CountdownCoroutine());
           GetComponent<CapsuleCollider>().enabled = false;
       }


       IEnumerator CountdownCoroutine()
       {

           timer.text = "3";
           yield return new WaitForSeconds(1.0f);

           timer.text = "2";
           yield return new WaitForSeconds(1.0f);

           timer.text = "1";
           yield return new WaitForSeconds(1.0f);

           timer.text = "0";
           yield return new WaitForSeconds(1.0f);


       }
   }

}


カウントダウン終了後(もしくはカウントダウン中にもう一度施行をやり直したい時)ボタンを再アクティブする

・キーボードのAキーを押すとcolliderがtrueになるのでまた触れられるようになる.

・アクティブな時分かりやすいようにオブジェクトの色が赤くなるようにした

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ButtonActive1 : MonoBehaviour
{
   public GameObject Button;
   void Start()
   {

   }


   void Update()
   {


       if (Input.GetKeyDown(KeyCode.A))
       {
           GetComponent<Renderer>().material.color = new Color(1.0f,0.0f,0.0f,0.0f);
           GetComponent<CapsuleCollider>().enabled = true;

       }


   }
}


元々別の用途のコードを流用したのと分かりやすいように二つに分けちゃったけど合体させられそう.


今までできなかった理由

・コルーチン起動のTriggerとなるObjectが非アクティブの時コルーチンが停止する

→ボタン自体はアクティブな状態を保つ必要がある

・かといってずっと表示させたまま当たり判定もそのままにしているとうっかりカウントダウン中にボタンにもう一度触れた時にコルーチンが再呼び出しされてしまう

→GetComponent<CapsuleCollider>().enabledを使ってカウントダウン中はボタンに触れても当たり判定が無いようにした.


めっちゃ苦労したんですけど正直あんまりスマートな方法ではなさそうですね...詳しい方からのご指摘をお待ちしております.

追伸:

合体させるには一個目のコードのコルーチンの最後に
GetComponent<Renderer>().material.color = new Color(1.0f, 0.0f, 0.0f, 0.0f);
GetComponent<CapsuleCollider>().enabled = true;

を追加するだけだった(やっぱ手動めんどいから自動でいいや)

この記事が気に入ったらサポートをしてみませんか?