viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73ced8ffa11d02831dfaf0852456fb219302713c4cc85ae38bed574660b22545db9d3f551f6691fc53fab4ed48c8c19f6bc4257297bda4f


맵이동을 만들었음.


맵을 한 씬에서 이동하는 것과. 씬에서 씬으로 이동하는 걸 구현했는데


기존 함수 짜둔게 오류가 뜨기시작함.


씬에서 씬으로 이동하는 부분이 문제였는데.


이동하게 되면 기존 오브젝트들이 죄다 부서지고.


돌아오면 새로 만들어짐.


플레이어랑 카메라는 그거때문에 부서지면 나중에 플래그 채워두는거에 문제가 생길거같아서 dontdestroy를 썻지.


이 때 눈치챘어야됬어


ㄹㅇ 존나 발로 짯구나 싶었다 함수를


NPC에 대화스크립트를 넣었는데. 그 대화스크립트는 대화창오브젝트를 받고.


대화창 오브젝트는 위치를 카메라에 받음.


다음 씬으로 이동을 하면. 카메라가 사라지면서. 대화창오브젝트의 위치값 카메라가 missing 뜨더라.


그래서 아무생각없이 대화창 오브젝트도 안부숴버리게 하면 되겠지 하고 했는데.


이번엔 NPC가 대화창오브젝트를 못가져옴


애미..


그래서 그걸 어케어케 잘 그려서 만듦


using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;//텍스트 사용할 시 필요.

//대화 구현 cs

//대화를 출력할 때 사용함.

//1. 대화만 있을 때 (내부에서 값을 받아 사용)

//2. 선택 후 대화가 있을 때. 옆동네 선택cs에 값중에서 선택한 값을 받아와 현재 선언되있는 txt_Dialogue에 떄려박히고 실행됨

//3. 대화 후 선택 후 대화. 옆동네 선택cs에서 값을 받아와 현재 선언되있는 txt_Dialogue에 떄려박히고

//이어서 선택창이 나온 뒤. 선택 후 2번과 같음.

[System.Serializable]

public class Dialogue

{

[TextArea]

public string dialogue;//외부에서 가져가 사용할 수 있는 대화값. 배열이 안되있으므로 연구필요.

public Sprite cg;//외부에서 가져가 사용할 수 있는 cg슬롯 각 대화값마다 하나씩 들어가 있음..


}

public class TextRoom : MonoBehaviour

