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

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

新規登録して質問してみよう
ただいま回答率
85.48%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

button

HTMLで用いる<button>タグです。

Unity

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

Q&A

解決済

1回答

484閲覧

【Unity】Canvas内のボタンを押下後にシーン遷移が行われるようにスクリプトを修正したい

PotePui

総合スコア69

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

button

HTMLで用いる<button>タグです。

Unity

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

1グッド

0クリップ

投稿2022/07/13 17:46

実現したいこと

UnityのCanvas内にあるボタンを押下すると、1.1秒後にフェードイン・アウトのAnimationがシーン遷移に併せて、実行されるスクリプトです。

やりたいことは、そのボタンを押下するとがシーン遷移が始まる。という内容にしたいです。

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

現状:実行すると、開始と同時にシーン遷移が開始されます・・・

このスクリプトをコピペしてもフェードイン・アウトのアニメーションがないため分かりずらいですが、
自分でも分かっていますが、Start関数内にOnClick.AddListenerを記述しているため、
もちろん、ボタンを押すどころか、Editorを実行した瞬間にフェードイン・アウトと共にシーン遷移が始まります。。。

分かってはいると記載しましたが、AddListenerの使い方がよく分かっていないせいだと思います。
publicメソッドを使用したくないので、スクリプトからボタンを押したらシーン遷移が開始されるように、
スクリプトをどう変更すればよいのでしょうか。
ググって色々調べましたが、結局分からずじまいになってしまってます💦
すみません、簡単なことだと思いますが少しUnityから離れてて、また再開しています。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5using UnityEngine.UI; 6 7/// <summary> 8/// Canvas GroupのAlpha値の変化により、指定時間後にAnimationでImageを 9/// ゆっくりフェードイン・アウトを行い、シーン遷移を行うスクリプト 10/// </summary> 11public sealed class LevelLoader : MonoBehaviour 12{ 13 [SerializeField, Tooltip("Scene遷移を行うボタン")] 14 private Button _button; 15 [SerializeField, Tooltip("Scene遷移するまでの時間(秒)")] 16 private float _transitionTime = 1.1f; 17 [SerializeField, Tooltip("Scene遷移時のフェードインアウト\nAnimatorComponentがAttachされているObjectを指定")] 18 private Animator _transition; 19 20 21 void Start() 22 { 23 _button.onClick.AddListener(() => LoadNextLevel()); 24 } 25 26 private void LoadNextLevel() 27 { 28 StartCoroutine(LoadLevel(SceneManager.GetActiveScene().buildIndex + 1)); 29 } 30 31 private IEnumerator LoadLevel(int levelIndex) 32 { 33 _transition.SetTrigger("Start"); // Play Animation 34 yield return new WaitForSeconds(_transitionTime); // Wait 35 SceneManager.LoadSceneAsync(levelIndex); // Load Scene 36 } 37 38} 39

補足情報(FW/ツールのバージョンなど)

Unity ver2021.3.01f

q22r5695👍を押しています

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

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

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

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

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

PotePui

2022/07/23 16:41

お返事遅れてすみません💦 アニメーションイベントもいいですね! ただ、最終的なデバイスはVRになるので、アニメーションは出来る限り使わないようにしたいです。 今回は上記の理由でアニメーションイベントは使わないですが、教えていただきありがとうございます。
guest

回答1

0

ベストアンサー

スクリプト見る限り、ボタンが押されるまでLoadNextLevelは呼ばれない気がするんですけどね?
試しに

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class NewBehaviourScript : MonoBehaviour 7{ 8 [SerializeField] Button button; 9 10 11 // Start is called before the first frame update 12 void Start() 13 { 14 button.onClick.AddListener(() => testFunc()); 15 } 16 17 void testFunc() { 18 Debug.Log($"test {Time.time}"); 19 } 20 21 22 // Update is called once per frame 23 void Update() 24 { 25 26 } 27} 28

こんな感じで、空のGameObjectにスクリプト貼り付けて実行してみましたが、Debug.Logが呼ばれたのはボタンが押された時のみでした。
だから、何らかの理由でボタンのonClickが入ってるか、Updateかなんかその辺からLoadNextLevelかLoadLevelが呼ばれてる位しか無さそうだけどなぁ?と思いました

投稿2022/07/18 13:38

drednote

総合スコア336

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

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

PotePui

2022/07/23 16:45

色々あれから調べて、「永続的な」メソッドのようです。 なので、スタート関数内でもいいみたいでシーン遷移もできました。ただこれにAnimationを以前は組み合わせていたのですが、やはりAnimationは使わないほうがいいということになり、 結果、DoTweenでシーン遷移時にFadeIn,Outをするように変更しました。 ちょっとまだコードは出来ていないのでUpできませんが、簡単でも調べてくださってありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問