¡¡Â³¤±¤Æ¡¢TextMessageViewer¥¹¥¯¥ê¥×¥È¤òÊÔ½¸¤·¤Æ¤¤¤¤Þ¤·¤ç¤¦¡£
¡¡º£ÅÙÄɲ䷤Ƥ¤¤¯½èÍý¤Ï¡¢1ʸ»ú¤º¤Äʸ»úÁ÷¤ê¤µ¤ì¤Æʸ»ú¤¬É½¼¨¤µ¤ì¤Æ¤¤¤ë´Ö¤Ë²èÌ̤ò¥¯¥ê¥Ã¥¯¡Ê¥¿¥Ã¥×¡Ë¤·¤¿¾ì¹ç¤Ë
ɽ¼¨Ãæ¤Î1¥Ú¡¼¥¸Ê¬¤Î¥á¥Ã¥»¡¼¥¸¤ò¤Þ¤È¤á¤Æɽ¼¨¤¹¤ë¤È¤¤¤¦µ¡Ç½¤Ç¤¹¡£¤³¤Á¤é¤â¤è¤¯¸«¤«¤±¤ëµ¡Ç½¤Ç¤¹¤Í¡£
¡¡Ê¸»úÁ÷¤êÃæ¤Ë¥¯¥ê¥Ã¥¯¤Ç1¥Ú¡¼¥¸É½¼¨¤·¡¢1¥Ú¡¼¥¸É½¼¨Ãæ¤Ë¥¯¥ê¥Ã¥¯¤·¤¿¤é¼¡¤Î¥á¥Ã¥»¡¼¥¸¤¬¤Þ¤¿Ê¸»úÁ÷¤ê¤Çɽ¼¨¤µ¤ì»Ï¤á¤ë¤È¤¤¤¦»ÅÍͤˤʤê¤Þ¤¹¡£
¤³¤Á¤é¤â¥¹¥¯¥ê¥×¥È¤ò½¤Àµ¡¦Äɲ乤뤳¤È¤Ë¤è¤Ã¤Æµ¡Ç½¤òÄɲ䷤Ƥ¤¤¤Þ¤¹¡£
¡¡¥¿¥Ã¥×¤·¤Æ¥á¥Ã¥»¡¼¥¸¤ò¤Þ¤È¤á¤Æɽ¼¨¤·¤¿¾ì¹ç¤È¡¢Ê¸»ú¤¬Á´Éôɽ¼¨¤µ¤ì¤ë¤Þ¤ÇÂԤäƤ¤¤¿¾ì¹ç¤È¤Î¥¯¥ê¥Ã¥¯¤ÎµóÆ°¤ÏƱ¤¸¤Ë¤Ê¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£
¡¡¤Ê¤ª¡¢Whileʸ¤ò»ÈÍѤ·¤Þ¤¹¤Î¤Çµ½Ò¤¹¤ëºÝ¤Ë¤Ï½¼Ê¬µ¤¤òÉÕ¤±¤Æ¤¯¤À¤µ¤¤¡£
Àµ³Î¤Ë½ñ¤«¤Ê¤¤¤È̵¸Â¥ë¡¼¥×¤Ë´Ù¤Ã¤Æ¥²¡¼¥à¤À¤±¤Ç¤Ï¤Ê¤¯¡¢Unity¼«ÂΤ¬Æ°¤«¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
¡¡TextMessageViewer¤ò¥À¥Ö¥ë¥¯¥ê¥Ã¥¯¤·¤Æ³«¤¤¤Æ¡¢¥¹¥¯¥ê¥×¥ÈÆâ¤Ë¥³¡¼¥É¤òµ½Ò¤·¤Æ¤¤¤¤Þ¤¹¡£
¡¡<= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È¥µ¥ó¥×¥ë¥³¡¼¥É¤¬³«¤¤Þ¤¹¡£
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class TextMessageViewer : MonoBehaviour
{
public string[] messages; // ɽ¼¨¤¹¤ë¥á¥Ã¥»¡¼¥¸¤ÎÇÛÎó
public Text txtMessage; // ¥á¥Ã¥»¡¼¥¸É½¼¨ÍÑ
public float wordSpeed; // 1ʸ»úÅö¤¿¤ê¤Îɽ¼¨Â®ÅÙ
private int messagesIndex = 0; // ɽ¼¨¤¹¤ë¥á¥Ã¥»¡¼¥¸¤ÎÇÛÎóÈÖ¹æ
private int wordCount; // £±¥á¥Ã¥»¡¼¥¸Åö¤¿¤ê¤Îʸ»ú¤ÎÁí¿ô
private bool isTapped = false; // Á´Ê¸É½¼¨¸å¤Ë¥¿¥Ã¥×¤òÂԤĥե饰
private bool isDisplayedAllMessage = false; // Á´¥á¥Ã¥»¡¼¥¸É½¼¨´°Î»¤Î¥Õ¥é¥°
private IEnumerator waitCoroutine; // <= Á´Ê¸É½¼¨¤Þ¤Ç¤ÎÂÔµ¡»þ´Ö¥á¥½¥Ã¥ÉÂåÆþÍÑ¡£StopCoroutine¤Ç¤¤ë¤è¤¦¤Ë¤·¤Æ¤ª¤¯¡¡(¡ú¡¡ÄɲÃ)
private Tween tween; // <= DoTweenºÆÀ¸ÍÑ¡£Kill¤Ç¤¤ë¤è¤¦¤ËÂåÆþ¤·¤Æ»ÈÍѤ¹¤ë¡¡(¡ú¡¡ÄɲÃ)
void Start() {
// £±Ê¸»ú¤º¤Äʸ»ú¤òɽ¼¨¤¹¤ë½èÍý¤ò¥¹¥¿¡¼¥È
StartCoroutine(DisplayMessage()); // <= ¥á¥½¥Ã¥É¤Î¸Æ¤Ó½Ð¤·ÊýË¡¤òStartCoroutine¤ËÊѹ¹¡Ê¡ú¡Ë
}
void Update() {
if (isDisplayedAllMessage) {
// Á´¤Æ¤Î¥á¥Ã¥»¡¼¥¸É½¼¨¤¬½ªÎ»¤·¤Æ¤¤¤¿¤é½èÍý¤ò¹Ô¤ï¤Ê¤¤
return;
}
if (Input.GetMouseButtonDown(0) && wordCount == messages[messagesIndex].Length) {
// Á´Ê¸É½¼¨Ãæ¤Ë¥¿¥Ã¥×¤·¤¿¤éÁ´Ê¸É½¼¨¤ò½ªÎ»
isTapped = true;
}
/* ¡ú ¤³¤³¤«¤é½èÍý¤òÄɲà */
if (Input.GetMouseButtonDown(0) && tween != null) {
// ʸ»úÁ÷¤êÃæ¤Ë¥¿¥Ã¥×¤·¤¿¾ì¹ç¡¢Ê¸»úÁ÷¤ê¤òÄä»ß
tween.Kill();
tween = null;
// ʸ»úÁ÷¤ê¤Î¤¿¤á¤ÎÂÔµ¡»þ´Ö¤âÄä»ß
if (waitCoroutine != null) {
StopCoroutine(waitCoroutine);
waitCoroutine = null;
}
// Á´Ê¸¤ò¤Þ¤È¤á¤Æɽ¼¨
txtMessage.text = messages[messagesIndex];
Debug.Log("ʸ»úÁ÷¤ê¥¹¥¥Ã¥× 1¥Ú¡¼¥¸¤Þ¤È¤á¤Æ ɽ¼¨");
// ¥á¥Ã¥»¡¼¥¸É½¼¨´°Î»½èÍý
CompleteOneMessage();
// ¥¿¥Ã¥×¤¹¤ë¤Þ¤ÇÁ´Ê¸¤òɽ¼¨¤·¤¿¤Þ¤ÞÂÔµ¡
StartCoroutine(NextTouch());
}
/* ¡ú ¤³¤³¤Þ¤ÇÄɲà */
}
/// <summary>
/// £±Ê¸»ú¤º¤Äʸ»ú¤òɽ¼¨
/// </summary>
/// <returns></returns>
private IEnumerator DisplayMessage() { // <= Ìá¤êÃͤòvoid¤«¤éIEnumerator·¿¤ËÊѹ¹(¡ú)
isTapped = false;
// ɽ¼¨¥Æ¥¥¹¥È¤ò¥ê¥»¥Ã¥È
txtMessage.text = "";
/* ¡ú ¤³¤³¤«¤é½èÍý¤òÄɲà */
// Tween¤ò¥ê¥»¥Ã¥È
tween = null;
// ʸ»úÁ÷¤ê¤ÎÂÔµ¡»þ´Ö¤ò½é´ü²½
if (waitCoroutine != null) {
StopCoroutine(waitCoroutine);
waitCoroutine = null;
}
/* ¡ú ¤³¤³¤Þ¤ÇÄɲà */
/* ¡ú ¤³¤³¤«¤é¡¡Á¤¤Î²Õ½ê¤Î½èÍý¤ò½¤Àµ */
// ¡ DoTween¤Î½èÍý¤ÎÁ°¤ËWhileʸ¤òÄɲá£1ʸ»ú¤º¤Ä¤Îʸ»úÁ÷¤êɽ¼¨¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¥ë¡¼¥×
while (messages[messagesIndex].Length > wordCount) {
// ¢ DoTween¤Î½èÍý¤òtweenÊÑ¿ô¤ËÂåÆþ¤·¤Æ»ÈÍѤ¹¤ë¤è¤¦¤Ë½¤Àµ
tween = txtMessage.DOText(messages[messagesIndex], messages[messagesIndex].Length * wordSpeed).
SetEase(Ease.Linear).OnComplete(() => {
Debug.Log("ʸ»úÁ÷¤ê¤Ç Á´Ê¸É½¼¨ ´°Î»");
// (TODO) ¾¤Ë¤â½èÍý¤¬¤¢¤ì¤ÐÄɲ乤ë
// £ ¥á¥Ã¥»¡¼¥¸É½¼¨´°Î»½èÍý¡¡¥á¥½¥Ã¥É²½
CompleteOneMessage();
});
// ¤ ʸ»úÁ÷¤êɽ¼¨¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¤ÎÂÔµ¡»þ´Ö¤òÀßÄꤷ¤Æ¥³¥ë¡¼¥Á¥ó½èÍý¤Ë¤è¤ëÂÔµ¡¤ò¼Â¹Ô
waitCoroutine = WaitTime();
yield return StartCoroutine(waitCoroutine);
}
/* ¡ú ¤³¤³¤Þ¤Ç½¤Àµ */
}
/* ¡ú ¤³¤³¤«¤é½èÍý¤òÄɲà */
/// <summary>
/// Á´Ê¸É½¼¨¤Þ¤Ç¤ÎÂÔµ¡»þ´Ö(ʸ»ú¿ô¡ß1ʸ»úÅö¤¿¤ê¤Îɽ¼¨»þ´Ö)
/// ¥¿¥Ã¥×¤·¤ÆÁ´Ê¸¤ò¤Þ¤È¤á¤Æɽ¼¨¤·¤¿¾ì¹ç¤Ë¤Ï¤³¤ÎÂÔµ¡»þ´Ö¤òÄä»ß
/// </summary>
/// <returns></returns>
private IEnumerator WaitTime() {
yield return new WaitForSeconds(messages[messagesIndex].Length * wordSpeed);
}
/// <summary>
/// £±¤Äʬ¤Î¥á¥Ã¥»¡¼¥¸É½¼¨´°Î»½èÍý
/// </summary>
private void CompleteOneMessage() {
// ɽ¼¨¤·¤¿Ê¸»ú¤ÎÁí¿ô¤ò¹¹¿·
wordCount = messages[messagesIndex].Length;
}
/* ¡ú ¤³¤³¤Þ¤ÇÄɲà */
/// <summary>
/// ¥¿¥Ã¥×¤¹¤ë¤Þ¤ÇÁ´Ê¸¤òɽ¼¨¤·¤¿¤Þ¤ÞÂÔµ¡
/// </summary>
/// <returns></returns>
private IEnumerator NextTouch() {
// ¥¿¥Ã¥×¤òÂÔ¤Ä
yield return new WaitUntil(() => isTapped);
// ¼¡¤Î¥á¥Ã¥»¡¼¥¸½àÈ÷
messagesIndex++;
wordCount = 0;
// ¥ê¥¹¥È¤Ë̤ɽ¼¨¤Î¥á¥Ã¥»¡¼¥¸¤¬»Ä¤Ã¤Æ¤¤¤ë¾ì¹ç
if (messagesIndex < messages.Length) {
// £±Ê¸»ú¤º¤Äʸ»ú¤òɽ¼¨¤¹¤ë½èÍý¤ò¥¹¥¿¡¼¥È
StartCoroutine(DisplayMessage()); // <= ¥á¥½¥Ã¥É¤Î¸Æ¤Ó½Ð¤·ÊýË¡¤òStartCoroutine¤ËÊѹ¹¡Ê¡ú¡Ë
} else {
// Á´¥á¥Ã¥»¡¼¥¸É½¼¨½ªÎ»
isDisplayedAllMessage = true;
Debug.Log("Á´¥á¥Ã¥»¡¼¥¸ ɽ¼¨½ªÎ»");
}
}
}
¡¡public¤ÇÄɲä·¤¿ÊÑ¿ô¤Ï¤¢¤ê¤Þ¤»¤ó¤Î¤Ç¡¢¥¤¥ó¥¹¥Ú¥¯¥¿¡Ý¤Ç¤ÎÀßÄê¹àÌܤËÊѹ¹¤Ï¤¢¤ê¤Þ¤»¤ó¡£
¡¡¤³¤³¤Ç¤ÏDoTween¤Î½èÍý¤òTween·¿¤ÎÊÑ¿ô¤ËÆþ¤ì¤Æ½èÍý¤ò¹Ô¤¦¤è¤¦¤ËÊѹ¹¤·¤Æ¤¤¤Þ¤¹¡£Ê¸»úÁ÷¤ê½èÍý¼«ÂΤˤÏÊѹ¹¤Ï¤¢¤ê¤Þ¤»¤ó¤¬
¤³¤Î¤è¤¦¤ËÊÑ¿ô¤ËÂåÆþ¤·¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤ê¡¢Tween¤Ë¤è¤ëʸ»úÁ÷¤ê¤Î½èÍý¤òÅÓÃæ¤ÇÄä»ß¡ÊKill½èÍý¡Ë¤µ¤»¤ë¤³¤È¤¬½ÐÍè¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¡ÊÊÑ¿ô¤ËÂåÆþ¤·¤Æ»ÈÍѤ·¤Ê¤¤¤ÈÅÓÃæ¤ÇTween½èÍý¤òÄä»ß¤Ç¤¤Þ¤»¤ó¡Ë
¡¡¥³¥ë¡¼¥Á¥ó½èÍý¤Ë¤Ä¤¤¤Æ¤âƱÍͤǤ¹¡£¤³¤Î½èÍý¤Ï¡¢Ê¸»úÁ÷¤ê¤Î½èÍý¤Ë¤«¤«¤ë»þ´Ö¤Ë¹ç¤ï¤»¤Æ¡¢¼¡¤Î½èÍý¤Ë°Ü¤é¤Ê¤¤¤è¤¦¤Ë¤¹¤ëµ¿»÷Ū¤ÊÂÔµ¡¤Î½èÍý¤Ç¤¹¡£
¤³¤Á¤é¤â¤½¤Î¤Þ¤Þ½èÍý¤ò¹Ô¤Ã¤Æ¤·¤Þ¤Ã¤¿¾ì¹ç¡¢ÅÓÃæ¤ÇTween¤¬Ää»ß¤·¤¿¾ì¹ç¤Ç¤â»ØÄꤵ¤ì¤Æ¤¤¤ëÂÔµ¡»þ´Ö¤ò¾ï¤ËÂԤäƤ·¤Þ¤¦¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¤½¤³¤Ç¥³¥ë¡¼¥Á¥ó¤Ë¤Ä¤¤¤Æ¤âÊÑ¿ô¤òÍÑ°Õ¤·¡¢¤½¤Á¤é¤ò»È¤Ã¤Æ½èÍý¤ò¹Ô¤¦¤³¤È¤Ç¡¢Tween¤ÈƱ¤¸¤è¤¦¤Ë½èÍý¤òÅÓÃæ¤ÇÄä»ß¡ÊStopCoroutine¡Ë½ÐÍè¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡¤³¤Î£²¤Ä¤Î½èÍý¤ò¾å¼ê¤¯¹ç¤ï¤»¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¯¥ê¥Ã¥¯¤Ë¤è¤Ã¤Æʸ»úÁ÷¤ê¤Î½èÍý¤òÄä»ß¤µ¤»¤Ä¤Ä¡¢°ìÅÙ¤Ë1¥Ú¡¼¥¸Ê¬¤Î¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤Ç¤¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£
¡¡¤½¤ì¤Ç¤Ï¼Â¹Ô¤·¤Æ»î¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£²¼µ¤ÎÆ°²è¤è¤¦¤Ë¡¢¥¯¥ê¥Ã¥¯¤·¤¿¾ì¹ç¤Ë¤Ï1¥Ú¡¼¥¸Ê¬¤¹¤Ù¤Æ¤Î¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ì¤ÐÀ®¸ù¤Ç¤¹¡£
https://gyazo.com/f54706a5b0703ef8f8a7ce60e389631c