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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity3D

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

Unity

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

Q&A

解決済

2回答

1110閲覧

アイテムを持つまでの時間をアイテム毎に変更したい

RnMhgtr35

総合スコア3

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/09/06 05:59

前提・実現したいこと

現在、Unityで物を投げ合うというゲームを作ろうとしています。実現したいことはアイテムごとに持つまでの時間を設けようと思っています。

発生している問題・エラーメッセージ

問題なのは1つのアイテムに対しては時間を設定することができたのですが、UnityのInspectorで別々に設定することができません。

該当のソースコード

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

bool canGrab;//アイテムを持っているかどうか
public float holdTime;//アイテムを持つまでの時間

void Update(){
if (canGrab){
if (Input.GetKeyDown(KeyCode.E)) {

Invoke("PickUp", holdTime); //holdTime後に"PickUp"関数を実行

}
}
}

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

GameObject PController;
PlayerController playerController;
public float HTime;//アイテムを持つまでの時間

void Start(){
PController = GameObject.Find("unitychan");
playerController = PController.GetComponent<PlayerController>();
}

void Update(){
playerController.holdTime=HTime; //PlayerControllerスクリプトのholdTimeの値をHTimeに置き換える
}

試したこと

アイテムを何秒か待ったら持つというプログラムをプレイヤー側に実装したので、アイテムごとに変えることができません。なので、プレイヤー側のスクリプトにあるholdTimeをアイテム側のスクリプトのHTimeに置き換えることができないかと思ったので上記のplayerController.holdTime=HTimeを試してみました。結果として数値は変更することができました。しかし、Inspector上でアイテムごとに数値を変更すると、どれか1つの数値しか参照されません。どうしたらよいでしょうか?

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

・Unityのバージョンは2019.4.3f1です。
・PickUpスクリプトにアイテムを持つプログラムが実装されてないと思いますが気にしないで下さい。
・足りない情報がありましたら、教えてください。

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

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

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

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

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

Yukirr4_

2020/09/06 08:06

持とうとしているアイテムの取得はどうしていますか? Raycastを使用してるのでしょうか。
RnMhgtr35

2020/09/06 10:58

Raycastを使用しています。
guest

回答2

0

ベストアンサー

Raycastを使用しているのであれば、アイテム側から時間を直接指定するのではなく、
プレイヤーが自ら判断できるようにした方がいいと思います。

また、Invoke("PickUp", holdTime)を使用していますが、これだとEキー押したらもうアイテム回収をキャンセルできないと思います(これは意図した動作なのでしょうか)。「Eキーを〇秒間押し続けたらゲット」のようにしたら途中のキャンセルもできると思います。なので後者のやり方で回答したいと思います(もし前者が意図したものであればご自分で書き換えてください)。

C#

1//PlayerController 2 3bool canGrab; 4public float holdTime; 5public float count = 0; //アイテムの持つ時間を実際にカウント 6GameObject lastItem; //エイムが合っているアイテムを入れておく 7 8void Update() 9{ 10 //Rayについてはご自分の状態に合わせてください 11 RaycastHit hit; 12 Ray ray = new Ray(transform.position, transform.forward); 13 if (Physics.Raycast(ray, out hit, rayDistance)) 14 { 15 //アイテムが前フレームのものと違っていたらholdTimeを更新 16 if(hit.collider.gameObject != lastItem && lastItem != null) 17 { 18 holdTime = hit.collider.gameObject.GetComponent<pickUp>().HTime; 19 } 20 21 //前フレームと同じゲームオブジェクトに向いている かつ canGrabがtrue かつ Eキーを押し続けている 22 if (hit.collider.gameObject == lastItem && canGrab && Input.GetKey(KeyCode.E)) 23 { 24 count += Time.deltaTime; 25 if(count >= holdTime) 26 { 27 PickUp(); 28 count = 0; 29 } 30 } 31 32 lastItem = hit.collider.gameObject; 33 } 34 else 35 { 36 lastitem = null; 37 count = 0; 38 } 39}

C#

1//pickUp 2public float HTime; //これで終わり

これだとプレイヤーはアイテムのpickUpクラスのHTimeを取得して、それを超えたらPickUp()するようにしています。

書いてたらコードがごちゃごちゃしちゃいました。
分からないことがあれば聞いてください。

投稿2020/09/06 11:20

Yukirr4_

総合スコア728

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

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

RnMhgtr35

2020/09/06 13:48

回答ありがとうございす。全ては使いませんでしたが、holdTime=hit.collider.gameObject.GetComponent<pickUp>.HTimeの1文で全てを解決することができました。本当にありがとうございました。
guest

0

遅延時間はpickUpクラスで設定するのではなく、PlayerControllerクラスでEを押した時にpickUp.HTimeholdTimeに設定してからInvoke("PickUp", holdTime);すれば良いです。

クリックした位置のアイテム取得はこの辺りが参考になります。

【Unity】クリックしたゲームオブジェクトを取得する

投稿2020/09/06 11:07

shiena

総合スコア1827

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問