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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

3回答

1163閲覧

【Unity】ScriptableObjectのString[]へテキストファイルから自動でテキストを読み込む方法

MARSHMAC

総合スコア1

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2022/07/16 09:38

編集2022/07/17 06:11

前提

閲覧ありがとうございます。初めて質問をさせて頂きます。

現在、UnityのTimelineを使用した、キャラクターのドラマシーンを制作しています。
その中で、字幕の表示を行いたいと考えています。
使用しているUnityバージョンは2020.3.25fです。

実現したいこと

https://tsubakit1.hateblo.jp/entry/2018/08/26/173345

こちらのサイトを参考に、Timelineで字幕表示を実装しました。
しかし、現状ではクリップに一つずつテキストを書いていく必要があり、この手作業を自動化できないのかと試行錯誤をしています。既に、テキストファイルで字幕の内容は用意しています。

そこで質問があります。
テキストファイルから文章を自動で一行ずつ抽出し、string[] に格納する方法はありませんでしょうか?
いくつか方法を試してみましたが、実現できませんでした。

当方、Unity初心者のため何か見落とし等があるのか、もしくは、Unityにはそういった機能は無く、実装不可能なのかと考えています。

初めての質問のため、至らない点などがありましたら申し訳ありません。
ご回答頂ければ幸いです。よろしくお願いします。

該当のソースコード

https://tsubakit1.hateblo.jp/entry/2018/08/26/173345 様から引用させて頂いています。

