質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3093閲覧

Unity 右から左へ平行移動するテキスト

Matsuri_

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

0クリップ

投稿2021/06/29 13:21

編集2021/06/30 02:48

前提・実現したいこと

Unityにてゲームを作っています。
プレイ時にある条件を満たした際、
「お知らせA」「お知らせB」
のような文章が、画面上のパネルにお知らせテキストとして、
右から自動で流れてきて、左画面外へ消えるように
したいと思っています。
例えば、電光掲示板のような感じです。
条件はAとBで2種類あり、したがって流したいテキストもABの2種類です。
下記はゲーム画面のスクショ画像で、文字の流れるパネル部分です。
テキストパネル

発生している問題・エラーメッセージ

現在、右から左へと、テキストを動かすこと自体は成功しています。

いずれも以下の問題が発生しています。
・2回目に同じ条件を達成し、再び同じテキストが流れると、なぜか初回より速度が速くなってしまうこと
(同じ速度で流れてほしいです)
・AとBの条件を同時に満たした際、テキストが重なるようにして、かぶって出てきてしまうこと(下記画像参照ください)
テキストパネル2
(重ならずに流れてほしいです)

以上が解決できず、困っています。

該当のソースコード

public GameObject oshiraseprefabA;
public GameObject oshiraseprefabB;

private GameObject objA;
private GameObject objB;

