前提
閲覧ありがとうございます。初めて質問をさせて頂きます。
現在、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で大量の字幕を表示する際に自動で実装できるので大変便利です。
ありがとうございました。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/17 05:54