自己制作

最初の"GamaManager.cs"の状態を以下に示す.

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System.Collections;

// MonoBehaviourを継承することでオブジェクトにコンポーネントとして
// アタッチすることができるようになる
public class GameManager : MonoBehaviour{
 // SerializeFieldと書くとprivateなパラメーターでも
 // インスペクター上で値を変更できる
 [SerializeField]
 private Text mainText;
 [SerializeField]
 private Text nameText;
 [SerializeField]
 private float captionSpeed = 0.2f;
 [SerializeField]
  private GameObject nextPageIcon;
  [SerializeField]
  private Image backgroundImage;
  [SerializeField]
  private string spritesDirectory = "Sprites/";

 
 // パラメーターを追加
  private const char SEPARATE_MAIN_START = '「';
  private const char SEPARATE_MAIN_END = '」';
  private Queue<char> _charQueue;
  private const char SEPARATE_PAGE = '&';
  private Queue<string> _pageQueue;
  private const char SEPARATE_COMMAND = '!';
  private const char COMMAND_SEPARATE_PARAM = '=';
  private const string COMMAND_BACKGROUND = "background";
  private const string COMMAND_SPRITE = "_sprite";
  private const string COMMAND_COLOR = "_color";
  

  private string _text = 
  "!background_sprite=\"background_sprite1\"&ともり「トーキョーは 薄暗い閃光放って」&ともり 「消耗した MPも回復できぬまま」&!background_sprite=\"background_sprite2\"!background_color=\"255,0,255\"&ともり「相当な 厄介者の説法聞いて」";
//"ともり「トーキョーは 薄暗い閃光放って」&ともり 「消耗した MPも回復できぬまま」";

  /**
  * 文を1文字ごとに区切り、キューに格納したものを返す
  */
  private Queue<char> SeparateString(string str){
      // 文字列をchar型の配列にする = 1文字ごとに区切る
      char[] chars = str.ToCharArray();
      Queue<char> charQueue = new Queue<char>();
      // foreach文で配列charsに格納された文字を全て取り出し
      // キューに加える
      foreach (char c in chars) charQueue.Enqueue(c);
      return charQueue;
  }

  private bool OutputChar(){
      if (_charQueue.Count <= 0){
          nextPageIcon.SetActive(true);
          return false;
      }
      mainText.text += _charQueue.Dequeue();
      return true;
  }


  // 文字送りするコルーチン
  private IEnumerator ShowChars(float wait){
      // OutputCharメソッドがfalseを返す(=キューが空になる)までループする
      while (OutputChar())
          // wait秒だけ待機
          yield return new WaitForSeconds(wait);
      // コルーチンを抜け出す
      yield break;
  }

  //全文表示
  private void OutputAllChar(){
     StopCoroutine(ShowChars(captionSpeed));
      while (OutputChar()) ;
      nextPageIcon.SetActive(true);
  }

  // MonoBehaviourを継承しているとき,毎フレーム呼ばれる
  private void Update(){
      // 左(=0)クリックされたらOnClickメソッドを呼び出し
      if (Input.GetMouseButtonDown(0)) OnClick();
  }

  //文字列を指定した区切り文字毎に区切り,キューに格納したものを返す
  private Queue<string> SeparateString(string str, char sep){
      string[] strs = str.Split(sep);
      Queue<string> queue = new Queue<string>();
      foreach (string l in strs) queue.Enqueue(l);
      return queue;
  }

  //初期化
  private void Init(){
      _pageQueue = SeparateString(_text, SEPARATE_PAGE);
      ShowNextPage();
  }

  //次のページの表示
  private bool ShowNextPage(){
      if (_pageQueue.Count <= 0) return false;
      // オブジェクトの表示/非表示を設定する
      nextPageIcon.SetActive(false);
      ReadLine(_pageQueue.Dequeue());
      return true;
  }

  private void Start(){
      Init();
  }

  //クリックしたときの処理
  private void OnClick(){
      if (_charQueue.Count > 0) OutputAllChar();
      else{
          if (!ShowNextPage()){
              // UnityエディタのPlayモードを終了する
              UnityEditor.EditorApplication.isPlaying = false;
          }
      }
  }

  private void SetBackgroundImage(string cmd, string parameter){
      // 空白を削除し、背景コマンドの文字列も削除する
      cmd = cmd.Replace(" ", "").Replace(COMMAND_BACKGROUND, "");
      // ダブルクォーテーションで囲われた部分だけを取り出す
      parameter = parameter.Substring(parameter.IndexOf('"') + 1, parameter.LastIndexOf('"') - parameter.IndexOf('"') - 1);
      switch (cmd){
          case COMMAND_SPRITE:
              // Resourcesフォルダからスプライトを読み込み、インスタンス化する
              Sprite sp = Instantiate(Resources.Load<Sprite>(spritesDirectory + parameter));
              // 背景画像にインスタンス化したスプライトを設定する
              backgroundImage.sprite = sp;
              break;
          case COMMAND_COLOR:
              // 空白を削除し、カンマで文字を分ける
              string[] ps = parameter.Replace(" ", "").Split(',');
              // 分けた文字列(=引数)が4つ以上あるなら
              if (ps.Length > 3)
                  // 透明度も設定する
                  // 文字列をbyte型に直し、色を作成する
                  backgroundImage.color = new Color32(byte.Parse(ps[0]), byte.Parse(ps[1]),
                                                  byte.Parse(ps[2]), byte.Parse(ps[3]));
              else
                  backgroundImage.color = new Color32(byte.Parse(ps[0]), byte.Parse(ps[1]), byte.Parse(ps[2]), 255);
              break;
      }
  }

