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

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

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

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

Unity

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

Q&A

解決済

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

Kirby2318
Kirby2318

総合スコア69

C#

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

Unity

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

1回答

0グッド

0クリップ

905閲覧

投稿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; } } } } }

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

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

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

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

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

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

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

回答1

1

ベストアンサー

まずは現状のスクリプトを読み解いてみましょう。
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

総合スコア11415

Kirby2318👍を押しています

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

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

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

回答へのコメント

Kirby2318

2020/08/17 07:21

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

C#

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

Unity

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