ノベル風メッセージ表示

最新のUnityだとジョーカースクリプトが使えないので
新たにノベル風のスクリプトを作ります

1:Excel を読み込む準備をします

2:以下のスクリプトを入れます

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

public class Novel : MonoBehaviour {
 
 public Text MessageText;
 public Text NameText;

 public Sprite[] CharacterImage;
 public AudioClip[] BGM;

 public AudioSource audioSource;

 public GameObject CharacterA;
 public GameObject CharacterB;
 public SpriteRenderer CharacterAImage;
 public SpriteRenderer CharacterBImage;

 private string currentText = string.Empty;
 private float timeUntilDisplay = 0;
 private float timeElapsed = 1;
 private int lastUpdateCharacter = -1;
 float A = 0,B = 0;
 int MoveA,MoveB;
 bool message = false;

 // 会話の早さ
 float intervalForCharacterDisplay = 0.2f;
 // 会話の開始位置
 public static int hightLine = 2;
 // キャラクターを入れる位置
 float MovePosition = 4f;
 // キャラクターの出入りにかかる時間
 int MoveTime = 20;

 // 文字の表示が完了しているかどうか
 public bool IsCompleteDisplayText {
  get { return  Time.time > timeElapsed + timeUntilDisplay; }
 }

 void Update () {
  CharacterA.transform.position = new Vector3 (A - 12f, 0, 0);
  CharacterB.transform.position = new Vector3 (B + 12f, 0, 0);
  if(message){
   if (IsCompleteDisplayText) {
    if (Input.GetMouseButtonDown (0)) {// クリック時に次の行を表示する
     if (Database.FileData [hightLine-2] [1] != "end") {
      SetNextLine ();
     } else {// 今表示してるのが最後の文章の場合
      EndLine ();
     }
    }
   } else {// クリック時に文字をすべて表示する
    if (Input.GetMouseButtonDown (0)) {
     timeUntilDisplay = 0;
    }
   }
   int displayCharacterCount = (int)(Mathf.Clamp01 ((Time.time - timeElapsed) / timeUntilDisplay) * currentText.Length);
   if (displayCharacterCount != lastUpdateCharacter) {
    MessageText.text = currentText.Substring (0, displayCharacterCount);
    lastUpdateCharacter = displayCharacterCount;
   }
  }
 }

 public void SetNextLine(){
  currentText = "";
  if (Database.FileData [hightLine - 1] [3] != "") {
   MoveA = int.Parse (Database.FileData [hightLine - 1] [3]);
  } else {
   MoveA = -99;
  }
  if (Database.FileData [hightLine-1] [4] != "") {
   MoveB = int.Parse (Database.FileData [hightLine - 1] [4]);
  } else {
   MoveB = -99;
  }
  message = false;
  Music();
 }

 // 音楽を流す
 void Music(){
  if(Database.FileData [hightLine-1] [7] != ""){
   audioSource.clip = BGM[int.Parse (Database.FileData [hightLine - 1] [7])];
   audioSource.Play ();
  }
  GraphicChange();
 }

 // キャラクターの差分
 void GraphicChange(){
  if (Database.FileData [hightLine-1] [5] != "") {
   CharacterAImage.sprite = CharacterImage[int.Parse (Database.FileData [hightLine - 1] [5])];
  }
  if (Database.FileData [hightLine-1] [6] != "") {
   CharacterBImage.sprite = CharacterImage[int.Parse (Database.FileData [hightLine - 1] [6])];
  }
  StartCoroutine("MoveOut");
 }

 // キャラクターを外す
 IEnumerator MoveOut(){
  int x = 0;
  if ((MoveA >= -1 || MoveB >= -1) && A > 0 && B < 0) {
   while (x < MoveTime) {
    if (MoveA >= -1 && A > 0) {
     A -= (12 - MovePosition) / MoveTime;
    }
    if (MoveB >= -1 && B < -0) {
     B += (12 - MovePosition) / MoveTime;
    }
    x++;
    yield return null;
   }
  }
  StartCoroutine ("MoveIn");
 }

 // キャラクターを入れる
 IEnumerator MoveIn(){
  int x = 0;
  if (MoveA >= 0 || MoveB >= 0) {
   if (MoveA >= 0) {
    CharacterAImage.sprite = CharacterImage[MoveA];
   }
   if (MoveB >= 0) {
    CharacterBImage.sprite = CharacterImage[MoveB];
   }
   while (x < MoveTime) {
    if (MoveA >= 0) {
     A += (12 - MovePosition) / MoveTime;
    }
    if (MoveB >= 0) {
     B -= (12 - MovePosition) / MoveTime;
    }
    x++;
    yield return null;
   }
  }
  NameChange();
 }

 // キャラクターの名前
 void NameChange(){
  NameText.text = Database.FileData[hightLine-1][2];
  MessageSetting();
 }

 void MessageSetting(){
  do{currentText = currentText + Database.FileData[hightLine-1][0] + "\n";
   hightLine ++;
  }while(Database.FileData[hightLine-2][1] != "stop" && Database.FileData[hightLine-2][1] != "end" );
  timeUntilDisplay = currentText.Length * intervalForCharacterDisplay;
  timeElapsed = Time.time;
  lastUpdateCharacter = -1;
  message = true;
 }

 // 会話を終わらせる
 void EndLine(){
  Debug.Log("最後の行です");
 }
}

3:上記のスクリプトのInspectorから  必要なデータを入力します


・Character Image
表示させるキャラクターの画像

・BGM
鳴らしたい音楽

4:Excelで 以下の用に編集します


・会話
会話の内容を入れます

・停止
会話を止めたいときは「stop」
会話を終わらせたいときは「end」
を入れます

・名前
会話と一緒に出す名前を入れます

・出入A B
Character Imageで指定した画像番号を入れることで
その画像を画面内に入れます
「-1」と入れると 画面外に出します

・差分A B
Character Imageで指定した画像番号を入れることで
その画像に変更します

・BGM
BGMで指定した番号を入れることで その音を鳴らします

5:SetNextLine を
実行します

これでノベル風メッセージが作れるようになります

戻る