  /**
  * コマンドの読み出し
  */
  private void ReadCommand(string cmdLine){
      // 最初の「!」を削除する
      cmdLine = cmdLine.Remove(0, 1);
      Queue<string> cmdQueue = SeparateString(cmdLine, SEPARATE_COMMAND);
      foreach (string cmd in cmdQueue){
          // 「=」で分ける
          string[] cmds = cmd.Split(COMMAND_SEPARATE_PARAM);
          // もし背景コマンドの文字列が含まれていたら
          if (cmds[0].Contains(COMMAND_BACKGROUND))
              SetBackgroundImage(cmds[0], cmds[1]);
      }
  }

  private void ReadLine(string text){
      // 最初が「!」だったら
      if (text[0].Equals(SEPARATE_COMMAND)){
          ReadCommand(text);
          ShowNextPage();
          return;
      }
      string[] ts = text.Split(SEPARATE_MAIN_START);
      string name = ts[0];
      string main = ts[1].Remove(ts[1].LastIndexOf(SEPARATE_MAIN_END));
      nameText.text = name;
      mainText.text = "";
      _charQueue = SeparateString(main);
      StartCoroutine(ShowChars(captionSpeed));
  }

}


背景に画像を貼る

OrderinLayerを用いて背景を設定する.

Assetsにpicフォルダを作成.そこに使用する画像を入れる.

画像1

Inspectorタブ上で使用する画像のTexture TypeをSprite(2D and UI)
に変更する.

画像2

Projectタブの画像をhierarchy上にドラッグ&ドロップする.

画像3

サイズをいい感じに調整する.

画像4

実行時に背景を好きな画像にするために
Assets/Resources/Spritesに好きな画像を入れる
(今回はKusunoki.jpgを入れている)
そしてコードを次のように変更する.

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System.Collections;

// MonoBehaviourを継承することでオブジェクトにコンポーネントとして
// アタッチすることができるようになる
public class GameManager : MonoBehaviour{
 // SerializeFieldと書くとprivateなパラメーターでも
 // インスペクター上で値を変更できる
 [SerializeField]
 private Text mainText;
 [SerializeField]
 private Text nameText;
 [SerializeField]
 private float captionSpeed = 0.2f;
 [SerializeField]
  private GameObject nextPageIcon;
  [SerializeField]
  private Image backgroundImage;
  [SerializeField]
  private string spritesDirectory = "Sprites/";
  [SerializeField]
   private string textFile = "Texts/Scenario";

 
 // パラメーターを追加
  private const char SEPARATE_MAIN_START = '「';
  private const char SEPARATE_MAIN_END = '」';
  private Queue<char> _charQueue;
  private const char SEPARATE_PAGE = '&';
  private Queue<string> _pageQueue;
  private const char SEPARATE_COMMAND = '!';
  private const char COMMAND_SEPARATE_PARAM = '=';
  private const string COMMAND_BACKGROUND = "background";
  private const string COMMAND_SPRITE = "_sprite";
  private const string COMMAND_COLOR = "_color";
  

  private string _text = "";

  /**
  * 文を1文字ごとに区切り、キューに格納したものを返す
  */
  private Queue<char> SeparateString(string str){
      // 文字列をchar型の配列にする = 1文字ごとに区切る
      char[] chars = str.ToCharArray();
      Queue<char> charQueue = new Queue<char>();
      // foreach文で配列charsに格納された文字を全て取り出し
      // キューに加える
      foreach (char c in chars) charQueue.Enqueue(c);
      return charQueue;
  }

  private bool OutputChar(){
      if (_charQueue.Count <= 0){
          nextPageIcon.SetActive(true);
          return false;
      }
      mainText.text += _charQueue.Dequeue();
      return true;
  }


  // 文字送りするコルーチン
  private IEnumerator ShowChars(float wait){
      // OutputCharメソッドがfalseを返す(=キューが空になる)までループする
      while (OutputChar())
          // wait秒だけ待機
          yield return new WaitForSeconds(wait);
      // コルーチンを抜け出す
      yield break;
  }

  //全文表示
  private void OutputAllChar(){
     StopCoroutine(ShowChars(captionSpeed));
      while (OutputChar()) ;
      nextPageIcon.SetActive(true);
  }