Messages

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5using System. IO; 6 7[CreateAssetMenu] 8public class Messages : ScriptableObject 9{ 10// List<String> stringList = new List<String>(){"r","f"}; 11 public string[] texts; 12}

Subtitle2Behaviour

1using System; 2using UnityEngine.Playables; 3 4[Serializable] 5public class Subtitle2Behaviour : PlayableBehaviour{}

Subtitle2Clip

1using System; 2using UnityEngine; 3using UnityEngine.Playables; 4using UnityEngine.Timeline; 5 6[Serializable] 7public class Subtitle2Clip : PlayableAsset, ITimelineClipAsset 8{ 9 public ClipCaps clipCaps { 10 get { return ClipCaps.None; } 11 } 12 13 public override Playable CreatePlayable (PlayableGraph graph, GameObject owner) 14 { 15 var playable = ScriptPlayable<Subtitle2Behaviour>.Create (graph); 16 return playable; 17 } 18}

Subtitle2MixerBehaviour

1using UnityEngine.Playables; 2 3public class Subtitle2MixerBehaviour : PlayableBehaviour 4{ 5 const string defaultText = ""; 6 7 public override void ProcessFrame(Playable playable, FrameData info, object playerData) 8 { 9 var m_TrackBinding = playerData as TimelineLabel; 10 11 if (m_TrackBinding == null) 12 return; 13 14 int inputCount = playable.GetInputCount (); 15 16 string message = defaultText; 17 18 int start = 0; 19 for (int i = start; i < inputCount; i++) 20 { 21 float inputWeight = playable.GetInputWeight(i); 22 if( inputWeight > 0) 23 { 24 var inputPlayable = (ScriptPlayable<Subtitle2Behaviour>)playable.GetInput(i); 25 message = m_TrackBinding.message.texts[i]; 26 break; 27 }else{ 28 continue; 29 } 30 } 31 32 m_TrackBinding.label.text = message; 33 } 34}

Subtitle2Track

1using UnityEngine; 2using UnityEngine.Playables; 3using UnityEngine.Timeline; 4using UnityEngine.UI; 5 6[TrackColor(0.8207547f, 0.367791f, 0.5062218f)] 7[TrackClipType(typeof(Subtitle2Clip))] 8[TrackBindingType(typeof(TimelineLabel))] 9public class Subtitle2Track : TrackAsset 10{ 11 public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount) 12 { 13 return ScriptPlayable<Subtitle2MixerBehaviour>.Create (graph, inputCount); 14 } 15 16 public override void GatherProperties (PlayableDirector director, IPropertyCollector driver) 17 { 18#if UNITY_EDITOR 19 var trackBinding = ((TimelineLabel)director.GetGenericBinding(this)).label.gameObject; 20 if (trackBinding == null) 21 return; 22 23 driver.AddFromName<Text>(trackBinding.gameObject, "m_Text"); 24#endif 25 base.GatherProperties (director, driver); 26 } 27}

TimelineLabel

1using UnityEngine; 2using UnityEngine.UI; 3 4public class TimelineLabel : MonoBehaviour 5{ 6 public Text label; 7 public Messages message; 8}

試したこと

①:ScriptableObjectに格納するためにList<String>で宣言してみる。
②:using Systemが不足している。
③:テキストファイルをCSVにしてScriptableObjectに格納する。
④:元々の制作者様SNSにメッセージを送るが、一ヶ月以上返信無し。

補足情報

TimelinePlayableWizardで制作したPlayableNameは「Subtitle2」

イメージ説明

現状の実装風景
Texts[]の+を押せば、Element 0、Elements 1、Elements 2、と増えていきます。

イメージ説明

こちらの赤い丸の部分に、例えば、

1行目:テスト中
2行目:よろしくお願いします

というテキストファイルを、UnityProject内に入れて自動で格納できませんでしょうか?(画像では手入力しました)

イメージ説明

解決方法

Bongo様の回答で解決しました。
他の方のお役に立てばと思い、実装方法をまとめておきます。
なお、既に上記サイト様にて一通りの実装を終えているものとします。

①:テキストファイル(.txt)を用意する。(ここでは test.txt)

イメージ説明

②:UnityPoject内にインポートする。

イメージ説明

③:Bongo様のスクリプト『MessagesImporter』をEditorファイル内にインポートする。

イメージ説明

④:show Explorerでテキストファイルの拡張子をmessagesに変更。(ここでは test.messages)

イメージ説明

⑤:Canvas TextのTimeline LabelのMessageに④を入れる。

イメージ説明

⑥:完成。

イメージ説明

この手法なら、Timelineで大量の字幕を表示する際に自動で実装できるので大変便利です。
ありがとうございました。

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

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

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

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

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

guest

回答3

0

ベストアンサー

ご参考になさった「【Unity】新・Timelineで字幕を作る - テラシュールブログ」の記事中でちょこっと言及されている...

この文章データはScriptedImporter等で作るのが良いんじゃないかなと思います。もしくはExcelで作るとか。

というのも一案かと思います。たとえばプロジェクト内にEditorフォルダを作って、下記のようなMessagesImporter.csスクリプトを入れておいて...

C#

1using System.IO; 2using UnityEditor.AssetImporters; 3using UnityEngine; 4 5[ScriptedImporter(1, "messages")] 6public class MessagesImporter : ScriptedImporter 7{ 8 public override void OnImportAsset(AssetImportContext ctx) 9 { 10 var messages = ScriptableObject.CreateInstance<Messages>(); 11 messages.texts = File.ReadAllLines(ctx.assetPath); 12 ctx.AddObjectToAsset("Messages", messages); 13 ctx.SetMainObject(messages); 14 } 15}

拡張子を「messages」に変えたテキストファイルをプロジェクト内に入れたところ、Unity上では下図のように見えました。

図

投稿2022/07/16 22:22

Bongo

総合スコア10807

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

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

MARSHMAC

2022/07/17 05:54

回答ありがとうございます。 Bongo様の回答通りのプログラムと手法で試しましたところ、見事、実現したい通りに実装できました。 膨大なテキスト量に唖然とし、半ば諦めていたので非常に助かりました。 重ねて感謝申し上げます。ありがとうございました。
guest

0

一番手っ取り早いのはテキストファイル(拡張子は.txt)をAssetのResourcesに登録し、
Resources.Loadでロードして.textを改行文字でsplit(分割)することでしょうか。

投稿2022/07/16 11:23

RiaFeed

総合スコア2701

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

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

MARSHMAC

2022/07/16 14:05

回答ありがとうございます。 まったく想像もできない手法ですが、試行錯誤をしてみたいと思います。
RiaFeed

2022/07/16 22:40 編集

改行文字でsplit以外は一応Unityの基本中の基本の手法ですので resources.load テキストアセットあたりでググってみてください。
guest

0

投稿2022/07/16 14:47

y_waiwai

総合スコア87774

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

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

Zuishin

2022/07/16 17:23

ありますが、ファイル名をどうやって取得するつもりですか?
MARSHMAC

2022/07/17 05:55

回答ありがとうございます。 Bongo様の手法で解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問