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

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

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

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

Unity

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

Q&A

解決済

1回答

1489閲覧

スプライトのフェードインはできるけど、フェードアウトと同時処理ができません。

Kirby2318

総合スコア69

C#

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

Unity

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

0グッド

0クリップ

投稿2020/08/03 11:40

unityのスプライトの点灯・消滅の繰り返しの処理が実行できません。主にゲームのタイトル画面で使いたい処理なんですが、、、(press any key のゆっくりな表示・非表示)

using System.Collections; using System.Collections.Generic; using UnityEditor.Compilation; using UnityEngine; using UnityEngine.UI; public class Fadein : MonoBehaviour { public float speed = 0.01f;//表示速度 float alfa;//アルファ値を扱います float red, green, blue;//RGB扱います。 // Start is called before the first frame update void Start() { ///RGBの色の取得/// red = GetComponent<SpriteRenderer>().color.r; green = GetComponent<SpriteRenderer>().color.g; blue = GetComponent<SpriteRenderer>().color.b; } // Update is called once per frame void FixedUpdate() { //利用用取得 GetComponent<SpriteRenderer>().color = new Color(red, green, blue, alfa); //一定間隔でアルファ値に加算 alfa += speed; } }

上記のような単純な文章だけなら、スプライトのフェードインの処理だけ実行することができたので、
以下のようにやってみたびですができませんでした。

using System.Collections; using System.Collections.Generic; using UnityEditor.Compilation; using UnityEngine; using UnityEngine.UI; public class Fadein : MonoBehaviour { public float speed = 0.01f; float alfa; float red, green, blue; // Start is called before the first frame update void Start() { red = GetComponent<SpriteRenderer>().color.r; green = GetComponent<SpriteRenderer>().color.g; blue = GetComponent<SpriteRenderer>().color.b; } // Update is called once per frame void FixedUpdate() { GetComponent<SpriteRenderer>().color = new Color(red, green, blue, alfa); if(alfa == 0) { while(alfa > 1) { alfa += speed; } } else { if(alfa == 1) { while(alfa > 0) { alfa -= speed; } } } } }

上記の方法で実行してしまうと、表示されるどころか何も表示されなくなってしまいます。だれか知恵を貸してください。お願いします・

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

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

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

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

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

guest

回答1

0

ベストアンサー

まずは現状のスクリプトを読み解いてみましょう。
alfaの初期値は0なので、スプライトが透明になります。
if(alfa == 0)はtrueなのでif文には入りますが、
while(alfa>1)の継続条件を満たさないのでwhile内は一度も実行されません。
それ以降何の処理もされないので毎物理フレームでalfaは0のままであり、よって何も表示されません。

ではwhileの条件を変えればいいかというとそんなこともありません。
whileの中で待機していないので、1物理フレームの間にalfaの値が変わるだけです。つまり一瞬で切り替わるように見えます。
(そもそも何故1つ目のコードだと成功するかというと「FixedUpdateは定期的に実行されるから」です)

なのでwhileは使用せず、「alfaの変動」に加えて「今点灯中なのか・消滅中なのか」のフラグを持って条件分岐する
……という方法もありますが、こういう時はSinを使った方が楽です。サイン・コサイン・タンジェントのサインです。
【Unity】Sin関数の使い方 - Qiita

float sin = Mathf.Sin(Time.time);
alfa += sin;
GetComponent<SpriteRenderer>().color = new Color(red, green, blue, alfa);
値の微調整はご自由に。

投稿2020/08/04 06:46

sakura_hana

総合スコア11427

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

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

Kirby2318

2020/08/17 07:21

ありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問