  // MonoBehaviourを継承しているとき,毎フレーム呼ばれる
  private void Update(){
      // 左(=0)クリックされたらOnClickメソッドを呼び出し
      if (Input.GetMouseButtonDown(0)) OnClick();
  }

  //文字列を指定した区切り文字毎に区切り,キューに格納したものを返す
  private Queue<string> SeparateString(string str, char sep){
      string[] strs = str.Split(sep);
      Queue<string> queue = new Queue<string>();
      foreach (string l in strs) queue.Enqueue(l);
      return queue;
  }


  //次のページの表示
  private bool ShowNextPage(){
      if (_pageQueue.Count <= 0) return false;
      // オブジェクトの表示/非表示を設定する
      nextPageIcon.SetActive(false);
      ReadLine(_pageQueue.Dequeue());
      return true;
  }

  private void Start(){
      Init();
  }

  //クリックしたときの処理
  private void OnClick(){
      if (_charQueue.Count > 0) OutputAllChar();
      else{
          if (!ShowNextPage()){
              // UnityエディタのPlayモードを終了する
              UnityEditor.EditorApplication.isPlaying = false;
          }
      }
  }

  private void SetBackgroundImage(string cmd, string parameter){
      // 空白を削除し、背景コマンドの文字列も削除する
      cmd = cmd.Replace(" ", "").Replace(COMMAND_BACKGROUND, "");
      // ダブルクォーテーションで囲われた部分だけを取り出す
      parameter = parameter.Substring(parameter.IndexOf('"') + 1, parameter.LastIndexOf('"') - parameter.IndexOf('"') - 1);
      switch (cmd){
          case COMMAND_SPRITE:
              // Resourcesフォルダからスプライトを読み込み、インスタンス化する
              Sprite sp = Instantiate(Resources.Load<Sprite>(spritesDirectory + parameter));
              // 背景画像にインスタンス化したスプライトを設定する
              backgroundImage.sprite = sp;
              break;
          case COMMAND_COLOR:
              // 空白を削除し、カンマで文字を分ける
              string[] ps = parameter.Replace(" ", "").Split(',');
              // 分けた文字列(=引数)が4つ以上あるなら
              if (ps.Length > 3)
                  // 透明度も設定する
                  // 文字列をbyte型に直し、色を作成する
                  backgroundImage.color = new Color32(byte.Parse(ps[0]), byte.Parse(ps[1]),
                                                  byte.Parse(ps[2]), byte.Parse(ps[3]));
              else
                  backgroundImage.color = new Color32(byte.Parse(ps[0]), byte.Parse(ps[1]), byte.Parse(ps[2]), 255);
              break;
      }
  }

  /**
  * コマンドの読み出し
  */
  private void ReadCommand(string cmdLine){
      // 最初の「!」を削除する
      cmdLine = cmdLine.Remove(0, 1);
      Queue<string> cmdQueue = SeparateString(cmdLine, SEPARATE_COMMAND);
      foreach (string cmd in cmdQueue){
          // 「=」で分ける
          string[] cmds = cmd.Split(COMMAND_SEPARATE_PARAM);
          // もし背景コマンドの文字列が含まれていたら
          if (cmds[0].Contains(COMMAND_BACKGROUND))
              SetBackgroundImage(cmds[0], cmds[1]);
      }
  }

  private void ReadLine(string text){
      // 最初が「!」だったら
      if (text[0].Equals(SEPARATE_COMMAND)){
          ReadCommand(text);
          ShowNextPage();
          return;
      }
      string[] ts = text.Split(SEPARATE_MAIN_START);
      string name = ts[0];
      string main = ts[1].Remove(ts[1].LastIndexOf(SEPARATE_MAIN_END));
      nameText.text = name;
      mainText.text = "";
      _charQueue = SeparateString(main);
      StartCoroutine(ShowChars(captionSpeed));
  }


  /*テキストファイルを読み込む*/
   private string LoadTextFile(string fname){
       TextAsset textasset = Resources.Load<TextAsset>(fname);
       return textasset.text.Replace("\n", "").Replace("\r", "");
   }

   //初期化
   private void Init(){
       _text = LoadTextFile(textFile);
       _pageQueue = SeparateString(_text, SEPARATE_PAGE);
       ShowNextPage();
   }

}

"Scenario.txt"を次のように記述する.

!background_sprite="Kusunoki"


&ともり「トーキョーは 薄暗い閃光放って」
&ともり 「消耗した MPも回復できぬまま」
&ともり「相当な 厄介者の説法聞いて」

ここまで,行ったところで"STROKE"の画像が半透明になってしまっているので,別の方法で背景を設定することにした.以下のサイトの画像を張り付ける方法を行った.

画像5

ARの機能を使うために以下のサイトに沿って行う.

音楽を鳴らすための手順を載せているサイト


この記事が気に入ったらサポートをしてみませんか?