・・・中略・・・
void Update()
{
if(gamemanager.oshirase == 1) //条件A
{
obj = Instantiate(oshiraseprefab, new Vector3(0f, 0f,0f), Quaternion.identity);
obj.transform.SetParent(this.transform);
obj.transform.position = new Vector3(10f, -4f);

MoveTextPanelA();
}

if(gamemanager.oshirase == 2) //条件B
{
objB = Instantiate(oshiraseprefabB, new Vector3(0f, 0f,0f), Quaternion.identity);
objB.transform.SetParent(this.transform);
objB.transform.position = new Vector3(10f, -4f);

MoveTextPanelB();
}
・・・中略・・・
void MoveTextPanelA()
{
if(obj == null)
{
return;
}
if (obj.transform.position.x >= limitPosition)
{
obj.transform.position = new Vector2(obj.transform.position.x - textScrollSpeed * Time.deltaTime, obj.transform.position.y);

}

  }

void MoveTextPanelB()
{
if (objB == null)
{
return;
}
if (objB.transform.position.x >= limitPosition)
{
objB.transform.position = new Vector2(objB.transform.position.x - textScrollSpeed * Time.deltaTime, objB.transform.position.y);
}

}

試したこと

条件を満たした際に、動くテキストですが、
1.テキストのプレハブをそれぞれ作り、動かす
2.最初からテキストA,Bのオブジェクトを画面外に配置しておいて、動かす
などの方法を試しました。
上記はプレハブを生み出して動かしているパターンです。
いずれにしても、上記の問題は発生します。

Updateメソッドでは、プレハブのX座標を引き算していくことで動かしています。

プレハブ自体には、画面外の座標に達したらDestroyする別のスクリプトをつけています。

テキストは同じ場所から流れるので、条件をほぼ同時に満たした際など、
何も処理をしなければ当然かぶってしまいます。が、
どこをどう直せばうまくいくのかわかりません。

また、流れる速度が速くなる問題については、上記のMoveTextPanelの
計算方法がまずいのではと思っていますが、
良い方法がわからず、解決できていません。

伝わりにくいかもしれませんが、よろしくお願いします。

Satokingy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

細かいですがobjAは定義されても使われていませんね。oshiraseprefabも存在していないかと思います。(たぶんAのミスだとは思いますが)

あと関係ありそうなコードはMarkdownで記述したほうが回答を得られやすいと思います。省略箇所が多いと回答者が手元で再現したりできなくなって回答を得られる可能性が下がります。

・・・

ちなみに、UI的なものをAからBまで動かすとか明確に決まってるなら私ならDOTweenとかでやっちゃうと思います。すごい便利で簡単なので、もし少し学習コスト割いても良いと思えたらおすすめです

とりあえずDOTweenで動かしてみる
https://zenn.dev/ohbashunsuke/books/20200924-dotween-complete/viewer/4

【Unity】DOTween のメソッド紹介&使い方を簡易解説!【GIF付き】
https://www.midnightunity.net/unity-dotween-summary/


重なり防止については、どうアプローチしたいかにもよるかなと思います。
電光掲示板では絶対に文字が重なりません。あれは複数の文字列があっても順番に出てくるからですね。

なのでキュー(Queue)みたいに、お知らせをスタックして
それを1個ずつ流していくというような電光掲示板っぽいやり方もいいかなと思います

例えば下記のように3つお知らせが流れることになったとします。

  1. お知らせA
  2. お知らせB
  3. お知らせC

一気に流すと3つ流れてしまうので、まずは最初にきたお知らせAを流します。
お知らせAが流れ終わった(この場合だとDestroy)ら、お知らせBを流し始めます。

スクリプトでの実装法は色々あると思いますが、たとえばGameObject型のListを作って。そこにお知らせをAddしていきます。スクロールするのは常にListの1番目(indexだと0)のお知らせにします。お知らせが画面外に出たらListからRemoveします。

もしお知らせの内容がテキストで、そのメッセージが違うだけならPrefabは1個を再利用できる可能性もあります。Destroyするのではなく最初の位置に戻してテキストだけ変更して再度流すといった形ですね。

#追記
UI Canvas上で動かすのかなと思ってスタックの例を作ってみました。
Canvas上の適当なオブジェクトにアタッチして実行すると動きます(PrefabにはただのTextを入れておいてもらえればOKです)
A/B/Cキーを押すとお知らせがどんどん追加されて順番に流れていきます。

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class OshiraseManager : MonoBehaviour { 7 8 [SerializeField] GameObject oshirasePrefab; // ただのTextをPrefabにしたもの 9 List<GameObject> oshiraseQueue = new List<GameObject>(); // お知らせを順番にスタックする入れ物 10 11 float textScrollSpeed = 250; 12 float limitPosition = -800; 13 14 void Update() { 15 16 // デバッグ用 - A/B/C ボタンを押すとメッセージが流れる 17 if (Input.GetKeyDown(KeyCode.A)) { 18 CreateNewOshirase("ショップに新しい商品が入荷しました!"); 19 }else if (Input.GetKeyDown(KeyCode.B)) { 20 CreateNewOshirase("【緊急クエスト】<テラテイルの戦い>が限定開放中です(残り1時間)"); 21 } else if (Input.GetKeyDown(KeyCode.C)) { 22 CreateNewOshirase("【お知らせ】2021/12/12 午後1時よりサーバーメンテナンスを行います"); 23 } 24 25 // スクロール処理 26 if (oshiraseQueue.Count >= 1) { 27 28 var _rect = oshiraseQueue[0].GetComponent<RectTransform>(); // Updateで毎回GetComponentはあんまりよろしくない 29 30 _rect.anchoredPosition = 31 new Vector3(_rect.anchoredPosition.x - textScrollSpeed * Time.deltaTime, 32 _rect.anchoredPosition.y); 33 34 // 画面外処理(仮) 35 if(_rect.anchoredPosition.x <= limitPosition) { 36 Destroy(oshiraseQueue[0]); 37 oshiraseQueue.RemoveAt(0); 38 } 39 } 40 41 } 42 43 void CreateNewOshirase(string _msg) { 44 var _obj = Instantiate(oshirasePrefab, Vector3.zero, Quaternion.identity); 45 var _rect = _obj.GetComponent<RectTransform>(); 46 47 _obj.GetComponent<Text>().text = _msg; 48 _obj.transform.SetParent(this.transform, false); 49 _rect.anchoredPosition = new Vector2(800,0); // UI上のオブジェクトを動かしたいのでanchoredPositionを使う 50 51 oshiraseQueue.Add(_obj); // 新しいお知らせなのでスタックに積む 52 } 53} 54

投稿2021/06/30 04:01

編集2021/06/30 07:23
hogefugapiyo

総合スコア3302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Matsuri_

2021/06/30 06:18 編集

丁寧にご回答いただき、ありがとうございます。 マークダウン、調べてみます。 上記の指摘(objA,oshirasePrefab)は表記ミスです。申し訳ないです。 さっそく、Listを使って記述してみます。
Matsuri_

2021/06/30 16:11 編集

コードまで書いて頂き、大変お手数おかけしました。 上記の追記に従って、やってみたところ、うまくいきました。 解決できずにいた、文字の重なりも速度も問題なく動いています。 大変感謝です。 なぜ自分の書いたものでうまくいかなかったのか、 これからの勉強でわかっていけるといいなと思います。。 本当にありがとうございました!
Matsuri_

2021/07/01 02:51

またDOTweenなども色々と教えて頂き、ありがとうございました。見てみます。大変お世話になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問