may231750
@may231750 (initialK initialY)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Unity : C# : ボタンクリック時処理の中に組み込まれるコルーチンの書き方

Q&A

Closed

解決したいこと

Unityで、UIのボタンを押すと画面キャプチャを保存するアプリケーションを作ろうとしています。
画面キャプチャを保存する前に、ボタンなどのUIを画面から消す必要があります。
PCではUIのGameObjectをSetActive(false)した後にScreenCapture.CaptureScreenshot(fileName);
すればUIが映り込まないスクショを保存することができていますが、iOSでカメラロールに保存したく
下記の「NativeGallery」というUnityPackageを導入しました。

するとカメラロールに保存された画像にボタンなどのUIが映り込んだままになってしまいました。

まとめると
1.UIのボタンを押したことをトリガーにして
2.UIのボタンを画面から消す描画処理の終了を待ってから
3.NativeGalleryによるキャプチャ→カメラロールへの保存処理を実施する

ことを行いたく、おそらく「コルーチン」という仕組みを使うものと思います。

発生している問題・エラー

UIのボタンに紐つけたコルーチンを作りたいのですが、いくつかあるコルーチンの解説記事にある例示はコルーチンの呼出し(StartCoroutine)をStart()メソッドで行なうものばかりで、そのまま適用するとアプリ実行時に最初に呼び出されてしまい、結果としてアプリ実行最初にUIが表示上画面から全て消えてしまう上に保存したくもない画像がカメラロールに保存されてしまうことになってしまいました。悩んでいます。

該当するソースコード

C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OnClickCaptureScript : MonoBehaviour
{
public void Start()
{
StartCoroutine(OnClickCapture());
}

public IEnumerator OnClickCapture()
{
    string date = System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
    GameObject[] hideObjects = GameObject.FindGameObjectsWithTag("UI_01");
    foreach (GameObject ui in hideObjects) { ui.SetActive(false); }

    yield return new WaitForEndOfFrame();

    string fileName = date + ".png";
    var w = Screen.width; var h = Screen.height;
    var ss = new Texture2D(w, h, TextureFormat.RGB24, false);
    ss.ReadPixels(new Rect(0, 0, w, h), 0, 0);
    ss.Apply();
    NativeGallery.SaveImageToGallery(ss, "GalleryTest", fileName);
}

}

StartCoroutineをStartメソッドに記述しないコルーチンの書き方を教えてください。

自分で試したこと

OnClickCapture()をボタンにアタッチしたいのですができず、Start()をアタッチしています。

0

1Answer

別のところでアドバイスをいただき、自己解決しました。

<解決方法>
1.Startメソッドにはボタン押下時に呼び出されるイベントリスナーのみを記載し、StartCoroutineはイベントで呼び出された先の関数に記載するようにした

2.上記だけだとNativeGalleryが呼び出されなくなってしまうので、こちらの記事を参考にしてyield return new WaitForEndOfFrame();をyield return null;へ変更した
https://qiita.com/yuki2006/items/b7b5e247e64b6f1e56fe

3.すると今度はボタンをinActiveにしたことを理由にエラーが起こってコルーチンの実行が止まってしまうので、ボタンをinActiveにしないで画面外に移動させるようにした
(画面キャプチャボタン(「ButtonScreenCapture」)をUI_01というタグから外しました)

<コード>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class OnClickCaptureScript : MonoBehaviour
{
Button captureButton;

public void Start()
{
    var captureButtonGameObject = GameObject.Find("ButtonScreenCapture");
    captureButton = captureButtonGameObject.GetComponent<Button>();
    captureButton.onClick.AddListener(OnClickCapture1);
}

public void OnClickCapture1()
{
    StartCoroutine(OnClickCapture());
}

public IEnumerator OnClickCapture()
{
    string date = System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
    GameObject[] hideObjects = GameObject.FindGameObjectsWithTag("UI_01");
    foreach (GameObject ui in hideObjects) { ui.SetActive(false); }
    GameObject.Find("Canvas").transform.Find("DropdownPoseSelect").gameObject.SetActive(false);
    GameObject.Find("Canvas").transform.Find("ButtonScreenCapture").gameObject.transform.localPosition= new Vector3(100000,0,0);

    yield return null;

    string fileName = date + ".png";
    var w = Screen.width; var h = Screen.height;
    var ss = new Texture2D(w, h, TextureFormat.RGB24, false);
    ss.ReadPixels(new Rect(0, 0, w, h), 0, 0);
    ss.Apply();
    NativeGallery.SaveImageToGallery(ss, "GalleryTest", fileName);
}

}

以上

0Like

Your answer might help someone💌