https://www.youtube.com/watch?v=zBOEHxsSaLI

이번 시간에는 NPC와의 세세한 대화를 위해서 버튼을 클릭하여 여러 가지 대화가 가능하도록

해보았습니다.

 

간략하게 어떻게 하는지 설명하도록 하겠습니다.

 

오른쪽 히어라키 창을 보면 tip_1이라는 객체가 있습니다.

이는 panal이고 투명도를 255로 두었습니다.

투명도를 최대치로 맞춘 이유는 tip_1 패널이 Intro_panel에 속해있어서

Intro_panel 위에 패널을 새로 그리는 것이기 때문에 배경이 세로 생겨나게 되면 

배경이 진해지기 때문입니다. 

 

저번에 보여드린 text_log 의 코드 또한 여러 가지 대화가 추가되면서

많이 바뀌게 되었습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
[System.Serializable]
public class Dialogue
{
    // 여러줄을 쓸 수 있게 해준다.
    [TextArea]
    public string dialogue;
}
 
public class text_log : MonoBehaviour
{
    static public int npc_talk_int=0;
    public Text txt_Dialogue;
    public Button button_1;
    public Button button_2;
    public Button button_3;
    public GameObject panel;
 
    public Button tip_button_1;
    public Button tip_button_2;
    public Button tip_button_exit;
    // [SerializeField] 을 달면 유니티 inspector 창에서 해당 변수를 조작 할 수 있다.
 
    static public bool isDialogue = true;
 
    // 대화가 얼마나 진행 되었는지 확인
    private int count = 0;
 
    static private String[] dialogue; // 대화가 들어가는 배열
 
