teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

11

文法の修正

2022/01/09 07:35

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
File without changes
body CHANGED
@@ -132,7 +132,7 @@
132
132
 
133
133
  elapsedTime += Time.deltaTime;// 経過時間に時間の経過分足す
134
134
 
135
- //ここから左クリックして一気に表示させる処理
135
+ //ここからエンターキーを押して一気に表示させる処理
136
136
  if (Input.GetKeyDown(KeyCode.Return))// もし、メッセージ表示中にエンターキーが押されたら、
137
137
  {
138
138
  var allText = messageText.text;// allTextに、文字を入れる
@@ -159,7 +159,7 @@
159
159
  }
160
160
  }
161
161
 
162
- else// エンターがされていなければ、
162
+ else// エンターキーされていなければ、
163
163
  {
164
164
  elapsedTime += Time.deltaTime;// 経過時間に時間の経過分足す
165
165
 

10

文法の修正

2022/01/09 07:35

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
File without changes
body CHANGED
@@ -133,7 +133,7 @@
133
133
  elapsedTime += Time.deltaTime;// 経過時間に時間の経過分足す
134
134
 
135
135
  //ここから左クリックして一気に表示させる処理
136
- if (Input.GetKeyDown(KeyCode.Return))// もし、メッセージ表示中に左クリックされたら、
136
+ if (Input.GetKeyDown(KeyCode.Return))// もし、メッセージ表示中にエンターキーが押されたら、
137
137
  {
138
138
  var allText = messageText.text;// allTextに、文字を入れる
139
139
 
@@ -170,7 +170,7 @@
170
170
  }
171
171
 
172
172
  // クリックされたら次の文字を表示する処理
173
- if (Input.GetKeyDown(KeyCode.Return))// もし、クリックされたら、
173
+ if (Input.GetKeyDown(KeyCode.Return))// もし、エンターキーが押されたら、
174
174
  {
175
175
  messageText.text = "";// メッセージを空白にする
176
176
  nowLine = 0;// 今の行を0にする

9

文法の修正

2022/01/09 07:32

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
File without changes
body CHANGED
@@ -159,7 +159,7 @@
159
159
  }
160
160
  }
161
161
 
