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

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

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

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

同じキー入力でSetActiveの切り替えの仕方

P0NZUU_
P0NZUU_

総合スコア5

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0グッド

0クリップ

233閲覧

投稿2022/12/01 14:23

前提

スペースキーで宝箱を開けた際に最初はプレイヤーを未表示にしてそこから同じキーを押したらプレイヤーを再度表示するようにしたいです

※trueにする時のキーは正直何でもいいです。

実現したいこと

・プレイヤーを一回目未表示で2回目は表示させるようにしたいです

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

Playerをfalseにはできるのですが再度trueにすることが出来ないです。

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; using KanKikuchi.AudioManager; public class aksmKey : MonoBehaviour { public GameObject Player; public GameObject Item; public Sprite takarabako; SpriteRenderer sr; public bool isPushed = false; int count = 0; void Start() { sr = gameObject.GetComponent<SpriteRenderer>(); Item.SetActive(false); Player.SetActive(true); } void Update() { } private void OnCollisionStay2D(Collision2D other)//これが原因? { if (isPushed) return; if (other.gameObject) { if (Input.GetKey(KeyCode.Space)) { SEManager.Instance.Play(SEPath.ITEM_GET); SEManager.Instance.Play(SEPath.TAKARABAKO_OPEN); sr.sprite = takarabako; isPushed = true; Item.SetActive(true); count += 1; Player.SetActive(false);//もしかしたらこの書く場所も悪いかも? } } } }

試したこと

elseを使って再度表示させようかと思ったんですけどうまくいきませんでした

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

if (isPushed) return;が一番頭にきているので、isPushed = trueになった後にfalseに戻す方法がこのスクリプト内に無いので、永久にreturnし続けます。
入れるならif (Input.GetKey(KeyCode.Space))の下にif (isPushed)なら isPushed = falseとプレイヤー表示、else でisPushed = trueとプレイヤー非表示という形にすればいいと思います。

投稿2022/12/02 00:14

Y0241-N

総合スコア1007

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

P0NZUU_

2022/12/02 07:19

回答ありがとうございます。 今現在試してみましたが、未表示にはできるのですが再度表示がどうしてもできないです。 今の状況はスペースキーを押すと”プレイヤーを未表示”というログは流れますが、その後もう一度押してもチェックは消えずログもでない感じです。 このコードだとどこが悪いのでしょうか? using System.Collections; using System.Collections.Generic; using UnityEngine; using KanKikuchi.AudioManager; public class aksmKey : MonoBehaviour { public GameObject Player; public GameObject Item; public Sprite takarabako; SpriteRenderer sr; public bool isPushed; int count = 0; void Start() { sr = gameObject.GetComponent<SpriteRenderer>(); Item.SetActive(false); Player.SetActive(true); isPushed = false; } void Update() { } private void OnCollisionStay2D(Collision2D collision) { if (isPushed) return; if (collision.gameObject.tag == "Player") { if (Input.GetKey(KeyCode.Space)) { SEManager.Instance.Play(SEPath.ITEM_GET); SEManager.Instance.Play(SEPath.TAKARABAKO_OPEN); sr.sprite = takarabako; Item.SetActive(true); count += 1; isPushed = false; if (isPushed == false) { isPushed = true; Debug.Log("プレイヤー未表示"); } else if (isPushed == true) { isPushed = false; Debug.Log("プレイヤーを表示"); } } } } }
Y0241-N

2022/12/02 07:26

private void OnCollisionStay2D(Collision2D collision) { if (isPushed) return; ←これが原因です、これがあるとisPushedがtureになったあとはOnCollisionStay2Dメソッド以外でisPushedをfalseにしない限りtrueのままですよね?なのでtrueになっている限り、returnされ、return以下の処理が実行されることはありません。 あとif (Input.GetKey(KeyCode.Space))内のisPushed = false;の下にif (isPushed == false)、else if (isPushed == true)を書かれていますが、isPushed = falseにした後では必ずif (isPushed == false)の結果しか得られません。判定するならisPushed = false;する前に判定しましょう。 思うに基本的なC#の知識が不足されていると思うので、まず基礎知識を学ばれるのも良いかと思います。
P0NZUU_

2022/12/03 04:09

細かくありがとうございます! 無事解決出来ましたが自分もまだまだ知識が浅いのでこれからも勉強します!

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。