| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- using System;
- using System.Text;
- using System.Collections;
- using UnityEngine;
- using UnityEngine.Networking;
- public class NetworkManager : MonoBehaviour
- {
- public static NetworkManager Instance { get; private set; }
-
- [Header("服务器配置")]
- public string baseUrl = "http://38.12.23.48:8080/api";
- public float timeout = 30f;
-
- [Header("调试选项")]
- public bool enableDebugLog = true;
-
- private string authToken;
-
- private void Awake()
- {
- if (Instance == null)
- {
- Instance = this;
- DontDestroyOnLoad(gameObject);
-
- if (baseUrl.Contains("localhost") || baseUrl.Contains("127.0.0.1"))
- {
- baseUrl = "http://38.12.23.48:8080/api";
- Debug.Log($"[NetworkManager] baseUrl已更新为: {baseUrl}");
- }
- }
- else
- {
- Destroy(gameObject);
- }
- }
-
- public void SetAuthToken(string token)
- {
- authToken = token;
- }
-
- public void ClearAuthToken()
- {
- authToken = null;
- }
-
- public IEnumerator PostRequest<T>(string endpoint, object data, Action<T> onSuccess, Action<string> onError)
- {
- string url = baseUrl + endpoint;
- string jsonData = JsonUtility.ToJson(data);
-
- if (enableDebugLog)
- {
- Debug.Log($"[NetworkManager] POST 请求: {url}");
- Debug.Log($"[NetworkManager] 请求数据: {jsonData}");
- }
-
- UnityWebRequest request = new UnityWebRequest(url, "POST");
- byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData);
- request.uploadHandler = new UploadHandlerRaw(bodyRaw);
- request.downloadHandler = new DownloadHandlerBuffer();
- request.SetRequestHeader("Content-Type", "application/json");
- request.SetRequestHeader("Accept", "application/json");
-
- if (!string.IsNullOrEmpty(authToken))
- {
- request.SetRequestHeader("Authorization", $"Bearer {authToken}");
- }
-
- request.timeout = (int)timeout;
-
- yield return request.SendWebRequest();
-
- if (enableDebugLog)
- {
- Debug.Log($"[NetworkManager] 响应码: {request.responseCode}");
- Debug.Log($"[NetworkManager] 响应内容: {request.downloadHandler?.text ?? "无内容"}");
- Debug.Log($"[NetworkManager] 错误: {request.error ?? "无错误"}");
- Debug.Log($"[NetworkManager] 结果类型: {request.result}");
- }
-
- if (request.result == UnityWebRequest.Result.Success)
- {
- string responseText = request.downloadHandler.text;
- Debug.Log($"[NetworkManager] POST {endpoint} 成功: {responseText}");
-
- try
- {
- T response = JsonUtility.FromJson<T>(responseText);
- onSuccess?.Invoke(response);
- }
- catch (Exception e)
- {
- Debug.LogError($"[NetworkManager] 解析响应失败: {e.Message}, 原始响应: {responseText}");
- onError?.Invoke($"解析响应失败: {e.Message}");
- }
- }
- else
- {
- string errorMessage = request.error ?? "网络请求失败";
- string responseText = request.downloadHandler?.text ?? "";
- Debug.LogError($"[NetworkManager] POST {endpoint} 失败: {errorMessage}, 响应码: {request.responseCode}, 响应: {responseText}");
- onError?.Invoke($"{errorMessage} (Code: {request.responseCode})");
- }
-
- request.Dispose();
- }
-
- public IEnumerator GetRequest<T>(string endpoint, Action<T> onSuccess, Action<string> onError)
- {
- string url = baseUrl + endpoint;
-
- using (UnityWebRequest request = UnityWebRequest.Get(url))
- {
- request.SetRequestHeader("Content-Type", "application/json");
-
- if (!string.IsNullOrEmpty(authToken))
- {
- request.SetRequestHeader("Authorization", $"Bearer {authToken}");
- }
-
- request.timeout = (int)timeout;
-
- yield return request.SendWebRequest();
-
- if (request.result == UnityWebRequest.Result.Success)
- {
- string responseText = request.downloadHandler.text;
- Debug.Log($"GET {endpoint} 响应: {responseText}");
-
- try
- {
- T response = JsonUtility.FromJson<T>(responseText);
- onSuccess?.Invoke(response);
- }
- catch (Exception e)
- {
- Debug.LogError($"解析响应失败: {e.Message}");
- onError?.Invoke($"解析响应失败: {e.Message}");
- }
- }
- else
- {
- string errorMessage = request.error ?? "网络请求失败";
- Debug.LogError($"GET {endpoint} 失败: {errorMessage}");
- onError?.Invoke(errorMessage);
- }
- }
- }
-
- public IEnumerator PutRequest<T>(string endpoint, object data, Action<T> onSuccess, Action<string> onError)
- {
- string url = baseUrl + endpoint;
- string jsonData = JsonUtility.ToJson(data);
-
- using (UnityWebRequest request = UnityWebRequest.Put(url, jsonData))
- {
- request.SetRequestHeader("Content-Type", "application/json");
-
- if (!string.IsNullOrEmpty(authToken))
- {
- request.SetRequestHeader("Authorization", $"Bearer {authToken}");
- }
-
- request.timeout = (int)timeout;
-
- yield return request.SendWebRequest();
-
- if (request.result == UnityWebRequest.Result.Success)
- {
- string responseText = request.downloadHandler.text;
- Debug.Log($"PUT {endpoint} 响应: {responseText}");
-
- try
- {
- T response = JsonUtility.FromJson<T>(responseText);
- onSuccess?.Invoke(response);
- }
- catch (Exception e)
- {
- Debug.LogError($"解析响应失败: {e.Message}");
- onError?.Invoke($"解析响应失败: {e.Message}");
- }
- }
- else
- {
- string errorMessage = request.error ?? "网络请求失败";
- Debug.LogError($"PUT {endpoint} 失败: {errorMessage}");
- onError?.Invoke(errorMessage);
- }
- }
- }
-
- public void SaveGameSession(float playTime, int progress, int difficulty, System.Action<GameSessionResponse> onSuccess, System.Action<string> onError)
- {
- GameSessionRequest request = new GameSessionRequest
- {
- playTime = playTime,
- progress = progress,
- difficulty = difficulty
- };
-
- StartCoroutine(PostRequest<GameSessionResponse>("/game/session", request, onSuccess, onError));
- }
-
- public void GetDifficultyConfig(System.Action<DifficultyConfigResponse> onSuccess, System.Action<string> onError)
- {
- StartCoroutine(GetRequest<DifficultyConfigResponse>("/game/difficulty", onSuccess, onError));
- }
-
- public void GetQuestionsByDifficulty(int difficulty, System.Action<QuestionListResponse> onSuccess, System.Action<string> onError)
- {
- StartCoroutine(GetRequest<QuestionListResponse>($"/game/questions?difficulty={difficulty}", onSuccess, onError));
- }
-
- public void SaveGameResult(GameResultRequest result, System.Action<GameResultResponse> onSuccess, System.Action<string> onError)
- {
- StartCoroutine(PostRequest<GameResultResponse>("/game/result", result, onSuccess, onError));
- }
-
- public void UpdateStudyAbility(int studyAbility, System.Action<StudyAbilityResponse> onSuccess, System.Action<string> onError)
- {
- StudyAbilityRequest request = new StudyAbilityRequest
- {
- studyAbility = studyAbility
- };
-
- StartCoroutine(PutRequest<StudyAbilityResponse>("/user/study-ability", request, onSuccess, onError));
- }
-
- public void SyncAchievements(AchievementSyncRequest request, System.Action<AchievementSyncResponse> onSuccess, System.Action<string> onError)
- {
- StartCoroutine(PostRequest<AchievementSyncResponse>("/achievements/sync", request, onSuccess, onError));
- }
-
- public void GetAchievements(System.Action<GetAchievementsResponse> onSuccess, System.Action<string> onError)
- {
- StartCoroutine(GetRequest<GetAchievementsResponse>("/achievements", onSuccess, onError));
- }
- public void GetUserProfile(System.Action<UserProfileResponse> onSuccess, System.Action<string> onError)
- {
- StartCoroutine(GetRequest<UserProfileResponse>("/user/profile", onSuccess, onError));
- }
-
- public void ReportQuestionStats(int questionId, bool isCorrect, int difficulty, System.Action<QuestionStatsResponse> onSuccess, System.Action<string> onError)
- {
- QuestionAttemptRequest request = new QuestionAttemptRequest
- {
- questionId = questionId,
- isCorrect = isCorrect,
- difficulty = difficulty,
- sourceType = "GAME"
- };
-
- StartCoroutine(PostRequest<QuestionStatsResponse>("/questions/attempts", request, onSuccess, onError));
- }
-
- public void UpdatePlayerLevel(int currentLevel, int experience, System.Action<LevelUpResponse> onSuccess, System.Action<string> onError)
- {
- LevelUpRequest request = new LevelUpRequest
- {
- currentLevel = currentLevel,
- experience = experience
- };
-
- StartCoroutine(PutRequest<LevelUpResponse>("/user/level", request, onSuccess, onError));
- }
-
- public void GetReviewQuestions(int difficulty, System.Action<QuestionListResponse> onSuccess, System.Action<string> onError)
- {
- StartCoroutine(GetRequest<QuestionListResponse>($"/game/review-questions?difficulty={difficulty}", onSuccess, onError));
- }
-
- public void AddQuestionToReview(int questionId, System.Action<BaseResponse> onSuccess, System.Action<string> onError)
- {
- AddReviewQuestionRequest request = new AddReviewQuestionRequest
- {
- questionId = questionId
- };
-
- StartCoroutine(PostRequest<BaseResponse>("/game/review-questions/add", request, onSuccess, onError));
- }
- }
|