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

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

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

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

Unity

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

Q&A

0回答

1107閲覧

Unity publicメソッドでプライベートなメンバ変数が参照できない

mai-morita

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2021/01/28 18:04

編集2021/01/31 06:52

前提・実現したいこと

Unity(C#)で、牛がゴールを目指すランゲームを制作していて、

”ゴールが、牛との衝突時→フェードアウト開始→フェードイン開始→次のステージ開始”
という事を実現したいのですが、フードアウト開始のところでつまづいています。

それでは改めて詳しく説明させていただきます。
▽FadeOnCollisionのソースコード(抜粋)

void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.name == targetObjectName) {         FadeCanvas fadePanel = fadePanelObj.GetComponent<FadeCanvas>();         fadePanel.FadeFlag(); } }

ゴールにはFadeOnCollisionというスクリプトをアタッチしています。
FadeOnCollisionでは、OnCollisionEnter2Dを使い、targeObject(うし)と衝突した時、別のスクリプトであるFadeCanvas内のFadeFlag()を実行しています。

FadeCanvasはFadePanelにアタッチされており、FadePanelとはフェードイン演出を行うための透明化させるオブジェクトです。

FadeOnCollisionのInspector部分では、FadeObjectNameにうし、FadePanelObjにFadePanelを入れ、FadePanelが開かれるようになっています。

▽FadeCanvasのソースコード(一部)

public void FadeFlag() { Debug.Log(fadeOut); fadeOut = true; Debug.Log(fadeOut); } void Update () { Debug.Log(fadeOut); if (fadeOut) { Debug.Log("234"); FadeOut(); } if(fadeIn) { Debug.Log("1"); FadeIn(); } }

FadeCanvas内のFadeFlag()が実行されfadeOut=trueになり、UpdateによりFadeOutが実行されて画面がフェードアウトすることを期待しています。

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

・FadeFlag() 内でDebug.Log(fadeOut)した時はfadeOut=trueになっているが、Update内のFadeOut()が実行されないこと。

・Unityの▷(Play)を押すごとに、FadeFlagの中だけ数値が上書きされていくこと。
→おそらくFadeFlagの中だけがおかしい気がしています。(理由は試したこと②参照)
→試した結果からメンバ変数として初期化したfadeOutとFadeFlagの中のfadeOutは別物のように見えます。

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; //衝突時FadePanelを見えるようにするスクリプト public class FadeShowOnCollision : MonoBehaviour { public string targetObjectName; public GameObject fadePanelObj; void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.name == targetObjectName) { FadeCanvas fadePanel = fadePanelObj.GetComponent<FadeCanvas>();    fadePanel.FadeFlag(); } } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;//UIを使用可能にする //フェードインとフェードアウトに関するスクリプト public class FadeCanvas : MonoBehaviour { private bool fadeIn = false; private bool fadeOut = false; float fadeSpeed = 0.01f; float red, green, blue, alpha; Image fadeImage; void Start() { fadeImage = GetComponent<Image> (); red = fadeImage.color.r; green = fadeImage.color.g; blue = fadeImage.color.b; alpha = fadeImage.color.a; Debug.Log(fadeOut); } public void FadeFlag() { Debug.Log(fadeOut);  //<1> fadeOut = true; Debug.Log(fadeOut);  //<2> } void Update () { Debug.Log(fadeOut); if (fadeOut) { Debug.Log("234"); FadeOut(); } if(fadeIn) { Debug.Log("1"); FadeIn(); } } void FadeOut() { fadeImage.enabled = true; alpha += fadeSpeed; SetAlpha(); if(alpha >= 1) { fadeOut = false; fadeIn = true; } } void FadeIn() { alpha -= fadeSpeed; SetAlpha(); if(alpha <= 0) { fadeIn = false; fadeImage.enabled = false; } } void SetAlpha() { fadeImage.color = new Color(red, green, blue, alpha); } }

試したこと

①最初にfadeOut,fadeInは共にfalseにしていて,Startのところではfalseになっていること。

②FadeFlagというメソッドが呼ばれる時、Debug.Logを仕込んだところ、数値が上書きされていくこと。
コンソール結果を(<1>/<2>)という形で記載しています。※<1><2>についてはソースコード参照

1回目   : false / true    
2回目以降 : true / true

他の変数(今回はred)を使っても試してみたが、FadeFlagの中だけが上記と同じように上書きされる。
1回目 : 0 / 100      
2回目 : 100 / 100

さらに、3回目以降には数値を"red = 100"から"red = 50"に変えて実行してみると
3回目 : 100 / 50     
4回目 : 50 / 50

▽試すために使用したコード

public void FadeFlag() { Debug.Log(red); //<1> red = 100; //3回目以降は、red = 50;に変更してみました Debug.Log(red); //<2> }

③fadeInで試した場合は特に問題がなく、なぜかfadeOutのみおかしくなる

補足情報

各種ツールのバージョンを記載させていただきます。
Unity : Version 2019.4.17f1
Visual Studio Code : Version 1.52.1

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

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

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

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

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

y_waiwai

2021/01/28 21:54

質問は編集できます 追記修正しましょう
Yukirr4_

2021/01/31 07:38

確認ですがfadeImageの透明度は最初から(Startが呼ばれる前から)0ですか? 質問の回答とは違いますけど、そのようなアニメーションをさせる場合DOTweenというアセットがすごい便利です。数値をUpdateで増やす必要はありません。 あとまた追加ですけど、Update内で数値を増やすときはTime.deltaTimeをかけることをオススメします。環境によって数値にバラツキが出てしまいますので。
退会済みユーザー

退会済みユーザー

2021/01/31 08:30

Unityは便利なんだから、デバッグログだけに頼らずこのコードのbool値、 fadeInとfadeOutをpublicにしてインスペクタから直接操作したら実行状態からの判別も出来ますよ。 何がおかしいのか分かるかもしれません?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問