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

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

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

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

Unity

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

Q&A

解決済

1回答

171閲覧

Unity6で対応するキーボードが押されている間だけ画像を表示したい

Tsubaki2358

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2025/01/15 02:32

編集2025/01/15 04:29

実現したいこと

〇実現したいこと
初期状態では半透明の画像を表示せず、対応するキーボードを押している間のみ半透明の画像を表示したい。
⇒キーボードが入力されていることを明示するため。

〇前提
Web上で動かすリズムゲームを作成している。

〇現状
初期状態で半透明の画像が表示されている。
最初に対応するキーボードを押すことで画像を消すことが出来る。
2回目の入力以降は想定している動作をする(押している間だけ半透明の画像が表示される)。
追記:被せるように表示する画像(本題の半透明の画像)はUIは画像(Image)を使用している。

発生している問題・分からないこと

〇問題
初期状態で半透明の画像が表示されてしまうこと。
⇒StartメソッドでGameObject.SetActive(bool)をtrueに設定している為表示されているが、falseに設定すると以下のエラーが発生する

 NullReferenceException: Object reference not set to an instance of an object SoundPadController.Start ()
※この状態でキーボードを押しても画像は表示されていないように見える。

該当のソースコード

C#

1using UnityEngine; 2 3public class SoundPadController : MonoBehaviour 4{ 5 [SerializeField] private GameObject padCover1, padCover2, padCover3, padCover4, padCover5, 6 padCover6, padCover7, padCover8, padCover9, padCover10, 7 padCover11, padCover12, padCover13, padCover14, padCover15 ; 8 9 void Start() 10 { 11 Application.targetFrameRate = 60; 12 padCover1 = GameObject.Find("PadCover1"); 13 padCover2 = GameObject.Find("PadCover2"); 14 padCover3 = GameObject.Find("PadCover3"); 15 padCover4 = GameObject.Find("PadCover4"); 16 padCover5 = GameObject.Find("PadCover5"); 17 padCover6 = GameObject.Find("PadCover6"); 18 padCover7 = GameObject.Find("PadCover7"); 19 padCover8 = GameObject.Find("PadCover8"); 20 padCover9 = GameObject.Find("PadCover9"); 21 padCover10 = GameObject.Find("PadCover10"); 22 padCover11 = GameObject.Find("PadCover11"); 23 padCover12 = GameObject.Find("PadCover12"); 24 padCover13 = GameObject.Find("PadCover13"); 25 padCover14 = GameObject.Find("PadCover14"); 26 padCover15 = GameObject.Find("PadCover15"); 27 28 // falseにするとnullエラーになるので打算的に 29 padCover1.SetActive(true); 30 padCover2.SetActive(true); 31 padCover3.SetActive(true); 32 padCover4.SetActive(true); 33 padCover5.SetActive(true); 34 padCover6.SetActive(true); 35 padCover7.SetActive(true); 36 padCover8.SetActive(true); 37 padCover9.SetActive(true); 38 padCover10.SetActive(true); 39 padCover11.SetActive(true); 40 padCover12.SetActive(true); 41 padCover13.SetActive(true); 42 padCover14.SetActive(true); 43 padCover15.SetActive(true); 44 45 // 本当は初期状態はこっちにしたい 46 //padCover1.SetActive(false); 47 //padCover2.SetActive(false); 48 //padCover3.SetActive(false); 49 //padCover4.SetActive(false); 50 //padCover5.SetActive(false); 51 //padCover6.SetActive(false); 52 //padCover7.SetActive(false); 53 //padCover8.SetActive(false); 54 //padCover9.SetActive(false); 55 //padCover10.SetActive(false); 56 //padCover11.SetActive(false); 57 //padCover12.SetActive(false); 58 //padCover13.SetActive(false); 59 //padCover14.SetActive(false); 60 //padCover15.SetActive(false); 61 } 62 63 void Update() 64 { 65 PressSoundKeyPad(); 66 } 67 68 /* 69 * 押しているだけ半透明の画像を表示して 70 * キーに対応したパッドが光ったかのように見せる 71 * 72 * 以下、ざっくりとした構成 73 * 各キーボード別に「押すと表示」「離すと非表示」 74 */ 75 public void PressSoundKeyPad() 76 { 77 // 1段目 78 if (Input.GetKeyDown(KeyCode.E)) padCover1.SetActive(true); 79 if (Input.GetKeyUp(KeyCode.E)) padCover1.SetActive(false); 80 81 if (Input.GetKeyDown(KeyCode.R)) padCover2.SetActive(true); 82 if (Input.GetKeyUp(KeyCode.R)) padCover2.SetActive(false); 83 84 if (Input.GetKeyDown(KeyCode.T)) padCover3.SetActive(true); 85 if (Input.GetKeyUp(KeyCode.T)) padCover3.SetActive(false); 86 87 if (Input.GetKeyDown(KeyCode.Y)) padCover4.SetActive(true); 88 if (Input.GetKeyUp(KeyCode.Y)) padCover4.SetActive(false); 89 90 if (Input.GetKeyDown(KeyCode.U)) padCover5.SetActive(true); 91 if (Input.GetKeyUp(KeyCode.U)) padCover5.SetActive(false); 92 93 // 2段目 94 if (Input.GetKeyDown(KeyCode.D)) padCover6.SetActive(true); 95 if (Input.GetKeyUp(KeyCode.D)) padCover6.SetActive(false); 96 97 if (Input.GetKeyDown(KeyCode.F)) padCover7.SetActive(true); 98 if (Input.GetKeyUp(KeyCode.F)) padCover7.SetActive(false); 99 100 if (Input.GetKeyDown(KeyCode.G)) padCover8.SetActive(true); 101 if (Input.GetKeyUp(KeyCode.G)) padCover8.SetActive(false); 102 103 if (Input.GetKeyDown(KeyCode.H)) padCover9.SetActive(true); 104 if (Input.GetKeyUp(KeyCode.H)) padCover9.SetActive(false); 105 106 if (Input.GetKeyDown(KeyCode.J)) padCover10.SetActive(true); 107 if (Input.GetKeyUp(KeyCode.J)) padCover10.SetActive(false); 108 109 // 3段目 110 if (Input.GetKeyDown(KeyCode.C)) padCover11.SetActive(true); 111 if (Input.GetKeyUp(KeyCode.C)) padCover11.SetActive(false); 112 113 if (Input.GetKeyDown(KeyCode.V)) padCover12.SetActive(true); 114 if (Input.GetKeyUp(KeyCode.V)) padCover12.SetActive(false); 115 116 if (Input.GetKeyDown(KeyCode.B)) padCover13.SetActive(true); 117 if (Input.GetKeyUp(KeyCode.B)) padCover13.SetActive(false); 118 119 if (Input.GetKeyDown(KeyCode.N)) padCover14.SetActive(true); 120 if (Input.GetKeyUp(KeyCode.N)) padCover14.SetActive(false); 121 122 if (Input.GetKeyDown(KeyCode.M)) padCover15.SetActive(true); 123 if (Input.GetKeyUp(KeyCode.M)) padCover15.SetActive(false); 124 } 125} 126

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11242030101
Yhoo知恵袋で調べ、上記リンクに載っているコードを参考に作成しています。

補足

Unity6
Unity Hub 3.11.0

エディターバージョン
6000.0.33f1

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

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

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

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

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

Tsubaki2358

2025/01/15 03:00

Try-CatchとかGo使えばワンチャンあるか?
fiveHundred

2025/01/15 03:39

単に表示を切り替えたいだけであれば、ゲームオブジェクトではなく(Sprite)Rendererだけを無効にするのが手っ取り早いと思います。
Tsubaki2358

2025/01/15 03:43

早速調べて使ってみます~
Tsubaki2358

2025/01/15 04:31

Unity初心者、いまだによくわからず...Rendere(レンダーを扱うやつ)で使用して表示を切り替えれそうなことだけは漠然と把握しましたが使用方法がよくわからない状態です。 以下のQiita記事を参考に四苦八苦してます https://qiita.com/OKsaiyowa/items/9579ac348ac860cd522e
fiveHundred

2025/01/15 04:43

その記事に書かれている通り、「ゲームオブジェクト.GetComponent<Renderer>();」でRendererを取得して、そのenabledをfalseにするだけです。 ここでいうゲームオブジェクトはpadCover1などになります。
Tsubaki2358

2025/01/15 05:14

なるほど(怪しい) ご教授いただいた内容で作成したコードを共有しておきます。 画像を貼れないのが惜しいですが...コンポーネントにSpriteRendererを追加して動かしたところ 初期状態ではチェック無し、スペースキーを押している間だけチェックが入ることを確認できました。 ただ次の問題として画像が見えない症状が出てしまったのでこれは少し調べてみようと思います。 以下、議題に追加したコード内容です。 ※作成済みのいじくると後が面倒なので、Demo用のPadを作成しています。 (中略) Renderer _renderer; GameObject padCoverDemo; (中略) void Start(){ (中略) padCoverDemo = GameObject.Find("PadCoverDemo"); _renderer = padCoverDemo.GetComponent<Renderer>(); _renderer.enabled = false; } void Update(){ (中略) if (Input.GetKeyDown(KeyCode.Space)) _renderer.enabled = true; if (Input.GetKeyUp(KeyCode.Space)) _renderer.enabled = false; }
Tsubaki2358

2025/01/15 05:36

コンポーネントのチェックの有無を操作できるのであれば他の要素(画像:Imageなど)にも流用できるんじゃないか?と思ったらできたので修正を完了とします。 画像が見えなかった原因は、単純に「ImageとSpriteRendererではカメラに映る場所が異なる」ことが原因のようでした。 以下に最終的なコードを載せておきます。(Demoの部分のみ) using UnityEngine; using UnityEngine.UI; public class SoundPadController : MonoBehaviour { GameObject padCoverDemo; Image _imageDemo; void Start() { Application.targetFrameRate = 60; _imageDemo = padCoverDemo.GetComponent<Image>(); _imageDemo.enabled = false; } void Update() { PressSoundKeyPad(); } public void PressSoundKeyPad() { if (Input.GetKeyDown(KeyCode.Space)) _imageDemo.enabled = true; if (Input.GetKeyUp(KeyCode.Space)) _imageDemo.enabled = false; } }
Tsubaki2358

2025/01/15 05:47

Teratail初心者、ベストアンサー等の設定方法がわからない() fiveHundredさんの考えを参考にした結果、本問題の解決に至ったのでそちらをベストアンサーに選びたいけどよくわからず... 操作に慣れていましたら、回答済みにしていただくことは可能でしょうか? (下部の回答欄入力したら自己解決になってしまうそうなので)
fiveHundred

2025/01/15 05:59

特にポイントとか要らないので、今回は自己解決で構いません。
Tsubaki2358

2025/01/15 06:03

承知しました。 解決にご協力いただき、ありがとうございました。
guest

回答1

0

自己解決

SetActiveの場合はエラーとなるため、ゲームオブジェクトのコンポーネントを操作するように修正する。
オブジェクトの検索~対象となるオブジェクトのコンポーネントのインスタンス取得までは1行に纏めることも可能。
// ゲームオブジェクトを見つけて、そのコンポーネントを取得する。
padCover1 = GameObject.Find("PadCover1").GetComponent<Image>();

以下、デモ版の最終コードを記載
using UnityEngine;
using UnityEngine.UI;

public class SoundPadController : MonoBehaviour
{
GameObject padCoverDemo;
Image _imageDemo;

void Start()
{
Application.targetFrameRate = 60;

_imageDemo = padCoverDemo.GetComponent<Image>();
_imageDemo.enabled = false;

}

void Update()
{
PressSoundKeyPad();
}

public void PressSoundKeyPad()
{
if (Input.GetKeyDown(KeyCode.Space)) _imageDemo.enabled = true;
if (Input.GetKeyUp(KeyCode.Space)) _imageDemo.enabled = false;
}
}

投稿2025/01/15 06:09

Tsubaki2358

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問