338 lines
9.5 KiB
C#
338 lines
9.5 KiB
C#
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using TMPro;
|
||
|
||
public class SurveyManager : MonoBehaviour
|
||
{
|
||
[Header("UI 元件")]
|
||
public StarRating question1Stars;
|
||
public StarRating question2Stars;
|
||
public StarRating question3Stars;
|
||
|
||
public InputField commentInputField;
|
||
public TMP_InputField commentInputFieldTMP;
|
||
|
||
public Button submitButton;
|
||
public GameObject warningText;
|
||
|
||
[Header("計時器")]
|
||
public Text timerText;
|
||
public TMP_Text timerTextTMP;
|
||
public float countdownTime = 30f;
|
||
private float currentTime;
|
||
private bool isGameRunning = false;
|
||
|
||
public System.Action<int, int, int, string> OnSurveyConfirmed;
|
||
|
||
void Start()
|
||
{
|
||
if (warningText != null)
|
||
{
|
||
warningText.SetActive(false);
|
||
}
|
||
|
||
if (submitButton != null)
|
||
{
|
||
submitButton.onClick.AddListener(OnSubmitButtonClicked);
|
||
}
|
||
|
||
currentTime = countdownTime;
|
||
StartGame();
|
||
}
|
||
|
||
void Update()
|
||
{
|
||
if (isGameRunning)
|
||
{
|
||
if (currentTime > 0)
|
||
{
|
||
currentTime -= Time.deltaTime;
|
||
int seconds = Mathf.CeilToInt(currentTime);
|
||
string timeText = "時間倒數 " + seconds + " 秒";
|
||
|
||
if (timerText != null)
|
||
{
|
||
timerText.text = timeText;
|
||
timerText.color = Color.red;
|
||
}
|
||
if (timerTextTMP != null)
|
||
{
|
||
timerTextTMP.text = timeText;
|
||
timerTextTMP.color = Color.red;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
currentTime = 0;
|
||
string timeUpText = "時間到!";
|
||
|
||
if (timerText != null)
|
||
{
|
||
timerText.text = timeUpText;
|
||
timerText.color = Color.red;
|
||
}
|
||
if (timerTextTMP != null)
|
||
{
|
||
timerTextTMP.text = timeUpText;
|
||
timerTextTMP.color = Color.red;
|
||
}
|
||
|
||
isGameRunning = false;
|
||
|
||
//強制送出
|
||
OnSurveySubmit(true);
|
||
}
|
||
}
|
||
}
|
||
|
||
public void StartGame()
|
||
{
|
||
Debug.Log("遊戲開始!");
|
||
|
||
isGameRunning = true;
|
||
currentTime = countdownTime;
|
||
|
||
string startText = "時間倒數 " + Mathf.CeilToInt(currentTime) + " 秒";
|
||
|
||
if (timerText != null)
|
||
{
|
||
timerText.color = Color.red;
|
||
timerText.text = startText;
|
||
}
|
||
if (timerTextTMP != null)
|
||
{
|
||
timerTextTMP.color = Color.red;
|
||
timerTextTMP.text = startText;
|
||
}
|
||
|
||
if (question1Stars != null) question1Stars.ResetRating();
|
||
if (question2Stars != null) question2Stars.ResetRating();
|
||
if (question3Stars != null) question3Stars.ResetRating();
|
||
|
||
if (commentInputField != null)
|
||
{
|
||
commentInputField.text = "";
|
||
}
|
||
if (commentInputFieldTMP != null)
|
||
{
|
||
commentInputFieldTMP.text = "";
|
||
}
|
||
}
|
||
|
||
void OnSubmitButtonClicked()
|
||
{
|
||
Debug.Log(">>> 點擊送出按鈕");
|
||
OnSurveySubmit();
|
||
}
|
||
|
||
private void OnSurveySubmit(bool isForce = false)
|
||
{
|
||
// 取得三題的評分
|
||
int rating1 = 0;
|
||
int rating2 = 0;
|
||
int rating3 = 0;
|
||
|
||
if (question1Stars != null) rating1 = question1Stars.GetRating();
|
||
if (question2Stars != null) rating2 = question2Stars.GetRating();
|
||
if (question3Stars != null) rating3 = question3Stars.GetRating();
|
||
|
||
// 檢查是否至少填寫了一個星星評分
|
||
if (rating1 == 0 && rating2 == 0 && rating3 == 0 && isForce == false)
|
||
{
|
||
ShowWarning();
|
||
return;
|
||
}
|
||
|
||
// 取得自行填寫的文字
|
||
string userComment = "";
|
||
if (commentInputField != null && !string.IsNullOrEmpty(commentInputField.text))
|
||
{
|
||
userComment = commentInputField.text;
|
||
}
|
||
else if (commentInputFieldTMP != null && !string.IsNullOrEmpty(commentInputFieldTMP.text))
|
||
{
|
||
userComment = commentInputFieldTMP.text;
|
||
}
|
||
|
||
// 送出資料
|
||
SubmitSurvey(rating1, rating2, rating3, userComment);
|
||
OnSurveyConfirmed?.Invoke(rating1, rating2, rating3, userComment);
|
||
}
|
||
|
||
void ShowWarning()
|
||
{
|
||
if (warningText != null)
|
||
{
|
||
warningText.SetActive(true);
|
||
Invoke("HideWarning", 2f);
|
||
}
|
||
|
||
Debug.Log("⚠️ 警告:請至少填寫一個問題的評分!");
|
||
}
|
||
|
||
void HideWarning()
|
||
{
|
||
if (warningText != null)
|
||
{
|
||
warningText.SetActive(false);
|
||
}
|
||
}
|
||
|
||
void SubmitSurvey(int rating1, int rating2, int rating3, string comment)
|
||
{
|
||
isGameRunning = false;
|
||
|
||
// ====== 清楚的資料統整顯示 ======
|
||
Debug.Log("╔══════════════════════════════════════╗");
|
||
Debug.Log("║ 問卷結果統整 ║");
|
||
Debug.Log("╚══════════════════════════════════════╝");
|
||
Debug.Log("");
|
||
|
||
// 問題 1
|
||
Debug.Log("【問題 1】覺得這個廟宇的神明有成功幫到你嗎?");
|
||
if (rating1 > 0)
|
||
{
|
||
Debug.Log(" ⭐ 評分:" + rating1 + " 顆星");
|
||
Debug.Log(" " + GetStarDisplay(rating1));
|
||
}
|
||
else
|
||
{
|
||
Debug.Log(" ⚪ 未填寫");
|
||
}
|
||
Debug.Log("");
|
||
|
||
// 問題 2
|
||
Debug.Log("【問題 2】下次還會回訪嗎?");
|
||
if (rating2 > 0)
|
||
{
|
||
Debug.Log(" ⭐ 評分:" + rating2 + " 顆星");
|
||
Debug.Log(" " + GetStarDisplay(rating2));
|
||
}
|
||
else
|
||
{
|
||
Debug.Log(" ⚪ 未填寫");
|
||
}
|
||
Debug.Log("");
|
||
|
||
// 問題 3
|
||
Debug.Log("【問題 3】有成功成為他的信眾嗎?");
|
||
if (rating3 > 0)
|
||
{
|
||
Debug.Log(" ⭐ 評分:" + rating3 + " 顆星");
|
||
Debug.Log(" " + GetStarDisplay(rating3));
|
||
}
|
||
else
|
||
{
|
||
Debug.Log(" ⚪ 未填寫");
|
||
}
|
||
Debug.Log("");
|
||
|
||
// 自行填寫
|
||
Debug.Log("【自行填寫】");
|
||
if (!string.IsNullOrEmpty(comment))
|
||
{
|
||
Debug.Log(" 💬 內容:「" + comment + "」");
|
||
}
|
||
else
|
||
{
|
||
Debug.Log(" ⚪ 未填寫");
|
||
}
|
||
Debug.Log("");
|
||
|
||
// 統計資料
|
||
Debug.Log("─────────────────────────────────────");
|
||
Debug.Log("【統計資料】");
|
||
|
||
// 計算填寫問題數量
|
||
int answeredQuestions = 0;
|
||
if (rating1 > 0) answeredQuestions++;
|
||
if (rating2 > 0) answeredQuestions++;
|
||
if (rating3 > 0) answeredQuestions++;
|
||
|
||
Debug.Log(" 📊 填寫問題數:" + answeredQuestions + " / 3");
|
||
|
||
// 計算總星數和平均
|
||
int totalStars = rating1 + rating2 + rating3;
|
||
Debug.Log(" ⭐ 總星數:" + totalStars + " 顆星");
|
||
|
||
if (answeredQuestions > 0)
|
||
{
|
||
float averageRating = (float)totalStars / answeredQuestions;
|
||
Debug.Log(" 📈 平均評分:" + averageRating.ToString("F2") + " 顆星");
|
||
|
||
// 滿意度評價
|
||
string satisfaction = GetSatisfactionLevel(averageRating);
|
||
Debug.Log(" 😊 滿意度:" + satisfaction);
|
||
}
|
||
|
||
// 剩餘時間
|
||
int remainingTime = Mathf.CeilToInt(currentTime);
|
||
Debug.Log(" ⏱️ 剩餘時間:" + remainingTime + " 秒");
|
||
|
||
// 完成時間
|
||
int usedTime = Mathf.CeilToInt(countdownTime - currentTime);
|
||
Debug.Log(" ⏰ 完成時間:" + usedTime + " 秒");
|
||
|
||
Debug.Log("─────────────────────────────────────");
|
||
Debug.Log("✅ 問卷送出成功!");
|
||
Debug.Log("══════════════════════════════════════");
|
||
Debug.Log("");
|
||
|
||
// 更新計時器顯示
|
||
string successText = "問卷送出成功!";
|
||
if (timerText != null)
|
||
{
|
||
timerText.text = successText;
|
||
timerText.color = Color.green;
|
||
}
|
||
if (timerTextTMP != null)
|
||
{
|
||
timerTextTMP.text = successText;
|
||
timerTextTMP.color = Color.green;
|
||
}
|
||
}
|
||
|
||
// 顯示星星圖示
|
||
string GetStarDisplay(int rating)
|
||
{
|
||
string stars = "";
|
||
for (int i = 0; i < 5; i++)
|
||
{
|
||
if (i < rating)
|
||
{
|
||
stars += "★";
|
||
}
|
||
else
|
||
{
|
||
stars += "☆";
|
||
}
|
||
}
|
||
return stars;
|
||
}
|
||
|
||
// 取得滿意度評價
|
||
string GetSatisfactionLevel(float averageRating)
|
||
{
|
||
if (averageRating >= 4.5f)
|
||
{
|
||
return "非常滿意 🌟🌟🌟";
|
||
}
|
||
else if (averageRating >= 3.5f)
|
||
{
|
||
return "滿意 😊";
|
||
}
|
||
else if (averageRating >= 2.5f)
|
||
{
|
||
return "普通 😐";
|
||
}
|
||
else if (averageRating >= 1.5f)
|
||
{
|
||
return "不太滿意 😕";
|
||
}
|
||
else
|
||
{
|
||
return "非常不滿意 😞";
|
||
}
|
||
}
|
||
}
|