안녕하세요 교수님~! 유튜브 활동 하신다는 이야기는 들었는데 어쩌다보니 알고리즘을 타고 교수님의 채널에 까지 오게 되었습니다! 처음 막막하게 게임 만들던 때가 생각나네요... 교수님 덕분에 유니티에 쉽게 접근 할 수 있었고 그 경험 덕에 지금은 모 게임 회사에서 일하고 있습니다 ^ㅅ^!!! 언젠가 감사 인사를 드려야지 했는데 이 댓글을 보실지는 모르겠지만 여기에 남기고 갑니다 ㅎㅎ 앞으로도 건강하시고 행복하셨으면 좋겠어요!!! 좋은 영상들도 보고갑니다!!!
고박사님 감사합니다 영상 잘 봤습니다. 그런데 캐릭터 알파값 변경에서 ui>이미지 로 만든 스프라이트는 적용이 안되고 .GameObject - 2D Object - Sprites 에서 만든 이미지에만 적용이 되더라고요... UI>이미지로 만든 스탠딩에 적용은 못 할까요? ㅠㅠ
문장 끝이 잘린다는게 "안녕하세요. 고박사입니다." 라고 출력했는데 UI에 출력될 때는 공간이 부족하거나 어떤 문제로 인해 "안녕하세요. 고박" 까지만 출력되는 형태의 잘린다는 얘기라면 1. UI 크기를 고려해 대사의 양을 조절하는 방법 2. 대사를 출력하는 TextMeshPro-Text 컴포넌트에서 텍스트 양이 많을 때 처리하는 방법을 설정할 수 있습니다. (Font Size를 자동으로 설정해 폰트 크기를 조절하거나 Overflow를 설정하는 것과 같은 방법)
지금코드에서 아주 조금만 수정해도 가능합니다. 타이핑 텍스트가 진행중인지 종료되었는지 검사해서 종료되었으면 다음 대사를 진행하면 됩니다. 원래 다음 대사를 진행하는걸 Input.GetMouseButtonDown(0)으로 했으니 거기 있는 코드들을 타이핑 텍스트 종료 여부 검사하는 조건문 내부에 넣어서 실행하면 되겠죠
얼굴 이미지 또는 표정이 포함된 캐릭터 이미지를 교체하면 됩니다. SetNextDialog()와 SetActiveObjecs()에서 현재 화자에 대한 이미지, 대사 등을 설정하는데 그 부분에서 이미지를 교체하세요 예시로 모든 표정이 포함된 배열(ex. private Sprite[] faces;을 만들고, 웃는 얼굴 = 0, 우는 얼굴 = 1과 같이 인덱스를 매겨둔 후 첫 대사에선 speakers[currentSpeakerIndex].faceSprite.sprite = faces[웃는얼굴]; 두 번째 대사에선 speakers[currentSpeakerIndex].faceSprite.sprite = faces[화난얼굴];
08:38 SetNextDialog() 메소드에서 currentDialogIndex ++; 로 값을 1 증가시키고, .. = dialogs[currentDialogIndex].speakerIndex; 와 같이 사용하기 때문에 -1이 아닌 0으로 시작해 오류가 발생하지 않습니다. 혹시 75줄의 SetActivateObjects()에서 currentSpeakerIndex가 아닌 currentDialogIndex를 사용한건 아닌지 체크해보세요
IndexOutOfRangeException 오류는 배열의 범위 밖에 있는 값을 사용할 때 나는 오류입니다. 예를 들어 int[] array = new in[3]; 과 같이 방이 3개 있는 배열 변수를 선언했는데 Debug.Log(array[10]);과 같이 10번 방에 있는 값을 참조하려고 할 때 저 오류가 뜹니다.
익명 메소드의 확장된 개념으로 주로 코드 간결화를 위해 사용하는 "람다식" 입니다 yield return new WaitUntil()은 괄호 내부의 Func의 결과가 true가 될 때까지 대기하는 구문입니다. dialogSystem01.UpdateDialog()에서 true가 반환될때까지 18번줄에서 멈춰있는 것입니다.
@@unitynote NullReferenceException: Object reference not set to an instance of an object DialogSystem.SetActiveObjects (Speaker speakers, System.Boolean visible) (at Assets/Script/고박사님 스크립트/DialogSystem.cs:98) DialogSystem.Setup () (at Assets/Script/고박사님 스크립트/DialogSystem.cs:31) DialogSystem.Awake () (at Assets/Script/고박사님 스크립트/DialogSystem.cs:22) 이게 에러 전문이고ㅜㅠ NullReferenceException이 초보들이 꼭 한번씩 마주치는 에러라고 해서 스스로 극복해보려고 온갖 애를 다 썼는데도 해결방법을 모르겠습니다 ㅠㅠ
3d게임에서 대화를 할때는 지금처럼 2d캐릭터와 대사를 출력하기 때문에 별도의 처리가 필요없습니다. 만약 3d 캐릭터에게 출력하는 것이라면 3d object에 있는 text를 사용하거나 현재 사용중인 text ui를 3d 오브젝트 위치와 동기화하면 됩니다. (타워디펜스의 slider ui 참고)
추가로 여쭤보고 싶은게 있습니다! 맨처음 프로젝트 세팅할 때 3D코어로 프로젝트를 세팅하는데 교수님께서 보여주신 Dialog는 2D코어로 만들었습니다. 그러면 3D코어 프로젝트에 Dialog를 임포트 해야하는 건가요? 저는 에셋들이랑 스크립트를 끌고와서 씬 배치를 해보려고 했으나 돌아가지 않아서 여쭤봅니다 ㅠㅠ
안녕하세요 교수님~!
유튜브 활동 하신다는 이야기는 들었는데 어쩌다보니 알고리즘을 타고 교수님의 채널에 까지 오게 되었습니다!
처음 막막하게 게임 만들던 때가 생각나네요... 교수님 덕분에 유니티에 쉽게 접근 할 수 있었고 그 경험 덕에 지금은 모 게임 회사에서 일하고 있습니다 ^ㅅ^!!! 언젠가 감사 인사를 드려야지 했는데 이 댓글을 보실지는 모르겠지만 여기에 남기고 갑니다 ㅎㅎ
앞으로도 건강하시고 행복하셨으면 좋겠어요!!! 좋은 영상들도 보고갑니다!!!
누군지는 알 수 없지만 그래도 배웠던 학생들이 나가서 취직 잘하고 잘먹고 잘살고 있다는 소식 들려오면 그걸로 된 거 아닌가 싶네요 :)
서로의 위치에서 항상 화이팅하길 바래요.
이렇게 댓글 남겨줘서 고마워요 ^^
와!!! ㅜㅜ 😂 저한테 진짜 필요한 강의였는데 정말 감사합니다............ 다 뒤져도 안나왔는데 ㅜㅜ 드디어
도움이 되었다면 다행입니다^^
대화시스템은 게임에서 자주 사용되는 시스템이죠.
정말 딱 필요한 강의네요.
감사합니다.~^^
비주얼노벨 뿐만 아니라 RPG나 다른 게임에서도 대화는 자주 사용되는데
모든 상황을 다 가정하고 만들기엔 너무 볼륨이 커서 간략하게 제작해보았습니다.
댓글 감사합니다^^
고박사님 항상 감사해요
항상 시청해주셔서 감사합니다.
고박사님 감사합니다 영상 잘 봤습니다. 그런데 캐릭터 알파값 변경에서 ui>이미지 로 만든 스프라이트는 적용이 안되고 .GameObject - 2D Object - Sprites 에서 만든 이미지에만 적용이 되더라고요... UI>이미지로 만든 스탠딩에 적용은 못 할까요? ㅠㅠ
그럼 DialogSystem.cs 스크립트의 Speaker 구조체에 있는 spriteRenderer 타입을 Image로 변경하면 됩니다.
@@unitynote 해결했습니다 감사합니다!!! 😭😭😭😭😭
요즘 제작하고 있는 부분인데 많은 참고가됬습니다. 감사합니다.
도움이 되었다니 다행입니다^^
중요한 강의네요... 잘 봤습니다 감사합니다!
도움이 되셨다니 다행입니다.
안녕하세요
Dialogue Sytem에서 만든 UpdateDialog() 함수를 DialogTest에서 안불러와지는 문제는 해결되었고요
대화 진행은 정상적으로 되지만 문장 끝이 잘리는 문제가 생깁니다 어떻게 해결하면 될까요?
문장 끝이 잘린다는게 "안녕하세요. 고박사입니다." 라고 출력했는데 UI에 출력될 때는 공간이 부족하거나 어떤 문제로 인해 "안녕하세요. 고박" 까지만 출력되는 형태의 잘린다는 얘기라면
1. UI 크기를 고려해 대사의 양을 조절하는 방법
2. 대사를 출력하는 TextMeshPro-Text 컴포넌트에서 텍스트 양이 많을 때 처리하는 방법을 설정할 수 있습니다.
(Font Size를 자동으로 설정해 폰트 크기를 조절하거나 Overflow를 설정하는 것과 같은 방법)
오... 이번 강의는 정말 유용하네여 잘배우고 갑니다.
도움이 되셨다니 다행입니다.
대화창을 하나로 공유해서 쓰는 등 다양한 상황에 따라 코드 커스텀이 필요하겠지만
여러 명의 캐릭터가 등장하고, 여러 개의 대화창을 사용할 때를 가정해 구성했습니다.
대화시스템을 개발하는 데 정말 도움이 되었습니다. 한 가지 물어보고 싶은 것이 있는데, 다른 비주얼노벨 게임처럼 버튼을 클릭하면 마우스를 클릭하지 않고 자동으로 다음 대사 텍스트가 나오는 기능을 어떻게 구현해야 되나요?
지금코드에서 아주 조금만 수정해도 가능합니다.
타이핑 텍스트가 진행중인지 종료되었는지 검사해서 종료되었으면 다음 대사를 진행하면 됩니다.
원래 다음 대사를 진행하는걸 Input.GetMouseButtonDown(0)으로 했으니 거기 있는 코드들을
타이핑 텍스트 종료 여부 검사하는 조건문 내부에 넣어서 실행하면 되겠죠
안녕하세요 교수님! 이 강의를 보면서 학교 프로젝트를 만들고 있습니다 다름이 아니라 캐릭터가 구사하는 대사마다 표정을 바꾸고 싶은데 그 부분은 어떻게 응용을 해야할지 여쭤봐도 괜찮을까요...?
얼굴 이미지 또는 표정이 포함된 캐릭터 이미지를 교체하면 됩니다.
SetNextDialog()와 SetActiveObjecs()에서
현재 화자에 대한 이미지, 대사 등을 설정하는데 그 부분에서 이미지를 교체하세요
예시로 모든 표정이 포함된 배열(ex. private Sprite[] faces;을 만들고,
웃는 얼굴 = 0, 우는 얼굴 = 1과 같이 인덱스를 매겨둔 후
첫 대사에선 speakers[currentSpeakerIndex].faceSprite.sprite = faces[웃는얼굴];
두 번째 대사에선 speakers[currentSpeakerIndex].faceSprite.sprite = faces[화난얼굴];
혹시 대화시스템 안에 있는 speaker 에서 설정한 다음 Dialogs 에서 이미지 교체로는 못하나요…?
@@user-yk7dn7ss2r Speaker 구조체에 얼굴 표정에 대한 배열을 만들고, Dialogs에서 index를 바꿔가며 spriteRenderer에 적용해 이미지를 교체할 수 있죠
7:17에 Dialogindex가 -1이라서 배열 값 오류가 발생하는데 해결방법을 알 수 있을까요?
08:38 SetNextDialog() 메소드에서 currentDialogIndex ++; 로 값을 1 증가시키고,
.. = dialogs[currentDialogIndex].speakerIndex; 와 같이 사용하기 때문에 -1이 아닌 0으로 시작해 오류가 발생하지 않습니다.
혹시 75줄의 SetActivateObjects()에서 currentSpeakerIndex가 아닌 currentDialogIndex를 사용한건 아닌지 체크해보세요
IndexOutOfRangeException: Index was outside the bounds of the array. 이런 오류 떳는데 혹시 뭐가 문제인지 알려주실수있나요? 영상 보고 잘배우고 있습니다
IndexOutOfRangeException 오류는 배열의 범위 밖에 있는 값을 사용할 때 나는 오류입니다.
예를 들어
int[] array = new in[3]; 과 같이 방이 3개 있는 배열 변수를 선언했는데
Debug.Log(array[10]);과 같이 10번 방에 있는 값을 참조하려고 할 때 저 오류가 뜹니다.
@@unitynote 제가 바보였습니다 ㅋㅋㅋ 다음 대사 진행 하는 코드를 currentSpeakerIndex++; 이렇게 해놨네요.... currentDialogIndex++해야하는데
에셋 괜히 샀네요 ㅎㅎ 2탄으로 다이알로그 배열들어가는 부분 엑셀같은 것으로 받아서 쓰게 하는 부분도 강의 해주시면 굉장히 도움이 될듯합니다.
그 에셋과 완전히 같은게 아니고 제가 올린건 굉장히 심플하기 때문에 에셋에서 얻을 수 있는게 더 많을거에요^^
엑셀 테이블 데이터를 불러오는 기능은 게임에 거의 필수적으로 사용되죠 :)
@@unitynote 박사님 영상하고는 다른 질문인데 Application.OpenURL 이것을 사용할때 앱내의 패널이라던지 앱안에서 나오게 하는 좋은 방법이 있을까요?
요즘 제작하는 게임에 많이 참고가 되었습니다. 카톡처럼 버튼을 클릭하면 대사창이 위로 올라가고 새로운 버튼이 오른쪽에 생성되는 방식은 어떻게 구현해야할까요?
th-cam.com/video/u06nwL8BMI8/w-d-xo.html
이 영상을 참고하세요
13:04 의 18번째 줄의 ()=> 을 잘 모르겠는데 어떻게 해석하면 되는건가요??
익명 메소드의 확장된 개념으로 주로 코드 간결화를 위해 사용하는 "람다식" 입니다
yield return new WaitUntil()은 괄호 내부의 Func의 결과가 true가 될 때까지 대기하는 구문입니다.
dialogSystem01.UpdateDialog()에서 true가 반환될때까지 18번줄에서 멈춰있는 것입니다.
안녕하세요 고박사님 영상에 나온 스크립트 그대로 따라했는데 작동을 하지 않아요 ㅠㅠ 실례가 되지 않는다면 왜인지 봐주실 수 있을까요?? ㅜㅜㅠㅠㅠ
에러 내용이나 증상을 써주면 어느 부분에 문제가 있는지 체크해드리겠습니다.
@@unitynote NullReferenceException: Object reference not set to an instance of an object
DialogSystem.SetActiveObjects (Speaker speakers, System.Boolean visible) (at Assets/Script/고박사님 스크립트/DialogSystem.cs:98)
DialogSystem.Setup () (at Assets/Script/고박사님 스크립트/DialogSystem.cs:31)
DialogSystem.Awake () (at Assets/Script/고박사님 스크립트/DialogSystem.cs:22)
이게 에러 전문이고ㅜㅠ NullReferenceException이 초보들이 꼭 한번씩 마주치는 에러라고 해서 스스로 극복해보려고 온갖 애를 다 썼는데도 해결방법을 모르겠습니다 ㅠㅠ
@@unitynote 박사님 오류를 안 뜨게 하는 건 성공했는데요!! 빈 객체에 스크립트를 넣고 필요한 객체를 다 적용하고 게임을 실행시키면 화면이 뿌옇게 되면서 몇몇 객체들이 사라지고 클릭해도 반응이 없게 됩니다 ㅠㅠ
혹시.. 쿨타임 만들때 1초씩 줄어드는 것을 어떻게 코드로 어떻게 나타내나요?
th-cam.com/video/QnJp45U_UEs/w-d-xo.html
이 영상을 참고하세요
안녕하세요 교수님!! 좋은 강의 감사드립니다 지금 대화Dialogs는 2D인데 3D게임과 연결시키려면 어떻게 해야하나요??
3d게임에서 대화를 할때는 지금처럼 2d캐릭터와 대사를 출력하기 때문에 별도의 처리가 필요없습니다.
만약 3d 캐릭터에게 출력하는 것이라면 3d object에 있는 text를 사용하거나 현재 사용중인 text ui를 3d 오브젝트 위치와 동기화하면 됩니다. (타워디펜스의 slider ui 참고)
@@unitynote 답변 감사합니다! 3d캐릭터가 아닌, 3d로 미니게임1을 진행시킨 후 2D Dialog를 중간에 넣고 미니게임2를 진행하는 형식으로 편집하고 싶은데, 이 방법을 적용시키기는 좀 힘들까요??
@@user-sh9ct9wv5g 아뇨 적용하면 됩니다.
미니게임1, 2가 씬 단위이면 미니게임1 씬 -> 다이얼로그씬 -> 미니게임2 씬으로 진행하면되고,
한 씬에서 이루어진다면 해당 다이얼로그 관련 오브젝트들을 활성/비활성화로 관리하면 됩니다.
@@unitynote 감사합니다!! 열심히 해보도록 할게요 답변 진심으로 감사드립니다
추가로 여쭤보고 싶은게 있습니다! 맨처음 프로젝트 세팅할 때 3D코어로 프로젝트를 세팅하는데 교수님께서 보여주신 Dialog는 2D코어로 만들었습니다. 그러면 3D코어 프로젝트에 Dialog를 임포트 해야하는 건가요? 저는 에셋들이랑 스크립트를 끌고와서 씬 배치를 해보려고 했으나 돌아가지 않아서 여쭤봅니다 ㅠㅠ