    private void Awake()
    {
        dialogue = new String[100];
 
        // 처음 intro 대사
        dialogue[0= "[농부]\n\n안녕하세요 플레이어님 반가워요";
        dialogue[1= "[농부]\n\n날씨가 아주 화창하군요! 감자 심기 좋은날이네요";
        dialogue[2= "[농부]\n\n그럼 지금 감자 심기를 배워 보도록 하겠습니다.";
        dialogue[3= "[농부]\n\n혹시 추가적으로 감자에 관해 알고 싶다면 앞에 저를 레이저 포인터로 클릭 해주세요";
        dialogue[4= "[농부]\n\n레이저 포인터는 뒤로가기 버튼을 클릭하면 켜집니다.";
        dialogue[5= "[농부]\n\n다시 누르면 꺼집니다.";
        dialogue[6= "[농부]\n\n레이저 포인터가 켜져있는 상태로, 리모컨의 큰 원을 클릭하세요 ";
        dialogue[7= "[농부]\n\n그럼 레이저 포인터가 가르키고 있는 대상과 상호 작용 할 수 있게 됩니다.";
        dialogue[8= "[농부]\n\n준비가 되었다면 저에게 알려주세요";
        dialogue[9= "[농부]\n\n준비가 되었다면 저에게 알려주세요";
        dialogue[10]  = "end";
      
        //main_대사
        dialogue[12= "[농부]\n\n무었을 도와드릴까요?";
 
        // 감자 특징 설명
        dialogue[15= "[농부]\n\n감자는 뿌리가 아닌 줄기가 비대 된 것으로 대표적인 구황작물(기후가 불순하여 흉년이 들어 곡식이 부족할 때 주곡 대신 소비할 수 있는 작물)입니다." +
         "\n감자는 재배기간이 짧아서 서늘한 이른 봄에 심어 여름 장마가 시작되기 전에 수확할 수 있습니다.";
        dialogue[16= "[농부]\n\n더워지면서 힘들고 지루해 질 수 있는 텃밭 활동에 감자를 수확함으로써 즐거움과 성취감을 느낄 수 있습니다." +
        "\n감자의 80 % 는 수분으로 이루어져 있으며 주성분은 전분이다.맛이 좋고, 포만감을 주어 다양한 요리에 쓰입니다.";
        dialogue[17= "[농부]\n\n또한 껍질은 주방에서 물때와 기름때, 옷에 묻은 얼룩을 쉽게 제거할 수 있습니다." +
        "\n씨감자는 일반 종묘상에서 구할 수 있는데 초보자는 크기가 큰 수미감자를 선택하는 것이 좋습니다.";
        dialogue[18= "[농부]\n\n수확한 감자를 씨감자로 사용할 수 있으나 바이러스 감염이나 수확량에 영향을 줄 수 있으므로 사용하지 않는 것이 좋습니다." +
        "\n휴면성이 있어서 수확 후 바로 싹이 나지 않으며 90~100일 정도 지나야 싹이 나므로 비교적 장기간 실온 보관을 할 수 있습니다.";
        dialogue[19= "[농부]\n\n수확한 감자를 씨감자로 사용할 수 있으나 바이러스 감염이나 수확량에 영향을 줄 수 있으므로 사용하지 않는 것이 좋습니다." +
        "\n휴면성이 있어서 수확 후 바로 싹이 나지 않으며 90~100일 정도 지나야 싹이 나므로 비교적 장기간 실온 보관을 할 수 있습니다.";
        dialogue[20= "end";
 
 
        dialogue[21= "";
        
        
        // 플레이어 이동 & 비료주기
        dialogue[26=  "<TIP>\n\n- 플레이어는 원형 버튼 터치를 이용하여 플레이어가 바라보는 방향으로 이동 가능합니다." +
        "\n- 플레이어는 빈 손 상태인 경우 아이템을 착용할 수 있습니다." +
        "\n- 아이템이 착용된 상태인 경우 “뒤로가기” 버튼을 누르면 해제됩니다." +
        "\n\n<HOW TO USE>\n- 비료가 담긴 바구니를 “트리거 버튼”을 이용하여 착용합니다. " +
        "\n- 지정된 트리거에 위치하여 “트리거 버튼”을 눌러 비료를 뿌립니다.";
        dialogue[27= "<TIP>\n\n- 플레이어는 원형 버튼 터치를 이용하여 플레이어가 바라보는 방향으로 이동 가능합니다." +
        "\n- 플레이어는 빈 손 상태인 경우 아이템을 착용할 수 있습니다." +
        "\n- 아이템이 착용된 상태인 경우 “뒤로가기” 버튼을 누르면 해제됩니다." +
        "\n\n<HOW TO USE>\n- 비료가 담긴 바구니를 “트리거 버튼”을 이용하여 착용합니다. " +
        "\n- 지정된 트리거에 위치하여 “트리거 버튼”을 눌러 비료를 뿌립니다.";
        dialogue[28= "end";
 
        // 삽 & 모종삽 사용하기
        dialogue[29= "<HOW TO USE>\n- 삽을 들고 “트리거 버튼”을 누르면 “두둑 트리거”가 활성화됩니다. "
        + "\n\n- 삽에 흙이 없는 상태인 경우\n   - “삽질용 트리거”만 활성화되며, “트리거 버튼”을 누르면 삽질 가능. "
        + "\n    - 특정 트리거에 삽질하면 해당 지점의 높이가 낮아지고, 삽에 흙이 쌓임."
        + "\n    - 기준치 이상 삽질하면 비활성화됨."
        + "\n\n- 삽에 흙이 있는 상태인 경우"
        + "\n    - “두둑용 트리거”만 활성화되며, “트리거 버튼”을 누르면 두둑 가능."
        + "\n    - 특정 트리거에 두둑하면 해당 지점의 높이가 높아지고, 삽에 흙 x."
        + "\n    - 기준치 이상 두둑하면 비활성화됨.";
        dialogue[30= "<HOW TO USE>\n"
            + "\n  - 모종삽을 들고 “트리거 버튼”을 누르면 “두둑 구멍 트리거”가 활성화됩니다."
            + "\n  - 모종삽을 든 상태에서 쌓인 흙을 향하여 “트리거 버튼”을 누르면 흙이 파집니다."
            + "\n  - 일정량 흙을 파게 될 경우 “두둑 구멍 트리거”가 비활성화됩니다.";
        dialogue[31= "<HOW TO USE>\n"
            + "\n  - 모종삽을 들고 “트리거 버튼”을 누르면 “두둑 구멍 트리거”가 활성화됩니다."
            + "\n  - 모종삽을 든 상태에서 쌓인 흙을 향하여 “트리거 버튼”을 누르면 흙이 파집니다."
            + "\n  - 일정량 흙을 파게 될 경우 “두둑 구멍 트리거”가 비활성화됩니다.";
        dialogue[32= "end";
 
 
        //씨감자 사용하기
        dialogue[33= "<HOW TO USE>\n" 
            + "\n  - 씨감자가 담긴 박스를 향하여 “트리거 버튼”을 누르면 일정량의 씨감자(10개)를 얻습니다."
            + "\n  - 씨감자를 드는 순간 “구멍 콜라이더”가 활성화됩니다."
            + "\n  - 씨감자를 든 상태에서 구멍 콜라이더를 향하여 “트리거 버튼”을 누르면 심어집니다.";
        dialogue[34= "<HOW TO USE>\n"
            + "- 모종삽을 든 상태에서 주변의 흙을 향하여 “트리거 버튼”을 누르면 흙이 생성됩니다."
            + "\n  - 흙이 담긴 모종삽을 이용하여 “구멍 콜라이더2”를 향하여 “트리거 버튼”을 누르면 흙이조금씩 올라갑니다."
            + "\n  - 총 3회 이상 흙을 주면 “구멍 콜라이더2”가 비활성화됩니다.";
        dialogue[35= "<HOW TO USE>\n"
            + "- 모종삽을 든 상태에서 주변의 흙을 향하여 “트리거 버튼”을 누르면 흙이 생성됩니다."
            + "\n  - 흙이 담긴 모종삽을 이용하여 “구멍 콜라이더2”를 향하여 “트리거 버튼”을 누르면 흙이조금씩 올라갑니다."
            + "\n  - 총 3회 이상 흙을 주면 “구멍 콜라이더2”가 비활성화됩니다.";
        dialogue[36= "end";
 
        // 호미삽으로 북주기
        dialogue[37= "<HOW TO USE>\n"
            + "\n  - 호미삽을 향하여 “트리거 버튼”을 누르면 장착됩니다."
            + "\n  - 호미삽을 드는 순간 “북주기 트리거”가 활성화됩니다."
            + "\n  - 호미삽을 든 상태로 “트리거 버튼”을 누르면 호미삽이 일정 거리 앞으로 향합니다."
            + "\n  - 만약 호미삽이 “북주기 트리거”에 닿을 경우 (Enter 호출될 시) 흙의 양이 소폭 증가합니다."
            + "\n  - 5번 정도 트리거에 닿을 경우 해당 “북주기 트리거”는 비활성화됩니다.";
        dialogue[38= "<HOW TO USE>\n"
            + "\n  - 호미삽을 향하여 “트리거 버튼”을 누르면 장착됩니다."
            + "\n  - 호미삽을 드는 순간 “북주기 트리거”가 활성화됩니다."
            + "\n  - 호미삽을 든 상태로 “트리거 버튼”을 누르면 호미삽이 일정 거리 앞으로 향합니다."
            + "\n  - 만약 호미삽이 “북주기 트리거”에 닿을 경우 (Enter 호출될 시) 흙의 양이 소폭 증가합니다."
            + "\n  - 5번 정도 트리거에 닿을 경우 해당 “북주기 트리거”는 비활성화됩니다.";
        dialogue[39= "end";
 
        // 벌레 잡기 & 감자 재배
        dialogue[40= "<HOW TO USE>\n"
            + "\n  - 맨손인 상태에서 “23점박이무당벌레”를 향하여 “트리거 버튼”을 누르면 병해충이 사라집니다."
            + "\n< HOW TO USE>\n"
            + "\n- 호미삽을 들고 다 자란 감자의 흙 부분에 있는 트리거를 5번 건들면 수확 완료";
        dialogue[41= "<HOW TO USE>\n"
            + "\n  - 맨손인 상태에서 “23점박이무당벌레”를 향하여 “트리거 버튼”을 누르면 병해충이 사라집니다."
            + "\n< HOW TO USE>\n"
            + "\n- 호미삽을 들고 다 자란 감자의 흙 부분에 있는 트리거를 5번 건들면 수확 완료";
        dialogue[42= "end";
 
 
 
        Button_SetActive(false);
    }
    private void Start()
    {
        NextDialogue();
    }
 
    public void talk_npc()
    {
        Button_SetActive(true);
        count =12;
        txt_Dialogue.text = dialogue[count];
    }
 
    private void NextDialogue()
    {
            txt_Dialogue.text = dialogue[count];
            count++;
    }
 
    public void onClick_feature()  // 감자 특징 알아보기 
    {
        isDialogue = true;
        Button_SetActive(false);
        count = 15;
        npc_talk_int = 0;
        if (count < dialogue.Length)
            NextDialogue();
 
    }
    public void onClick_learning() // 감자 키우는법 학습하기
    {
        Button_SetActive(false);
        npc_talk_int = 0;
        txt_Dialogue.text = "";
        panel.SetActive(true);
 
    }
    public void onClick_tip_1() // 플레이어 이동 & 비료주기
    {
        panel.SetActive(false);
        isDialogue = true;
        count = 26;
        npc_talk_int = 0;
        if (count < dialogue.Length)
            NextDialogue();
    }
 
    public void onClick_tip_2() // 삽 & 모종삽 사용하기
    {
        panel.SetActive(false);
        isDialogue = true;
        count = 29;
        npc_talk_int = 0;
        if (count < dialogue.Length)
            NextDialogue();
    }
    public void onClick_tip_exit() // 학습하기 창에서 나가기 클릭
    {
        panel.SetActive(false);
        npc_talk_int = 1;
    }
 
 
 
    public void Button_SetActive(bool set)
    {
        button_1.gameObject.SetActive(set);
        button_2.gameObject.SetActive(set);
        button_3.gameObject.SetActive(set);
    }
 
    void Update()
    {
        // 감자 키우는법 학습하기 클릭시
        if (Input.GetKeyDown(KeyCode.Keypad1))
        {
            if (button_1.gameObject.activeSelf == true)
            {
                button_1.onClick.Invoke();
            }
        }
        // 감자 특징 알아보기 클릭시
        else if (Input.GetKeyDown(KeyCode.Keypad3))
        {
            if (button_3.gameObject.activeSelf == true)
            {
                button_3.onClick.Invoke();
 
            }
        }
        // 플레이어 이동 & 비료주기
        else if (Input.GetKeyDown(KeyCode.Keypad7))
        {
            if (tip_button_1.gameObject.activeSelf == true && npc_talk_int !=1)
            {
                tip_button_1.onClick.Invoke();
 
            }
        }
        // 나가기
        else if (Input.GetKeyDown(KeyCode.Keypad8))
        {
            if (tip_button_exit.gameObject.activeSelf == true)
            {
                tip_button_exit.onClick.Invoke();
 
            }
        }
        // 모종삽 이용하기
        else if (Input.GetKeyDown(KeyCode.Keypad9))
        {
            if (tip_button_2.gameObject.activeSelf == true && npc_talk_int != 1)
            {
                tip_button_2.onClick.Invoke();
 
            }
        }
 
 
 
 
        if (npc_talk_int == 1)
        {
            isDialogue = false;
            talk_npc();
        }
 
 
        if (isDialogue && dialogue[count] != null)
        {
            
            if(dialogue[count].Equals("end"))
            {
                npc_talk_int = 1;
            }
            else if (Input.GetKeyDown(KeyCode.G))
            {
                if (count < dialogue.Length)
                    NextDialogue();
            }
 
 
            //if (OVRInput.GetDown(OVRInput.Button.One))
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

위의 코드에서 아래의 변수가 추가되었습니다.

아래의 변수는 새로생긴 패널의 버튼입니다.

 

public Button tip_button_1; // 이동 방법 & 비료 뿌리기

public Button tip_button_2; // 삽 & 모종삽 사용하기

public Button tip_button_exit; // 나가기

 

 

3가지 버튼으로 재대로 코드가 작성되었는지 유니티를 실행하였을 때 되는지 확인하였습니다.

잘 되는 것으로 확인 되었고 나머지 버튼들을 눌렀을 때 함수를 구현하진 않았지만 배열에 필요한 팁의 내용들을 

포함하였습니다.

 

버튼들의 onClick()함수 적용을 위해 간단한 설명을 추가하겠습니다.

간단히 아래의 메소드에서 count 만 각 대본이 있는 위치로 변경하면 모든 버튼을 사용할 수 있습니다.

아래의 메소드의 count = 29; 는 삽 & 모종삽 사용하기 대화가 저장되어 있는 곳입니다.

대화가 끝나면 dialogue에 "end" 값이 들어가 있는데 이를 update에 있는 함수가 인식하여 대화가 자동으로

메인 창으로 가도록 설계되있습니다.

 

 public void onClick_tip_2() // 삽 & 모종삽 사용하기

    {

        panel.SetActive(false);

        isDialogue = true;

        count = 29;

        npc_talk_int = 0;

        if (count < dialogue.Length)

            NextDialogue();

    }

+ Recent posts