{

//실행 시 대화시스템 구성. 유니티 내부에서 대화의 숫자와 내용 그리고 CG를 입력 가능.

public SpriteRenderer sprite_StandingCG;//그림파일

public SpriteRenderer sprite_DialogueBox;//대화창

public Text txt_Dialogue;//using UnityEngine.UI 필요

public Animator animator;//애니메이션을 사용하기 위한 선언.


public bool isDialoge = false; //대화가 실행됬는지 아닌지를 확인함. 즉. isDialoge가 false일 경우. 대화를 하지 않는것으로 판단가능.

public bool isDialoge_2 = false;//선택시 결과대화 유지를 위한 플래그

public bool isDialoge_1 = false;//선택전 대화 유지를 위한 플래그


public bool flagA = false;


private WaitForSeconds waitTime = new WaitForSeconds(0.01f);//0.01초 지연을 위한 변수지정.

private int count = 0;

private int countD = 0;//ChoiceDialogue 카운트


private Choice_TextRoom ChText;//Choice_TextRoom을 불러옴.

public static TextRoom instance;

#region Singleton

private void Awake()

{

if (instance == null)

{

DontDestroyOnLoad(this.gameObject);

instance = this;

}

else

{

Destroy(this.gameObject);

}

}

#endregion Singleton

public void ShowDialogue0(Dialogue[] choice)

{

countD = 0;

count = choice.Length;//대화 배열 초기화

ChText = FindObjectOfType<Choice_TextRoom>();//인스펙터창에 있는 내용을 불러옴.

OnOff(true);//인터페이스 활성화

StartCoroutine(CoroutineShow(choice));

}

IEnumerator CoroutineShow(Dialogue[] choice)

{

for (int i = 0; i < choice.Length; i++)

{

flagA = false;

txt_Dialogue.text = choice[i].dialogue;//카운트를 올리면서 다음 대화창 띄우기

sprite_StandingCG.sprite = choice[i].cg;//카운트를 올리면서 다음 cg띄우기

countD++;

yield return new WaitUntil(() => flagA);

}

}

//public void ShowDialogue1(Dialogue[] choice)//대화창 활성화//여러개를 사용하면 겹쳐서 하나만 출력되게 된다. 문제 해결 필요.

//{

// countD = 0;

// ChText = FindObjectOfType<Choice_TextRoom>();//인스펙터창에 있는 내용을 불러옴.

// for (int i = 0; i < choice.Length; i++)

// {

// dialogue_1[i].dialogue = choice[i].dialogue;//카운트를 올리면서 다음 대화창 띄우기

// dialogue_1[i].cg = choice[i].cg;//카운트를 올리면서 다음 cg띄우기

// countD++;

// }

// OnOff_1(true);//인터페이스 활성화

// count =0;//대화 배열 초기화

// NextDialogue_1();//다음 배열 실행

//}

//public void ShowDialogue2(Dialogue[] choice)

//{

// countD = 0;

// ChText = FindObjectOfType<Choice_TextRoom>();//인스펙터창에 있는 내용을 불러옴.

// for (int i = 0; i < choice.Length; i++)

// {

// dialogue_2[i].dialogue = choice[i].dialogue;//카운트를 올리면서 다음 대화창 띄우기

// dialogue_2[i].cg = choice[i].cg;//카운트를 올리면서 다음 cg띄우기

// countD++;

// }

// OnOff_2(true);//인터페이스 활성화

// count = 0;//대화 배열 초기화

// NextDialogue_2();

//}

private void OnOff(bool _flag)//true.시 대화창 CG 텍스트 가 체크되면서 활성화댐. 아닐시 안보임.

{

sprite_DialogueBox.gameObject.SetActive(_flag);//대화창 활성/비활성화

sprite_StandingCG.gameObject.SetActive(_flag);//CG 활성/비활성화

txt_Dialogue.gameObject.SetActive(_flag);//텍스트 활성/비활성화

animator.SetBool("box_motion", _flag);//인터페이스 애니메이션 스탠스로 변경.

isDialoge = _flag;//업데이트 실행을 위한 플래그.

}

//private void OnOff_1(bool _flag)//true.시 대화창 CG 텍스트 가 체크되면서 활성화댐. 아닐시 안보임.

//{

// sprite_DialogueBox.gameObject.SetActive(_flag);//대화창 활성/비활성화

// sprite_StandingCG.gameObject.SetActive(_flag);//CG 활성/비활성화

// txt_Dialogue.gameObject.SetActive(_flag);//텍스트 활성/비활성화

// animator.SetBool("box_motion", _flag);//인터페이스 애니메이션 스탠스로 변경.

// isDialoge_1 = _flag;

//}

//private void OnOff_2(bool _flag)//true.시 대화창 CG 텍스트 가 체크되면서 활성화댐. 아닐시 안보임.

//{

// sprite_DialogueBox.gameObject.SetActive(_flag);//대화창 활성/비활성화

// sprite_StandingCG.gameObject.SetActive(_flag);//CG 활성/비활성화

// txt_Dialogue.gameObject.SetActive(_flag);//텍스트 활성/비활성화

// animator.SetBool("box_motion", _flag);//인터페이스 애니메이션 스탠스로 변경.

// isDialoge_2 = _flag;

//}


// Update is called once per frame

//private void NextDialogue()//다음 대화 이어가도록 하는 함수.

//{

// txt_Dialogue.text = dialogue_0[count].dialogue[count];//카운트를 올리면서 다음 대화창 띄우기

// sprite_StandingCG.sprite = dialogue_0[count].cg;//카운트를 올리면서 다음 cg띄우기

// count++;//카운트 값을 증가하여 배열의 크기와 같아지면 멈추도록하기 위한 조건값.

//}

//private void NextDialogue_1()//다음 대화 이어가도록 하는 함수.

//{

// txt_Dialogue.text = dialogue_1[count].dialogue[count];//카운트를 올리면서 다음 대화창 띄우기

// sprite_StandingCG.sprite = dialogue_1[count].cg;//카운트를 올리면서 다음 cg띄우기

// count++;//카운트 값을 증가하여 배열의 크기와 같아지면 멈추도록하기 위한 조건값.

//}

//private void NextDialogue_2()//다음 대화 이어가도록 하는 함수.

//{

// txt_Dialogue.text = dialogue_2[count].dialogue[count];//카운트를 올리면서 다음 대화창 띄우기

// sprite_StandingCG.sprite = dialogue_2[count].cg;//카운트를 올리면서 다음 cg띄우기

// count++;//카운트 값을 증가하여 배열의 크기와 같아지면 멈추도록하기 위한 조건값.

//}

void Update()//상시적으로 스페스바를 눌렀을 시에 다음 대화가 나오고 다음 대화가 없을 경우 대화창 비활성화.

{

if (isDialoge)

{

if(Input.GetKeyDown(KeyCode.Space))//keydown의 경우 한번 눌렀을 경우. 계속 누를경우 down을 쓰지않고 사용.

{

if (countD < count)//배열의 길이를 카운트와 비교하여 다음 데이터가 있는지 확인

flagA = true;

//NextDialogue();//다음 배열 재실행. 조건 포문을 떨어뜨려서 하는 느낌.

else

{

OnOff(false);//배열이 없을 경우 전체 비활성화.

//System.Array.Clear(dialogue_0, 0, dialogue_0.Length);

}

}

}

//if (isDialoge_1)

//{

// if (Input.GetKeyDown(KeyCode.Space))//keydown의 경우 한번 눌렀을 경우. 계속 누를경우 down을 쓰지않고 사용.

// {

// if (count < countD)//배열의 길이를 카운트와 비교하여 다음 데이터가 있는지 확인

// NextDialogue_1();//다음 배열 재실행. 조건 포문을 떨어뜨려서 하는 느낌.

// else

// {

// OnOff_1(false);//배열이 없을 경우 전체 비활성화.

// // System.Array.Clear(dialogue_0, 0, dialogue_0.Length);

// }

// }

//}

//if (isDialoge_2)

//{

// if (Input.GetKeyDown(KeyCode.Space))//keydown의 경우 한번 눌렀을 경우. 계속 누를경우 down을 쓰지않고 사용.

// {

// if (count < countD)//배열의 길이를 카운트와 비교하여 다음 데이터가 있는지 확인

// NextDialogue_2();//다음 배열 재실행. 조건 포문을 떨어뜨려서 하는 느낌.

// else

// {

// OnOff_2(false);//배열이 없을 경우 전체 비활성화.

// // System.Array.Clear(dialogue_0, 0, dialogue_0.Length);//한번 만 하는 대화일 경우에는 배열 초기화 필요.

// }

// }

//}

}

}


