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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity3D

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

Unity

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

Q&A

解決済

1回答

968閲覧

アイテムを持つまでの時間をアイテム毎に視覚的にわかるようにしたい

RnMhgtr35

総合スコア3

C#

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/09/10 12:42

前提・実現したいこと

現在Unityで物を投げ合うゲームを作ろうとしています。実現したいことは、アイテムを持つまでの時間をアイテム毎にカウントされている様子を画面上に表示することです。

発生している問題

アイテムによって決められた秒数待つと、持つことができます。しかし、プレイヤーは何秒待てばいいのかわからないので、持つと同時に画面に秒数を表示したいと思っています。下記のプログラムですとアイテムごとに設定した秒数を参照することはでき、表示するところまではできるのですが、カウントが始まらず、数字がバグったかのように上下に揺れ始め、設定した秒数待つとカウントが始まります。

該当のソースコード

PlayerController.script→プレイヤー側に付けるスクリプト

bool canGrab; //アイテムを持っているかどうか
bool isCountdownStart; //カウントダウンが始まったかどうか
public float count; //持つまでの時間
public Text countText; //UIを入れとく変数

void Update(){
Ray ray = new Ray(transform.position+new Vector3(0,0.15f,0) , transform.forward);

RaycastHit hit; if (Physics.Raycast(ray, out hit, distance)) { if (hit.transform.tag == "item") { currentItem = hit.transform.gameObject; canGrab = true; holdTime = hit.collider.gameObject.GetComponent<pickUp>().HTime; count = hit.collider.gameObject.GetComponent<pickUp>().CountTime; //countの値にpickUpスクリプトのCountTimeの値を代入する } } else canGrab = false;

if (canGrab)
{
if (Input.GetKeyDown(KeyCode.E))
{
Invoke("PickUp", holdTime);
isCountdownStart = true;
countText.gameObject.SetActive(true);
}

}

if (isCountdownStart)
{
count-= Time.deltaTime;
countText.text = count.ToString("f2");
}

if (count < 0)
{
count = 3;
countText.gameObject.SetActive(false);
isCountdownStart = false;
}
}

PickUp.script→アイテムがに付けるスクリプト

public float HTime; //アイテムを持つまでの時間
public float CountTime; //アイテムを持つまでの時間。UnityのInspectorでアイテムごとに設定できるようにする

試したこと

表示する秒数(count)と待つ時間(holdTime)の値は同じなので、最初はholdTime-=Time.deltaTimeでできるのかなと思っていたのですが、同じように数字がフリーズしてしまい、決められた秒数待つとカウントが始まってしまいました。だったら、上記のプログラムのように別で追加したらできるのかなと思ったのでやってみたのですが、できませんでした。どうすればよいでしょうか?どなたか教えてください。

補足情報(FW/ツールのバージョンなど)

Unityのバージョンは2019.4.3f1
他に足りない情報があれば教えてください

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

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

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

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

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

guest

回答1

0

ベストアンサー

Eキーを押した後もRaycastがアイテムに当たるのでcountpickupCountTimeで更新され続けているようです。isCountdownStartがfalseの時だけRaycastを飛ばせば解決しませんか?

余談ですが、タグの比較はCompareTagの方が速いです。
またGetComponentは遅い処理なので回数を減らすためにGetComponent<pickup>の戻り値を一旦変数に入れてそこからHTimeCountTimeを参照する方が速いです。

投稿2020/09/10 19:01

編集2020/09/10 20:25
shiena

総合スコア1825

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問