형님들 봐주셔서 감사합니다!!


다름이 아니라 델리게이트 이용해서 대화창 종료후 바로 화면전환이 되는 기능을 만들고 싶은데요 ㅠㅠ


최종적으로 코딩에 오류는 발생안되나 게임 실행할때 대화 창 종료후 바로 화면 전환이 안됩니다 ㅠㅠㅠ


이번 기회에 델리게이트 제대로 알아서 개발하는데 활용하고 싶어요!!!!!


형님들 뭐가 잘못되었는지 이해가 안됩니다 좀 도와주세요!!!






using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;


[System.Serializable]//외부스크립트에서 수정을 못하게,                  
                     // 참조할 필요없는 변수가 접근해서 쓸데없는 상황을 안만들기
                     //public 은 그냥 직렬화 되지만 private는 직렬화(serialization)해줘야된다.
public class Dialogue
{
    [TextArea] //여러줄써줄수있게만들어줌
    public string dialogue;
    public Sprite cg;
}
public class DialogManager : MonoBehaviour
{
    [SerializeField] private SpriteRenderer sprite_StandingCG; //private 변수지만 //변수선언 이유 CG변경
    [SerializeField] private Image image_DialogueBox; //inspector 접근가능하다 //텍스트 박스
    [SerializeField] private Text txt_Dialogue; //게임 오브젝트나 컴포넌트 관리할때 // 텍스트 내용
                                                //인스펙터에서만 관리할려고

    public event EventHandler OnDialogueEnd;

    private bool isDialogue = false; //대화가 진행중이다 판별해줌

    private int count = 0;
    // 대화가 얼마나 진행되엇는지 알려주는 카운트

    [SerializeField] private Dialogue[] dialogue; //Dialogue 클래스의 대화 배열받기



    public void ShowDialogue() // 대화창 보여주는 유무 기능의 함수
    {
        // Start is called before the first frame update
        OnOff(true);
        count = 0; //대화 시작되는 부분 초기화
        NextDialogue(); // 호출되자마자 대화시작
    }
    private void OnOff(bool _flag) //대화창 보이는거 안보이는거 조정하는 함수
    {
        image_DialogueBox.gameObject.SetActive(_flag); //flag는 바로 위 OnOff(true)함수 기능 중 true를 flag로 받음
        sprite_StandingCG.gameObject.SetActive(_flag);
        txt_Dialogue.gameObject.SetActive(_flag);
        isDialogue = _flag;

    }




    private void NextDialogue() // 대화진행 함수 만들기
    {
        txt_Dialogue.text = dialogue[count].dialogue; //첫번째 대사
        sprite_StandingCG.sprite = dialogue[count].cg; // 첫번째 CG 등장시 카운터시작
        count++; //다음 장면으로 이어가게
    }




    // Update is called once per frame
    void Update()
    { //매 프레임마다 반복되는 함수, 만약 매프레임마다 연산할 필요없을 경우 밖에다 기능만들어야됨
        if (isDialogue)  //예를 들면 반복적으로 대화를 통해 정보를 얻어야 되는 게임이라면 이곳에 기능을 만들어야됨...
        {
            if (Input.GetMouseButtonDown(0)) //마우스 왼쪽 버튼으로 입력받기! 대화 클릭으로 진행됨
            {
                if (count < dialogue.Length) // 대화의 배열의 크기가 카운트 되는 수(현재 대화)보다 작으면
                    NextDialogue();             // 다음 대화창으로 진행
                else
                {
                    OnOff(false);
                    OnDialogueEnd?.Invoke(0); // 숫자 뭘 넣어주길 원하는지 모르겠음.
                }
            }

        }
    }


    public delegate void EventHandler(int count); // 여기부터 어떻게할까요??

    IEnumerator TestCoroutine()  // 조건문을 코루틴 안에 넣어보기 if~문 그리고 return null 이거 실행해보기
    {
        yield return new WaitUntil(() => count > dialogue.Length);
        SceneManager.LoadScene("lifeover");

    }


}
//대화 끝나면 자동으로 다음 씬으로 넘기는 기능 만들어보기!!
//이를 처리 하기 위해서는 콜백함수,델리게이트(함수를 가지는 변수!) 이용해보기!
//함수 밖으로 뺀다는 것 -> 파라미터로 받는 걸 의미!    
class Dialog
{
    void DialogueRun()
    {
        // ...

        // ?.은 델리게이트 비어 있으면 null이기 때문에 그대로 접근시 예외 발생 할 수 있어 null체크 하는 용도임.
        // if (OnDialogueEnd != null) OnDialogueEnd.Invoke(); 와 같음.
        OnDialogueEnd?.Invoke();
    }

    public event System.Action OnDialogueEnd;
}

class Foo
{
    Dialog dialogue; // 어디선가 얻었다고 가정하자.

    // 초기화, Monobehaviour 위에서는 Awake나 Start
    public void Initialize()
    {
        dialogue.OnDialogueEnd += SomeFunction;
        dialogue.OnDialogueEnd += () => SomeFunctionButHaveParam(0); // 매개변수가 없는 함수로 한번 감싸는거일 뿐임. 본질적으로 SomeFunction() 형태와 같음.
    }

    void SomeFunction()
    {
        SomeFunctionButHaveParam(0);
    }

    void SomeFunctionButHaveParam(int param)
    {
        // ...
    }
}