キャンバスとパネルを動的に生成し、
フェードイン、フェードアウトする機能を作ろうと持ったのですがうまくいきませんでした。
具体的には、フェードイン、アウトで指定した秒数と実際にフェードする秒数が微妙にずれてしまいます。
私の認識では、"コルーチンを利用すれば指定した秒数後に処理が行われる"と思っていたので驚きました。
コルーチンのような非同期処理にも呼び出す時間のずれというものは生じるのでしょうか、どなたかご教授ください。
以下コードになります。(QuolityでDon't Syncに設定変更し、Fpsを90近くキープした状態でも同様の現象が起きました)
using System.Collections; using UnityEngine; using UnityEngine.UI; public class FadeInOut : MonoBehaviour { Canvas faceCanvas; Image facePanel; Coroutine coroutine; [SerializeField] Color panelColor = new Color(0,0,0,0); [SerializeField] float fadeTime = 5; // Start is called before the first frame update void Start() { //キャンバス生成&設定 GameObject canvas_G = new GameObject("FaceCanvas"); faceCanvas = canvas_G.AddComponent<Canvas>(); canvas_G.AddComponent<CanvasScaler>(); canvas_G.AddComponent<GraphicRaycaster>(); //レンダリングをメインカメラに faceCanvas.renderMode = RenderMode.ScreenSpaceCamera; faceCanvas.worldCamera = FindObjectOfType<Camera>(); //パネル生成&設定 GameObject panel_G = new GameObject("FacePanel"); facePanel = panel_G.AddComponent<Image>(); Color tmpColor = facePanel.color; tmpColor.a = 0f; facePanel.color = tmpColor; //パネルをキャンバスの子に設定 panel_G.transform.parent = canvas_G.transform; //パネルのポジションを正面に調整 Vector3 panelPosition = panel_G.transform.localPosition; panelPosition.x = 0; panelPosition.y = 0; panel_G.transform.localPosition = panelPosition; } void Update() { //キー押してない間はreturn if (Input.anyKey == false) { return; } if (coroutine == null) { //テスト用 フェードアウト if (Input.GetKeyDown(KeyCode.O) && panelColor.a == 0) { FadeOut(); } //テスト用 フェードイン if (Input.GetKeyDown(KeyCode.I) && panelColor.a == 1) { FadeIn(); } } } public void FadeOut() { if (panelColor.a == 0) { coroutine = StartCoroutine(FadeOutCoroutine()); } } IEnumerator FadeOutCoroutine() { float alpha = 1; while (panelColor.a < 1) { yield return new WaitForSeconds(0.1f); panelColor.a += alpha / (fadeTime * 10); facePanel.color = panelColor; } panelColor.a = 1; StopCoroutine(coroutine); coroutine = null; } public void FadeIn() { if (panelColor.a == 1) { coroutine = StartCoroutine(FadeInCoroutine()); } } IEnumerator FadeInCoroutine() { float alpha = 1; while (panelColor.a > 0) { yield return new WaitForSeconds(0.1f); panelColor.a -= alpha / (fadeTime * 10); facePanel.color = panelColor; } panelColor.a = 0; StopCoroutine(coroutine); coroutine = null; } }
よりスムーズにフェードさせようと思い、
下記のように変更するとフェード時間を5秒にした場合、1秒近い誤差が生まれます。
while (panelColor.a < 1) { yield return new WaitForSeconds(0.05f); panelColor.a += alpha / (fadeTime * 20); facePanel.color = panelColor; }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/14 08:00 編集