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

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

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

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

Unity

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

Q&A

解決済

5回答

363閲覧

Update関数が一度だけ読み込まれるようにしたいです。

yellowtale

総合スコア14

C#

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

Unity

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

0グッド

1クリップ

投稿2019/01/17 12:08

編集2019/01/17 12:12

前提・実現したいこと

unity,C#でスペースキーを押したら"public Text"に入れたテキストが削除されるようにしたいと思っています。
一度input.getkeydownが発動したら,"pushed"がfalseとなって、Update関数内のif文が以降発動しないようにしたかったのですが,スペースキーを押してテキストが消えた後も,アクセスしようとしていたみたいです。。支障はないとはいえ,エラーが出ないようにしたいので…。よろしくお願いします。

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

MissingReferenceException: The object of type 'Text' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.

該当のソースコード

C#

1public class TextDeleteSpace : MonoBehaviour { 2 public Text push; 3 bool pushed; 4 void Start () { 5 pushed = true; 6 } 7 void Update () { 8 if ((Input.GetKeyDown("space")) && (pushed)) 9 { 10 Destroy(push); 11 pushed = false; 12 } 13 } 14} 15

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

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

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

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

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

YAmaGNZ

2019/01/18 10:35

Destroyの前にログを出力してみてはどうでしょうか? このスクリプトが複数アタッチされているとかありませんか?
yellowtale

2019/01/18 11:15

ログ出力してみましたが、スペースキーを押して、テキストが消えてしまった後はif文の中身は実行されていなかったようです。
Bongo

2019/01/18 11:30

MissingReferenceExceptionが発生しているのは本当にこのスクリプトでしょうか? もし「pushed」によるDestroy再発動回避に失敗していたとしても、そもそも破壊済みのコンポーネントに再度Destroyを行ってもエラーは発生しないんじゃないかと思うのですが...
yellowtale

2019/01/18 11:54

いやぁ…このスクリプトで間違いないんですけどね…。。
Bongo

2019/01/18 22:50 編集

なるほど...念のためおうかがいしますが、そのコンソール上に現れた「MissingReferenceException: The object of ...」のメッセージをクリックして選択すると、コンソールの下の方にごちゃごちゃとしたメッセージの全文が現れるかと思います(もし表示領域が狭いようでしたら、黒い区切り線をドラッグして広げてみてください)。それはどのような内容でしょうか?
guest

回答5

0

自己解決

多くの方にご相談いただいておいてとても申し訳ない気分なのですが。。。
テキスト自体に付けていた「テキストを点滅させるためのスクリプト」がアクセスしようとしていたようで、このスクリプト内ではきちんと処理されていたようです!

public class TextDeleteSpace : MonoBehaviour { public Text push1; public Text push2; public Text push3; public Text push4; bool pushed; public float speed; private float time; private enum ObjType{TEXT,}; private ObjType thisObjType = ObjType.TEXT; void Start () { pushed = true; if (this.gameObject.GetComponent<Text>()) { thisObjType = ObjType.TEXT; push1 = this.gameObject.GetComponent<Text>(); push2 = this.gameObject.GetComponent<Text>(); push3 = this.gameObject.GetComponent<Text>(); push4 = this.gameObject.GetComponent<Text>(); } } void Update () { if ((thisObjType == ObjType.TEXT) && (pushed)) { push1.color = GetAlphaColor(push1.color); push2.color = GetAlphaColor(push2.color); push3.color = GetAlphaColor(push3.color); push4.color = GetAlphaColor(push4.color); } if ((Input.GetKeyDown("space")) && (pushed)) { Destroy(push1); Destroy(push2); Destroy(push3); Destroy(push4); pushed = false; } } Color GetAlphaColor(Color color) { time += Time.deltaTime * 5.0f * speed; color.a = Mathf.Sin(time) * 0.5f + 0.5f; return color; } }

(ちょっと長くなってしまいましたが)
こんな感じで点滅させるためのスクリプトをこのスクリプトに組み込んで、"pushed"の正負を条件にして解決しました。
協力してくださった皆様…情報不足のためにご迷惑をおかけしました。
申し訳ありませんでした。。。m(_ _)m

投稿2019/01/29 12:17

yellowtale

総合スコア14

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

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

0

TextDeleteSpace実行してみましたがこちらの環境ではエラーは起こりませんでした
TextDeleteSpaceは問題ないと思います。たぶん原因は他にありそうです

もしDestroyしなくてもいいなら

C#

1push.text = "";

で空白にするとか

C#

1push.enabled = false;

で非表示にするとかでいいんじゃないでしょうか

投稿2019/01/22 09:13

lazhward

総合スコア16

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

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

0

該当箇所を一回しか通っていないということであれば、それまでにDestroyされている可能性があるのではないでしょうか?

リファレンスを見た限りですが、

C#

1if(push.isDestroyed == false) Destroy(push);

こういう風にできないですかね?

投稿2019/01/18 13:35

YAmaGNZ

総合スコア10258

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

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

0

これでいけると思います。

C#

1public class TextDeleteSpace : MonoBehaviour { 2 public Text push; 3 bool pushed; 4 void Start () { 5 pushed = false; 6 } 7 void Update () { 8 if ((Input.GetKeyDown("space")) && (pushed == false)) 9 { 10 Destroy(push); 11 pushed = true; 12 } 13 } 14}

ちなみにnegitamaさんがおっしゃっている指摘は
pushedは「もう押された」という意味なので、
Startでpushed(もう押された)=true(はい)となって、
Updateでキーを"押したとき"にpushed(もう押された)=false(いいえ)
となるのは単語から想像される意味から言えばおかしくないですか?
という意味です。

投稿2019/01/18 10:27

akki

総合スコア91

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

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

akki

2019/01/18 10:28

書いてたらかぶってしまいました…
negitama

2019/01/18 10:44

補足ありがとうございます^^
guest

0

####解決案1
&& (AND条件)の箇所を || (OR条件)に変える。
#### 解決案2
Start() 内で pushed = false に、if 文内での処理では pushed = true にする。
解決案2のほうが自然かもしれません。pushed って、「(もう)押された」って意味ですよね。

回答を修正しました。

public class TextDeleteSpace : MonoBehaviour { public Text push; bool pushed; // ボタンがすでに押されたかをチェックする bool 型の変数 void Start () { pushed = false; // 最初は押されていない } void Update () { // スペースキーが押されて、かつ pushed == false(まだ押されていなかった)とき、処理を行う if ((Input.GetKeyDown("space")) && (pushed == false)) { Destroy(push); pushed = true; // 押された } } }

投稿2019/01/17 13:40

編集2019/01/18 10:16
negitama

総合スコア943

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

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

yellowtale

2019/01/18 09:56

1:or条件にするとスペースキーを押さなくても消えてしまうんです。。。 2:pushedは私が代名詞的に自分でつけたものなので、意味とかは関係ないと思いますが。。 trueとfalseを逆にするのは意味があるのでしょうか?
negitama

2019/01/18 10:17

回答修正しました。ご確認ください。
yellowtale

2019/01/18 11:14

negitamaさん,akkiさん,YAmaGNZさん,アドバイスありがとうございます。 ですが…やっぱりエラーが出てしまいますね。。エラーメッセージが出ないようにしたいのですが,どうにもなりませんかね…?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問