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

回答編集履歴

2

ソース修正

2021/06/30 07:23

投稿

hogefugapiyo
hogefugapiyo

スコア3307

answer CHANGED
@@ -32,4 +32,66 @@
32
32
 
33
33
  スクリプトでの実装法は色々あると思いますが、たとえばGameObject型のListを作って。そこにお知らせをAddしていきます。スクロールするのは常にListの1番目(indexだと0)のお知らせにします。お知らせが画面外に出たらListからRemoveします。
34
34
 
35
- もしお知らせの内容がテキストで、そのメッセージが違うだけならPrefabは1個を再利用できる可能性もあります。Destroyするのではなく最初の位置に戻してテキストだけ変更して再度流すといった形ですね。
35
+ もしお知らせの内容がテキストで、そのメッセージが違うだけならPrefabは1個を再利用できる可能性もあります。Destroyするのではなく最初の位置に戻してテキストだけ変更して再度流すといった形ですね。
36
+
37
+ #追記
38
+ UI Canvas上で動かすのかなと思ってスタックの例を作ってみました。
39
+ Canvas上の適当なオブジェクトにアタッチして実行すると動きます(PrefabにはただのTextを入れておいてもらえればOKです)
40
+ A/B/Cキーを押すとお知らせがどんどん追加されて順番に流れていきます。
41
+
42
+ ```cs
43
+ using System.Collections;
44
+ using System.Collections.Generic;
45
+ using UnityEngine;
46
+ using UnityEngine.UI;
47
+
48
+ public class OshiraseManager : MonoBehaviour {
49
+
50
+ [SerializeField] GameObject oshirasePrefab; // ただのTextをPrefabにしたもの
51
+ List<GameObject> oshiraseQueue = new List<GameObject>(); // お知らせを順番にスタックする入れ物
52
+
53
+ float textScrollSpeed = 250;
54
+ float limitPosition = -800;
55
+
56
+ void Update() {
57
+
58
+ // デバッグ用 - A/B/C ボタンを押すとメッセージが流れる
59
+ if (Input.GetKeyDown(KeyCode.A)) {
60
+ CreateNewOshirase("ショップに新しい商品が入荷しました!");
61
+ }else if (Input.GetKeyDown(KeyCode.B)) {
62
+ CreateNewOshirase("【緊急クエスト】<テラテイルの戦い>が限定開放中です(残り1時間)");
63
+ } else if (Input.GetKeyDown(KeyCode.C)) {
64
+ CreateNewOshirase("【お知らせ】2021/12/12 午後1時よりサーバーメンテナンスを行います");
65
+ }
66
+
67
+ // スクロール処理
68
+ if (oshiraseQueue.Count >= 1) {
69
+
70
+ var _rect = oshiraseQueue[0].GetComponent<RectTransform>(); // Updateで毎回GetComponentはあんまりよろしくない
71
+
72
+ _rect.anchoredPosition =
73
+ new Vector3(_rect.anchoredPosition.x - textScrollSpeed * Time.deltaTime,
74
+ _rect.anchoredPosition.y);
75
+
76
+ // 画面外処理(仮)
77
+ if(_rect.anchoredPosition.x <= limitPosition) {
78
+ Destroy(oshiraseQueue[0]);
79
+ oshiraseQueue.RemoveAt(0);
80
+ }
81
+ }
82
+
83
+ }
84
+
85
+ void CreateNewOshirase(string _msg) {
86
+ var _obj = Instantiate(oshirasePrefab, Vector3.zero, Quaternion.identity);
87
+ var _rect = _obj.GetComponent<RectTransform>();
88
+
89
+ _obj.GetComponent<Text>().text = _msg;
90
+ _obj.transform.SetParent(this.transform, false);
91
+ _rect.anchoredPosition = new Vector2(800,0); // UI上のオブジェクトを動かしたいのでanchoredPositionを使う
92
+
93
+ oshiraseQueue.Add(_obj); // 新しいお知らせなのでスタックに積む
94
+ }
95
+ }
96
+
97
+ ```

1

補足

2021/06/30 07:23

投稿

hogefugapiyo
hogefugapiyo

スコア3307

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