using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class Choice_TextRoom : MonoBehaviour

{//최대 3중 1택이 가능한 선택대화창을 사용하기 위해 만들어진 코드.

//dialogue_1값은 대화 선택 대화에서 첫번째 대화를 나타냄.

//4 5 6은 선택에 따라서 나오는 result값 반환에 하나씩 집어넣음.

private Choise_text theChoice;

public Choise choice;

public bool flag;//반복을 막아주기 위한 플래그

public Dialogue[] dialogue_1; //초반 대화용 다이얼로그

//[SerializeField] public Dialogue dialogue_2;

//[SerializeField] public Dialogue dialogue_3;

public Dialogue[] answer_1; //선택시의 대화

public Dialogue[] answer_2; //선택시의 대화

public Dialogue[] answer_3; //선택시의 대화


private TextRoom DM;//텍스트룸 가지고오기.

public static Choice_TextRoom instance;


// Start is called before the first frame update

void Start()

{

DM = FindObjectOfType<TextRoom>();//텍스트 룸 가지고 오기.

flag = false;

theChoice = FindObjectOfType<Choise_text>();

}

public void Text()//선 택후 결과

{

if(!flag)

{

StartCoroutine(ACoroutine());

}

}

public void Text2()//대화 후 선택 이후 결과

{

if (!flag)

{

StartCoroutine(BCoroutine());

}

}


public void Text3()//대화 후 선택 이후 결과

{

if (!flag)

{

StartCoroutine(CCoroutine());

}

}


IEnumerator ACoroutine()//3문 1택 단 한번의 선택

{

flag = true;

theChoice.ShowChoice(choice);

yield return new WaitUntil(()=>!theChoice.choiceIng);

//Debug.Log(theChoice.GetResult()); 출력값 확인.

if (theChoice.GetResult() == 0)

{

DM.ShowDialogue0(answer_1);

}

else if(theChoice.GetResult() == 1)

{

DM.ShowDialogue0(answer_2);

}

else if (theChoice.GetResult() == 2)

{

DM.ShowDialogue0(answer_3);

}

}

IEnumerator BCoroutine()//예 아니오 선택적 행동

{

flag = true;

DM.ShowDialogue0(dialogue_1);

yield return new WaitUntil(()=>!DM.isDialoge);

theChoice.ShowChoice(choice);

yield return new WaitUntil(() => !theChoice.choiceIng);

//Debug.Log(theChoice.GetResult()); 출력값 확인용 디버그 기록 출력.

if (theChoice.GetResult() == 0)

{

DM.ShowDialogue0(answer_1);

}

else if (theChoice.GetResult() == 1)

{

DM.ShowDialogue0(answer_2);

flag = false;//싫어를 할 경우 다시 반복할 수 있도록 조정.

}

}

IEnumerator CCoroutine()//예 아니오 선택적 행동

{

flag = true;

DM.ShowDialogue0(dialogue_1);

yield return new WaitUntil(() => !DM.isDialoge);

}

// Update is called once per frame

void Update()

{

}

}



주석봐라 시발


나름 이렇게 하면 돌아가겠네 하고 집어넣었는데


만들다보니 문제가 있어서 다시 구현하다보니 최적화 된 느낌이 듬.


큰 거 하나 배웠다..



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73ced8ffa11d02831dfaf0852456fb219302713c4cc85ae38bed574660b22545db9d3f551f6691fc53fab4ed28e8a19f3e94100297bda4f


같은 표현에 좀더 간결하게 코드가 짜지니까 기분이 좋아


근데 또 문제하나가 생김.




viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73ced8ffa11d02831dfaf0852456fb219302713c4cc85ae38bed574660b22545db9d3f551f6691fc53fab4ed48adf49a4ba4b53297bda4f


이렇게 대화 UI가 다른곳에 튀어나옴.


그 외에 문제는 없는데 이건 해결해야할듯


난 UI만지는게 너무 힘들더라


뭔가 힘듬


왜 저래되나했더니 카메라랑 캐릭터 dontdestroy 안넣었던거였음


넣으니 잘된다 ㅎ


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73ced8ffa11d02831dfaf0852456fb219302713c4cc85ae38bed574660b22545db9d3f551f6691fc53fab4e8689db4aa6bc4707297bda4f