ノベル風メッセージ表示
最新のUnityだとジョーカースクリプトが使えないので
新たにノベル風のスクリプトを作ります
1:Excel を読み込む準備をします
2:以下のスクリプトを入れます
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("最後の行です");
}
}