162
- else// クリックされていなければ、
162
+ else// エンターがされていなければ、
163
163
  {
164
164
  elapsedTime += Time.deltaTime;// 経過時間に時間の経過分足す
165
165
 

8

書式の改善、文法の改善、スクリプトの情報追加

2022/01/09 07:10

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
File without changes
body CHANGED
@@ -13,6 +13,8 @@
13
13
  困っているので、お助け願います。
14
14
 
15
15
  よろしくお願いいたします。
16
+
17
+ ###モブキャラの会話発生スクリプト
16
18
  ```c#
17
19
  using UnityEngine;
18
20
  using System.Collections;
@@ -59,4 +61,159 @@
59
61
  messageScript.SetMessagePanel(Conversation);// messageScriptのSetMessagePanelを実行する
60
62
  }
61
63
  }
64
+ ```
65
+ ###セリフと吹き出しの制御スクリプト
66
+
67
+ ```C#
68
+ using UnityEngine;
69
+ using System.Collections;
70
+ using UnityEngine.UI;// UI機能を使用するために追記
71
+
72
+ public class Message : MonoBehaviour
73
+ {
74
+ public bool isActive;// Canvasの表示非表示
75
+ public GameObject canvas;// 使用するCanvas
76
+ public Text messageText;// メッセージを表示する文字
77
+ private string message;// 表示するメッセージ
78
+ [SerializeField]
79
+ private int maxTextLength = 400;// 1回のメッセージの最大文字数
80
+ private int textLength = 0;// 1回のメッセージの現在の文字数
81
+ [SerializeField]
82
+ private int maxLine = 3;// メッセージの最大行数
83
+ private int nowLine = 0;// 現在の行
84
+ [SerializeField]
85
+ private float textSpeed = 0.05f;// テキストスピード
86
+ private float elapsedTime = 0f;// 経過時間
87
+ private int nowTextNum = 0;// 今見ている文字番号
88
+ private Image clickIcon;// マウスクリックを促すアイコン
89
+ [SerializeField]
90
+ private float clickFlashTime = 0.2f;// クリックアイコンの点滅秒数
91
+ private bool isOneMessage = false;// 1回分のメッセージを表示したかどうか
92
+ private bool isEndMessage = false;// メッセージをすべて表示したかどうか
93
+ private string[] conversation;// 会話
94
+ private int i = 0;// 文字列の列
95
+ private int stringsCount = 0;// 文字列の総行数
96
+
97
+ void Start()
98
+ {
99
+ gameObject.SetActive(true);// このオブジェクトを表示する
100
+ clickIcon = canvas.transform.Find("Panel/Image").GetComponent<Image>();// clickIconをキャンバスの中のPanelの中のImageにする
101
+ clickIcon.enabled = false;// clickIconのコンポーネントをオフにする
102
+ messageText.text = "";// 文字を空白にする
103
+ }
104
+
105
+ void Update()
106
+ {
107
+ if (isEndMessage || message == null)// もし、メッセージが終わっていない、または設定されているなら
108
+ {
109
+ return;// 返す
110
+ }
111
+
112
+ if (!isOneMessage)// もし、1回に表示するメッセージを表示していなくて、
113
+ {
114
+ if (elapsedTime >= textSpeed)// テキスト表示時間が経過したら、
115
+ {
116
+ messageText.text += message[nowTextNum];// 次の文字番号にする
117
+
118
+ if (message[nowTextNum] == '\n')// もし、改行文字だったら
119
+ {
120
+ nowLine++;// 行数を足す
121
+ }
122
+
123
+ nowTextNum++;// 次の文字番号にする
124
+ textLength++;// 次の文字数にする
125
+ elapsedTime = 0f;// 経過時間を0にする
126
+
127
+ if (nowTextNum >= message.Length || textLength >= maxTextLength || nowLine >= maxLine)// もし、メッセージを全部表示、または行数が最大数表示されたなら、
128
+ {
129
+ isOneMessage = true;// isOneMessageをtrueにする
130
+ }
131
+ }
132
+
133
+ elapsedTime += Time.deltaTime;// 経過時間に時間の経過分足す
134
+
135
+ //ここから左クリックして一気に表示させる処理
136
+ if (Input.GetKeyDown(KeyCode.Return))// もし、メッセージ表示中に左クリックされたら、
137
+ {
138
+ var allText = messageText.text;// allTextに、文字を入れる
139
+
140
+ for (var i = nowTextNum; i < message.Length; i++)// 表示するメッセージ文繰り返す
141
+ {
142
+ allText += message[i];//allTextに表示するi番目のメッセージを足す
143
+
144
+ if (message[i] == '\n')// もし、改行文字だったら、
145
+ {
146
+ nowLine++;// 今の行に一行足す
147
+ }
148
+
149
+ nowTextNum++;// 次の文字番号にする
150
+ textLength++;// 次の文字数にする
151
+
152
+ if (nowTextNum >= message.Length || textLength >= maxTextLength || nowLine >= maxLine)// もし、メッセージがすべて表示される、または1回表示限度を超えたなら、
153
+ {
154
+ messageText.text = allText;// messageTextをallTextにする
155
+ isOneMessage = true;// isOneMessageをtrueにする
156
+ break;// 処理を止める
157
+ }
158
+ }
159
+ }
160
+ }
161
+
162
+ else// クリックされていなければ、
163
+ {
164
+ elapsedTime += Time.deltaTime;// 経過時間に時間の経過分足す
165
+
166
+ if (elapsedTime >= clickFlashTime)// クリックアイコンを点滅する時間を超えたなら、
167
+ {
168
+ clickIcon.enabled = !clickIcon.enabled;// クリックアイコンを点滅させる
169
+ elapsedTime = 0f;// 経過時間を0にする
170
+ }
171
+
172
+ // クリックされたら次の文字を表示する処理
173
+ if (Input.GetKeyDown(KeyCode.Return))// もし、クリックされたら、
174
+ {
175
+ messageText.text = "";// メッセージを空白にする
176
+ nowLine = 0;// 今の行を0にする
177
+ clickIcon.enabled = false;// クリックアイコンをオフにする
178
+ elapsedTime = 0f;// 経過時間を0にする
179
+ textLength = 0;// 文字数を0にする
180
+ isOneMessage = false;// isOneMessageを0にする
181
+
182
+ if (nowTextNum >= message.Length)// もし、メッセージが全部表示されていたら、
183
+ {
184
+ nowTextNum = 0;// 現在の文字番号を0にする
185
+
186
+ if (i == stringsCount - 1)// もし、文字列の総行数に達したら、
187
+ {
188
+ isEndMessage = true;// isEndMessageをtrueにする
189
+ canvas.transform.GetChild(0).gameObject.SetActive(false);// キャンバスの子オブジェクトを非表示にする
190
+ }
191
+
192
+ else// もし、文字列の総行数に達していなければ、
193
+ {
194
+ i++; //iを1増やす
195
+ SetMessage(conversation[i]);// SetMessageを実行する
196
+ }
197
+ }
198
+ }
199
+ }
200
+ }
201
+
202
+ void SetMessage(string message)// SetMessage
203
+ {
204
+ this.message = message;// このオブジェクトのmessageをmessageにする
205
+ }
206
+
207
+ public void SetMessagePanel(string[] message)// SetMessagePanel
208
+ {
209
+ i = 0;// iを0にする
210
+ stringsCount = message.Length;// 文字列の総行数をmessageの要素数にする
211
+ conversation = message;// coversationをmessageにする
212
+ canvas.SetActive(true);// キャンバスを表示する
213
+ SetMessage(conversation[0]);// SetMessageを実行する
214
+ canvas.transform.GetChild(1).gameObject.SetActive(true);// キャンバスの子オブジェクトを表示する
215
+ isEndMessage = false;// isEndMessageをfalseにする
216
+ }
217
+ }
218
+
62
219
  ```

7

文法の修正

2022/01/09 06:51

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,6 @@
1
1
  ###【要望】キャラに触れたら会話発生→会話が終わる→キャラに触れたらまた会話発生...のように、ループさせたい
2
2
  下記スクリプトは、
3
- プレイヤーが、フィールド内に立っているモブキャラクターに触れると吹き出しとセリフが表示される仕組みになっています(`OnCollisionEnter`)。
3
+ プレイヤーが、フィールド内に立っているモブキャラクターに触れると吹き出しとセリフが表示される仕組みになっています(コライダー同士の当たり判定によって会話が発生`OnCollisionEnter`)。
4
4
  **プレイヤーがモブに触れるたびに、吹き出しとセリフとが繰り返し表示されるようにコルーチンをループさせたい**
5
5
  のですが、
6
6
  処理をループさせるには`void Update()`メソッドに何か書かなければいけないと思うのですが、

6

文法の修正

2022/01/08 19:39

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
@@ -1,1 +1,1 @@
1
- 【Unity3D】キャラの会話が一度しか実行されない
1
+ 【Unity3D】キャラの会話が一度しかできない
body CHANGED
File without changes

5

文法の修正

2022/01/08 19:37

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- ###【要望】キャラに触れるたルーチンをループさせたい
1
+ ###【要望】キャラに触れたら会話発生→会話が終わ→キャラに触れらまた会話発生...のように、ループさせたい
2
2
  下記スクリプトは、
3
3
  プレイヤーが、フィールド内に立っているモブキャラクターに触れると吹き出しとセリフが表示される仕組みになっています(`OnCollisionEnter`)。
4
4
  **プレイヤーがモブに触れるたびに、吹き出しとセリフとが繰り返し表示されるようにコルーチンをループさせたい**

4

文法の修正

2022/01/08 19:36

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
@@ -1,1 +1,1 @@
1
- 【Unity3D】キャラの会話コルーチンが一度しか実行されない
1
+ 【Unity3D】キャラの会話が一度しか実行されない
body CHANGED
@@ -3,7 +3,8 @@
3
3
  プレイヤーが、フィールド内に立っているモブキャラクターに触れると吹き出しとセリフが表示される仕組みになっています(`OnCollisionEnter`)。
4
4
  **プレイヤーがモブに触れるたびに、吹き出しとセリフとが繰り返し表示されるようにコルーチンをループさせたい**
5
5
  のですが、
6
- 方法探しても見つないのでどなたか教えていただけないでしょか?
6
+ 処理ループさせるには`void Update()`メソッドに何書かければいけないと思のですが、
7
+ 思いつきません。
7
8
 
8
9
  現状、コルーチンは一度しか実行されず、2回目以降、モブに触れてもセリフと吹き出しが一切表示されません。
9
10
 
@@ -28,6 +29,11 @@
28
29
  {
29
30
 
30
31
  }
32
+
33
+ void Update()
34
+ {
35
+
36
+ }
31
37
 
32
38
  void OnCollisionEnter(Collision col)
33
39
  {

3

文法の修正

2022/01/08 19:33

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
File without changes
body CHANGED
@@ -5,7 +5,7 @@
5
5
  のですが、
6
6
  方法を探しても見つからないのでどなたか教えていただけないでしょうか?
7
7
 
8
- 現状、コルーチンは一度しか実行されず、2回目以降、モブに触れてもセリフが表示されません。
8
+ 現状、コルーチンは一度しか実行されず、2回目以降、モブに触れてもセリフと吹き出し一切表示されません。
9
9
 
10
10
  新たなメソッドを作るか、あるいは`while`でループさせるという手法が適切なのか、
11
11
  また、どのようにコードを書き加えればいいのか、

2

文法の修正

2022/01/08 17:44

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  ###【要望】キャラに触れるたび、コルーチンをループさせたい
2
- 下記コードは、
2
+ 下記スクリプトは、
3
3
  プレイヤーが、フィールド内に立っているモブキャラクターに触れると吹き出しとセリフが表示される仕組みになっています(`OnCollisionEnter`)。
4
4
  **プレイヤーがモブに触れるたびに、吹き出しとセリフとが繰り返し表示されるようにコルーチンをループさせたい**
5
5
  のですが、

1

文法の修正

2022/01/08 17:43

投稿

AcrossKodez
AcrossKodez

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- ###【要望】オブジェクトに触れるたび、コルーチンをループさせたい
1
+ ###【要望】キャラに触れるたび、コルーチンをループさせたい
2
2
  下記コードは、
3
3
  プレイヤーが、フィールド内に立っているモブキャラクターに触れると吹き出しとセリフが表示される仕組みになっています(`OnCollisionEnter`)。
4
4
  **プレイヤーがモブに触れるたびに、吹き出しとセリフとが繰り返し表示されるようにコルーチンをループさせたい**