回答編集履歴

2

ソース修正

2021/06/30 07:23

投稿

hogefugapiyo
hogefugapiyo

スコア3302

test CHANGED
@@ -67,3 +67,127 @@
67
67
 
68
68
 
69
69
  もしお知らせの内容がテキストで、そのメッセージが違うだけならPrefabは1個を再利用できる可能性もあります。Destroyするのではなく最初の位置に戻してテキストだけ変更して再度流すといった形ですね。
70
+
71
+
72
+
73
+ #追記
74
+
75
+ UI Canvas上で動かすのかなと思ってスタックの例を作ってみました。
76
+
77
+ Canvas上の適当なオブジェクトにアタッチして実行すると動きます(PrefabにはただのTextを入れておいてもらえればOKです)
78
+
79
+ A/B/Cキーを押すとお知らせがどんどん追加されて順番に流れていきます。
80
+
81
+
82
+
83
+ ```cs
84
+
85
+ using System.Collections;
86
+
87
+ using System.Collections.Generic;
88
+
89
+ using UnityEngine;
90
+
91
+ using UnityEngine.UI;
92
+
93
+
94
+
95
+ public class OshiraseManager : MonoBehaviour {
96
+
97
+
98
+
99
+ [SerializeField] GameObject oshirasePrefab; // ただのTextをPrefabにしたもの
100
+
101
+ List<GameObject> oshiraseQueue = new List<GameObject>(); // お知らせを順番にスタックする入れ物
102
+
103
+
104
+
105
+ float textScrollSpeed = 250;
106
+
107
+ float limitPosition = -800;
108
+
109
+
110
+
111
+ void Update() {
112
+
113
+
114
+
115
+ // デバッグ用 - A/B/C ボタンを押すとメッセージが流れる
116
+
117
+ if (Input.GetKeyDown(KeyCode.A)) {
118
+
119
+ CreateNewOshirase("ショップに新しい商品が入荷しました!");
120
+
121
+ }else if (Input.GetKeyDown(KeyCode.B)) {
122
+
123
+ CreateNewOshirase("【緊急クエスト】<テラテイルの戦い>が限定開放中です(残り1時間)");
124
+
125
+ } else if (Input.GetKeyDown(KeyCode.C)) {
126
+
127
+ CreateNewOshirase("【お知らせ】2021/12/12 午後1時よりサーバーメンテナンスを行います");
128
+
129
+ }
130
+
131
+
132
+
133
+ // スクロール処理
134
+
135
+ if (oshiraseQueue.Count >= 1) {
136
+
137
+
138
+
139
+ var _rect = oshiraseQueue[0].GetComponent<RectTransform>(); // Updateで毎回GetComponentはあんまりよろしくない
140
+
141
+
142
+
143
+ _rect.anchoredPosition =
144
+
145
+ new Vector3(_rect.anchoredPosition.x - textScrollSpeed * Time.deltaTime,
146
+
147
+ _rect.anchoredPosition.y);
148
+
149
+
150
+
151
+ // 画面外処理(仮)
152
+
153
+ if(_rect.anchoredPosition.x <= limitPosition) {
154
+
155
+ Destroy(oshiraseQueue[0]);
156
+
157
+ oshiraseQueue.RemoveAt(0);
158
+
159
+ }
160
+
161
+ }
162
+
163
+
164
+
165
+ }
166
+
167
+
168
+
169
+ void CreateNewOshirase(string _msg) {
170
+
171
+ var _obj = Instantiate(oshirasePrefab, Vector3.zero, Quaternion.identity);
172
+
173
+ var _rect = _obj.GetComponent<RectTransform>();
174
+
175
+
176
+
177
+ _obj.GetComponent<Text>().text = _msg;
178
+
179
+ _obj.transform.SetParent(this.transform, false);
180
+
181
+ _rect.anchoredPosition = new Vector2(800,0); // UI上のオブジェクトを動かしたいのでanchoredPositionを使う
182
+
183
+
184
+
185
+ oshiraseQueue.Add(_obj); // 新しいお知らせなのでスタックに積む
186
+
187
+ }
188
+
189
+ }
190
+
191
+
192
+
193
+ ```

1

補足

2021/06/30 07:23

投稿

hogefugapiyo
hogefugapiyo

スコア3302

test CHANGED
@@ -3,6 +3,26 @@
3
3
 
4
4
 
5
5
  あと関係ありそうなコードはMarkdownで記述したほうが回答を得られやすいと思います。省略箇所が多いと回答者が手元で再現したりできなくなって回答を得られる可能性が下がります。
6
+
7
+
8
+
9
+ ・・・
10
+
11
+
12
+
13
+ ちなみに、UI的なものをAからBまで動かすとか明確に決まってるなら私ならDOTweenとかでやっちゃうと思います。すごい便利で簡単なので、もし少し学習コスト割いても良いと思えたらおすすめです
14
+
15
+
16
+
17
+ とりあえずDOTweenで動かしてみる
18
+
19
+ [https://zenn.dev/ohbashunsuke/books/20200924-dotween-complete/viewer/4](https://zenn.dev/ohbashunsuke/books/20200924-dotween-complete/viewer/4)
20
+
21
+
22
+
23
+ 【Unity】DOTween のメソッド紹介&使い方を簡易解説!【GIF付き】
24
+
25
+ [https://www.midnightunity.net/unity-dotween-summary/](https://www.midnightunity.net/unity-dotween-summary/)
6
26
 
7
27
 
8
28