添加询问李诫(AI 问答)功能

- 添加 AIChatComponent:用于主要的逻辑(构造请求,解析响应)
- 添加 AIChatForm:用于问答的页面展示
This commit is contained in:
SepComet 2026-02-25 17:25:09 +08:00
parent b00ea1a14f
commit f8c0f46c36
70 changed files with 7059 additions and 607 deletions

View File

@ -11,3 +11,4 @@
105 Bottom对话UI BottomBoxDialogForm Dialog False False 105 Bottom对话UI BottomBoxDialogForm Dialog False False
106 Bubble对话UI BubbleDialogForm Dialog True False 106 Bubble对话UI BubbleDialogForm Dialog True False
107 游戏场景覆盖UI MainOverlayForm Overlay False False 107 游戏场景覆盖UI MainOverlayForm Overlay False False
108 AI对话UI AIChatForm Overlay False False

View File

@ -16,11 +16,13 @@ public partial class GameEntry : MonoBehaviour
public static BuiltinDataComponent BuiltinData { get; private set; } public static BuiltinDataComponent BuiltinData { get; private set; }
public static CombineComponent Combine { get; private set; } public static CombineComponent Combine { get; private set; }
public static DialogComponent Dialog { get; private set; } public static DialogComponent Dialog { get; private set; }
public static AIChatComponent AIChat { get; private set; }
private static void InitCustomComponents() private static void InitCustomComponents()
{ {
BuiltinData = UnityGameFramework.Runtime.GameEntry.GetComponent<BuiltinDataComponent>(); BuiltinData = UnityGameFramework.Runtime.GameEntry.GetComponent<BuiltinDataComponent>();
Combine = UnityGameFramework.Runtime.GameEntry.GetComponent<CombineComponent>(); Combine = UnityGameFramework.Runtime.GameEntry.GetComponent<CombineComponent>();
Dialog = UnityGameFramework.Runtime.GameEntry.GetComponent<DialogComponent>(); Dialog = UnityGameFramework.Runtime.GameEntry.GetComponent<DialogComponent>();
AIChat = UnityGameFramework.Runtime.GameEntry.GetComponent<AIChatComponent>();
} }
} }

View File

@ -0,0 +1,534 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Definition.DataStruct;
using GameFramework;
using Network;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace CustomComponent
{
[DisallowMultipleComponent]
public class AIChatComponent : GameFrameworkComponent
{
[Header("OpenAI Config")] [SerializeField]
private string _apiBaseUrl = "https://api.openai.com";
[SerializeField] private string _apiKey = string.Empty;
[SerializeField] private string _chatCompletionsPath = "/v1/chat/completions";
[SerializeField] private string _heartbeatPath = "/v1/models";
[SerializeField] private string _model = "gpt-4o-mini";
[Header("Request Options")] [SerializeField]
private bool _autoInitializeOnEnable = true;
[SerializeField] private int _chatTimeoutSeconds = 60;
[SerializeField] private float _temperature = 0.7f;
[SerializeField] [TextArea(2, 6)] private string _systemPrompt = string.Empty;
[Header("Heartbeat")] [SerializeField] private float _heartbeatIntervalSeconds = 5f;
[SerializeField] private int _heartbeatTimeoutSeconds = 8;
private readonly List<OpenAIStreamChunk> _chunkCache = new List<OpenAIStreamChunk>();
private readonly StringBuilder _assistantResponseCache = new StringBuilder();
private readonly Queue<string> _pendingSsePayloads = new Queue<string>();
private readonly object _streamQueueLock = new object();
private readonly OpenAIHttpNetworkService _networkService = new OpenAIHttpNetworkService();
private Coroutine _heartbeatCoroutine;
private Coroutine _chatCoroutine;
private CancellationTokenSource _heartbeatRequestCancellation;
private CancellationTokenSource _chatRequestCancellation;
private bool _isInitialized;
private bool _isHeartbeatRequesting;
private bool _streamDoneReceived;
public bool IsInitialized => _isInitialized;
public bool IsRequesting => _chatCoroutine != null;
public bool IsEndpointReachable { get; private set; }
public bool IsConnectionValid { get; private set; }
public long LastHeartbeatStatusCode { get; private set; }
public string LastHeartbeatErrorMessage { get; private set; } = string.Empty;
public string LastRequestErrorMessage { get; private set; } = string.Empty;
public string CachedResponseText => _assistantResponseCache.ToString();
public IReadOnlyList<OpenAIStreamChunk> CachedChunks => _chunkCache;
public event Action<OpenAIStreamChunk> StreamChunkReceived;
public event Action<string> StreamTextUpdated;
public event Action<string> StreamRequestCompleted;
public event Action<string> StreamRequestFailed;
private void OnEnable()
{
if (_autoInitializeOnEnable)
{
Initialize();
}
}
private void OnDisable()
{
StopHeartbeat();
CancelCurrentRequest();
}
private void OnDestroy()
{
StopHeartbeat();
CancelCurrentRequest();
_networkService.Dispose();
}
public void Initialize()
{
_isInitialized = true;
StartHeartbeat();
}
public void StartHeartbeat()
{
if (_heartbeatCoroutine != null)
{
return;
}
_heartbeatCoroutine = StartCoroutine(HeartbeatLoop());
}
public void StopHeartbeat()
{
if (_heartbeatRequestCancellation != null && !_heartbeatRequestCancellation.IsCancellationRequested)
{
_heartbeatRequestCancellation.Cancel();
}
if (_heartbeatCoroutine == null)
{
return;
}
StopCoroutine(_heartbeatCoroutine);
_heartbeatCoroutine = null;
}
public void TriggerHeartbeat()
{
StartCoroutine(SendHeartbeatOnce());
}
public bool SendChat(string userInput)
{
return SendChat(userInput, string.Empty);
}
public bool SendChat(string userInput, string extraSystemPrompt)
{
if (string.IsNullOrWhiteSpace(userInput))
{
LastRequestErrorMessage = "AI chat request failed. userInput is empty.";
StreamRequestFailed?.Invoke(LastRequestErrorMessage);
Log.Warning(LastRequestErrorMessage);
return false;
}
if (_chatCoroutine != null)
{
LastRequestErrorMessage = "AI chat request failed. Previous request is still running.";
StreamRequestFailed?.Invoke(LastRequestErrorMessage);
Log.Warning(LastRequestErrorMessage);
return false;
}
_chatCoroutine = StartCoroutine(SendChatCoroutine(userInput, extraSystemPrompt));
return true;
}
public void CancelCurrentRequest()
{
if (_chatRequestCancellation != null && !_chatRequestCancellation.IsCancellationRequested)
{
_chatRequestCancellation.Cancel();
}
}
public void ClearChatCache()
{
_chunkCache.Clear();
_assistantResponseCache.Length = 0;
_streamDoneReceived = false;
lock (_streamQueueLock)
{
_pendingSsePayloads.Clear();
}
}
public string BuildOpenAIRequestBody(string userInput)
{
return BuildOpenAIRequestBody(userInput, string.Empty);
}
public string BuildOpenAIRequestBody(string userInput, string extraSystemPrompt)
{
OpenAIChatRequest requestBody = BuildRequestData(userInput, extraSystemPrompt);
return Utility.Json.ToJson(requestBody);
}
private IEnumerator HeartbeatLoop()
{
while (true)
{
yield return SendHeartbeatOnce();
yield return new WaitForSecondsRealtime(Mathf.Max(0.1f, _heartbeatIntervalSeconds));
}
}
private IEnumerator SendHeartbeatOnce()
{
if (_isHeartbeatRequesting)
{
yield break;
}
_isHeartbeatRequesting = true;
try
{
string heartbeatUrl = BuildEndpointUrl(_heartbeatPath);
if (string.IsNullOrWhiteSpace(heartbeatUrl))
{
UpdateHeartbeatState(false, false, 0, "Heartbeat failed. URL is empty.");
yield break;
}
if (_heartbeatRequestCancellation != null)
{
_heartbeatRequestCancellation.Dispose();
_heartbeatRequestCancellation = null;
}
_heartbeatRequestCancellation = new CancellationTokenSource();
Task<OpenAIHeartbeatResult> heartbeatTask = _networkService.SendHeartbeatAsync(
heartbeatUrl,
_apiKey,
_heartbeatTimeoutSeconds,
_heartbeatRequestCancellation.Token);
yield return WaitTask(heartbeatTask);
if (heartbeatTask.IsFaulted)
{
UpdateHeartbeatState(false, false, 0, GetTaskErrorMessage(heartbeatTask.Exception));
}
else if (heartbeatTask.IsCanceled)
{
UpdateHeartbeatState(false, false, 0, "Heartbeat canceled.");
}
else
{
OpenAIHeartbeatResult result = heartbeatTask.Result;
UpdateHeartbeatState(result.IsEndpointReachable, result.IsConnectionValid, result.StatusCode,
result.ErrorMessage);
}
}
finally
{
if (_heartbeatRequestCancellation != null)
{
_heartbeatRequestCancellation.Dispose();
_heartbeatRequestCancellation = null;
}
_isHeartbeatRequesting = false;
}
}
private IEnumerator SendChatCoroutine(string userInput, string extraSystemPrompt)
{
LastRequestErrorMessage = string.Empty;
ClearChatCache();
string chatUrl = BuildEndpointUrl(_chatCompletionsPath);
if (string.IsNullOrWhiteSpace(chatUrl))
{
LastRequestErrorMessage = "AI chat request failed. URL is empty.";
StreamRequestFailed?.Invoke(LastRequestErrorMessage);
Log.Warning(LastRequestErrorMessage);
_chatCoroutine = null;
yield break;
}
if (_chatRequestCancellation != null)
{
_chatRequestCancellation.Dispose();
_chatRequestCancellation = null;
}
_chatRequestCancellation = new CancellationTokenSource();
string requestBody = BuildOpenAIRequestBody(userInput, extraSystemPrompt);
try
{
Task<OpenAIStreamResult> requestTask = _networkService.StreamChatAsync(
chatUrl,
_apiKey,
requestBody,
_chatTimeoutSeconds,
EnqueueSsePayload,
_chatRequestCancellation.Token);
while (!requestTask.IsCompleted)
{
FlushPendingSsePayloads();
yield return null;
}
FlushPendingSsePayloads();
if (requestTask.IsFaulted)
{
LastRequestErrorMessage = GetTaskErrorMessage(requestTask.Exception);
StreamRequestFailed?.Invoke(LastRequestErrorMessage);
Log.Warning("AI chat request failed. {0}", LastRequestErrorMessage);
yield break;
}
OpenAIStreamResult result = requestTask.Result;
if (!result.IsSuccess)
{
LastRequestErrorMessage = BuildRequestErrorMessage(result);
StreamRequestFailed?.Invoke(LastRequestErrorMessage);
Log.Warning("AI chat request failed. {0}", LastRequestErrorMessage);
yield break;
}
if (!_streamDoneReceived && _chunkCache.Count > 0)
{
Log.Warning("AI chat stream completed without receiving [DONE] marker.");
}
StreamRequestCompleted?.Invoke(_assistantResponseCache.ToString());
}
finally
{
if (_chatRequestCancellation != null)
{
_chatRequestCancellation.Dispose();
_chatRequestCancellation = null;
}
_chatCoroutine = null;
}
}
private void EnqueueSsePayload(string payload)
{
if (string.IsNullOrWhiteSpace(payload))
{
return;
}
lock (_streamQueueLock)
{
_pendingSsePayloads.Enqueue(payload);
}
}
private void FlushPendingSsePayloads()
{
while (true)
{
string payload;
lock (_streamQueueLock)
{
if (_pendingSsePayloads.Count <= 0)
{
break;
}
payload = _pendingSsePayloads.Dequeue();
}
ParseSsePayload(payload);
}
}
private void ParseSsePayload(string payload)
{
if (string.IsNullOrWhiteSpace(payload))
{
return;
}
if (string.Equals(payload, "[DONE]", StringComparison.Ordinal))
{
_streamDoneReceived = true;
return;
}
OpenAIStreamChunk chunk;
try
{
chunk = Utility.Json.ToObject<OpenAIStreamChunk>(payload);
}
catch (Exception exception)
{
Log.Warning("AI chat chunk parse failed. reason='{0}'", exception.Message);
return;
}
if (chunk == null)
{
return;
}
_chunkCache.Add(chunk);
StreamChunkReceived?.Invoke(chunk);
string textDelta = ExtractTextDelta(chunk);
if (string.IsNullOrEmpty(textDelta))
{
return;
}
_assistantResponseCache.Append(textDelta);
StreamTextUpdated?.Invoke(textDelta);
}
private void UpdateHeartbeatState(bool endpointReachable, bool connectionValid, long statusCode,
string errorMessage)
{
IsEndpointReachable = endpointReachable;
IsConnectionValid = connectionValid;
LastHeartbeatStatusCode = statusCode;
LastHeartbeatErrorMessage = errorMessage ?? string.Empty;
}
private OpenAIChatRequest BuildRequestData(string userInput, string extraSystemPrompt)
{
OpenAIChatRequest request = new OpenAIChatRequest
{
model = _model,
stream = true,
temperature = (double)Mathf.Clamp(_temperature, 0f, 2f),
messages = new List<OpenAIMessage>()
};
if (!string.IsNullOrWhiteSpace(_systemPrompt))
{
request.messages.Add(new OpenAIMessage
{
role = "system",
content = _systemPrompt
});
}
if (!string.IsNullOrWhiteSpace(extraSystemPrompt))
{
request.messages.Add(new OpenAIMessage
{
role = "system",
content = extraSystemPrompt
});
}
request.messages.Add(new OpenAIMessage
{
role = "user",
content = userInput
});
return request;
}
private string BuildEndpointUrl(string pathOrUrl)
{
if (string.IsNullOrWhiteSpace(pathOrUrl))
{
return string.Empty;
}
if (pathOrUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase) ||
pathOrUrl.StartsWith("http://", StringComparison.OrdinalIgnoreCase))
{
return pathOrUrl.Trim();
}
if (string.IsNullOrWhiteSpace(_apiBaseUrl))
{
return string.Empty;
}
return Utility.Text.Format("{0}/{1}", _apiBaseUrl.TrimEnd('/'), pathOrUrl.TrimStart('/'));
}
private static IEnumerator WaitTask(Task task)
{
while (!task.IsCompleted)
{
yield return null;
}
}
private static string GetTaskErrorMessage(AggregateException exception)
{
if (exception == null)
{
return "Unknown task error.";
}
Exception baseException = exception.GetBaseException();
return baseException != null ? baseException.Message : exception.Message;
}
private static string BuildRequestErrorMessage(OpenAIStreamResult result)
{
if (result == null)
{
return "AI chat request failed. Result is null.";
}
if (result.IsCanceled)
{
return "AI chat request canceled.";
}
if (string.IsNullOrEmpty(result.ErrorBody))
{
return string.Format("{0} (status={1})", result.ErrorMessage, result.StatusCode.ToString());
}
return string.Format("{0} (status={1}) body={2}", result.ErrorMessage, result.StatusCode.ToString(),
result.ErrorBody);
}
private static string ExtractTextDelta(OpenAIStreamChunk chunk)
{
if (chunk == null || chunk.choices == null || chunk.choices.Length == 0)
{
return string.Empty;
}
StringBuilder builder = null;
foreach (var choice in chunk.choices)
{
if (choice == null || choice.delta == null || string.IsNullOrEmpty(choice.delta.content))
{
continue;
}
if (builder == null)
{
builder = new StringBuilder();
}
builder.Append(choice.delta.content);
}
return builder != null ? builder.ToString() : string.Empty;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 721362e43780c4043ae6e7ce92463755
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
namespace Definition.DataStruct
{
[Serializable]
public sealed class OpenAIChatRequest
{
public string model;
public bool stream;
public double temperature;
public List<OpenAIMessage> messages;
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4ae65566eea74645bfbebbd8edc2eeb2
timeCreated: 1772005238

View File

@ -0,0 +1,11 @@
using System;
namespace Definition.DataStruct
{
[Serializable]
public sealed class OpenAIMessage
{
public string role;
public string content;
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: da985afe4cdd41b985cdc55b16669248
timeCreated: 1772005281

View File

@ -0,0 +1,12 @@
using System;
namespace Definition.DataStruct
{
[Serializable]
public sealed class OpenAIStreamChoice
{
public int index;
public OpenAIStreamDelta delta;
public string finish_reason;
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 68ead73e1887412caf82bc156fe7960b
timeCreated: 1772005319

View File

@ -0,0 +1,14 @@
using System;
namespace Definition.DataStruct
{
[Serializable]
public sealed class OpenAIStreamChunk
{
public string id;
public string @object;
public int created;
public string model;
public OpenAIStreamChoice[] choices;
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8aaa860de9da4771a22469c918a8346e
timeCreated: 1772005300

View File

@ -0,0 +1,11 @@
using System;
namespace Definition.DataStruct
{
[Serializable]
public sealed class OpenAIStreamDelta
{
public string role;
public string content;
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 151022fd6325477aa9810f1914030419
timeCreated: 1772005339

View File

@ -55,5 +55,7 @@ namespace UI
BubbleDialogForm = 106, BubbleDialogForm = 106,
MainOverlayForm = 107, MainOverlayForm = 107,
AIChatForm = 108,
} }
} }

View File

@ -5,7 +5,7 @@
// Feedback: mailto:ellan@gameframework.cn // Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------ //------------------------------------------------------------
namespace StarForce namespace Network
{ {
public abstract class CSPacketBase : PacketBase public abstract class CSPacketBase : PacketBase
{ {

View File

@ -5,7 +5,7 @@
// Feedback: mailto:ellan@gameframework.cn // Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------ //------------------------------------------------------------
namespace StarForce namespace Network
{ {
public sealed class CSPacketHeader : PacketHeaderBase public sealed class CSPacketHeader : PacketHeaderBase
{ {

View File

@ -16,7 +16,7 @@ using System.IO;
using System.Reflection; using System.Reflection;
using UnityGameFramework.Runtime; using UnityGameFramework.Runtime;
namespace StarForce namespace Network
{ {
public class NetworkChannelHelper : INetworkChannelHelper public class NetworkChannelHelper : INetworkChannelHelper
{ {

View File

@ -0,0 +1,340 @@
using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Network
{
public sealed class OpenAIHttpNetworkService : IDisposable
{
private readonly HttpClient _httpClient;
private bool _disposed;
public OpenAIHttpNetworkService()
{
HttpClientHandler handler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
_httpClient = new HttpClient(handler);
}
public async Task<OpenAIHeartbeatResult> SendHeartbeatAsync(string url, string apiKey, int timeoutSeconds,
CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(url))
{
return OpenAIHeartbeatResult.CreateFailure(false, false, 0, "Heartbeat failed. URL is empty.");
}
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url))
{
ApplyAuthorization(request, apiKey);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
using (CancellationTokenSource timeoutCts = new CancellationTokenSource(
TimeSpan.FromSeconds(Math.Max(1, timeoutSeconds))))
{
using (CancellationTokenSource linkedCts =
CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token))
{
try
{
using (HttpResponseMessage response = await _httpClient
.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, linkedCts.Token)
.ConfigureAwait(false))
{
long statusCode = (long)response.StatusCode;
bool isHttpSuccess = response.IsSuccessStatusCode;
if (isHttpSuccess)
{
return OpenAIHeartbeatResult.CreateSuccess(statusCode);
}
if (statusCode == 401 || statusCode == 403)
{
return OpenAIHeartbeatResult.CreateFailure(true, false, statusCode,
"Authentication failed. API key may be invalid.");
}
string errorBody = await TryReadContentAsync(response.Content).ConfigureAwait(false);
string errorMessage = string.IsNullOrEmpty(errorBody)
? string.Format("Heartbeat failed with HTTP {0}.", statusCode.ToString())
: string.Format("Heartbeat failed with HTTP {0}. body={1}", statusCode.ToString(),
errorBody);
return OpenAIHeartbeatResult.CreateFailure(true, false, statusCode, errorMessage);
}
}
catch (OperationCanceledException)
{
if (cancellationToken.IsCancellationRequested)
{
return OpenAIHeartbeatResult.CreateFailure(false, false, 0,
"Heartbeat canceled by caller.");
}
return OpenAIHeartbeatResult.CreateFailure(false, false, 0, "Heartbeat timeout.");
}
catch (HttpRequestException exception)
{
return OpenAIHeartbeatResult.CreateFailure(false, false, 0, exception.Message);
}
catch (Exception exception)
{
return OpenAIHeartbeatResult.CreateFailure(false, false, 0, exception.Message);
}
}
}
}
}
public async Task<OpenAIStreamResult> StreamChatAsync(
string url,
string apiKey,
string requestBodyJson,
int timeoutSeconds,
Action<string> onSseDataPayload,
CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(url))
{
return OpenAIStreamResult.CreateFailure(false, false, 0, "AI chat request failed. URL is empty.",
string.Empty);
}
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url))
{
ApplyAuthorization(request, apiKey);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/event-stream"));
request.Content = new StringContent(requestBodyJson ?? string.Empty, Encoding.UTF8, "application/json");
using (CancellationTokenSource timeoutCts = new CancellationTokenSource(
TimeSpan.FromSeconds(Math.Max(1, timeoutSeconds))))
{
using (CancellationTokenSource linkedCts =
CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token))
{
try
{
using (HttpResponseMessage response = await _httpClient
.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, linkedCts.Token)
.ConfigureAwait(false))
{
long statusCode = (long)response.StatusCode;
if (!response.IsSuccessStatusCode)
{
string errorBody = await TryReadContentAsync(response.Content).ConfigureAwait(false);
string errorMessage = string.Format("HTTP {0} {1}", statusCode.ToString(),
response.ReasonPhrase ?? string.Empty);
return OpenAIStreamResult.CreateFailure(true, false, statusCode, errorMessage,
errorBody);
}
using (Stream stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
while (true)
{
string line =
await WaitReadLineAsync(reader, linkedCts.Token).ConfigureAwait(false);
if (line == null)
{
break;
}
if (!line.StartsWith("data:", StringComparison.OrdinalIgnoreCase))
{
continue;
}
string payload = line.Substring(5).Trim();
if (string.IsNullOrEmpty(payload))
{
continue;
}
onSseDataPayload?.Invoke(payload);
}
}
return OpenAIStreamResult.CreateSuccess(statusCode);
}
}
catch (OperationCanceledException)
{
return OpenAIStreamResult.CreateCanceled();
}
catch (HttpRequestException exception)
{
return OpenAIStreamResult.CreateFailure(false, false, 0, exception.Message, string.Empty);
}
catch (Exception exception)
{
return OpenAIStreamResult.CreateFailure(false, false, 0, exception.Message, string.Empty);
}
}
}
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private static void ApplyAuthorization(HttpRequestMessage request, string apiKey)
{
if (request == null || string.IsNullOrWhiteSpace(apiKey))
{
return;
}
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey.Trim());
}
private static async Task<string> WaitReadLineAsync(StreamReader reader, CancellationToken cancellationToken)
{
Task<string> readLineTask = reader.ReadLineAsync();
if (readLineTask.IsCompleted || !cancellationToken.CanBeCanceled)
{
return await readLineTask.ConfigureAwait(false);
}
TaskCompletionSource<bool> cancellationTaskSource = new TaskCompletionSource<bool>();
using (cancellationToken.Register(() => cancellationTaskSource.TrySetResult(true)))
{
Task completedTask = await Task.WhenAny(readLineTask, cancellationTaskSource.Task).ConfigureAwait(false);
if (completedTask != readLineTask)
{
throw new OperationCanceledException(cancellationToken);
}
}
return await readLineTask.ConfigureAwait(false);
}
private static async Task<string> TryReadContentAsync(HttpContent content)
{
if (content == null)
{
return string.Empty;
}
try
{
return await content.ReadAsStringAsync().ConfigureAwait(false);
}
catch
{
return string.Empty;
}
}
private void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
if (disposing)
{
_httpClient.Dispose();
}
_disposed = true;
}
}
public sealed class OpenAIHeartbeatResult
{
public bool IsEndpointReachable { get; private set; }
public bool IsConnectionValid { get; private set; }
public long StatusCode { get; private set; }
public string ErrorMessage { get; private set; }
public static OpenAIHeartbeatResult CreateSuccess(long statusCode)
{
return new OpenAIHeartbeatResult
{
IsEndpointReachable = true,
IsConnectionValid = true,
StatusCode = statusCode,
ErrorMessage = string.Empty
};
}
public static OpenAIHeartbeatResult CreateFailure(bool endpointReachable, bool connectionValid, long statusCode,
string errorMessage)
{
return new OpenAIHeartbeatResult
{
IsEndpointReachable = endpointReachable,
IsConnectionValid = connectionValid,
StatusCode = statusCode,
ErrorMessage = errorMessage ?? string.Empty
};
}
}
public sealed class OpenAIStreamResult
{
public bool IsSuccess { get; private set; }
public bool IsCanceled { get; private set; }
public bool IsEndpointReachable { get; private set; }
public bool IsConnectionValid { get; private set; }
public long StatusCode { get; private set; }
public string ErrorMessage { get; private set; }
public string ErrorBody { get; private set; }
public static OpenAIStreamResult CreateSuccess(long statusCode)
{
return new OpenAIStreamResult
{
IsSuccess = true,
IsCanceled = false,
IsEndpointReachable = true,
IsConnectionValid = true,
StatusCode = statusCode,
ErrorMessage = string.Empty,
ErrorBody = string.Empty
};
}
public static OpenAIStreamResult CreateCanceled()
{
return new OpenAIStreamResult
{
IsSuccess = false,
IsCanceled = true,
IsEndpointReachable = false,
IsConnectionValid = false,
StatusCode = 0,
ErrorMessage = "Request canceled.",
ErrorBody = string.Empty
};
}
public static OpenAIStreamResult CreateFailure(bool endpointReachable, bool connectionValid, long statusCode,
string errorMessage, string errorBody)
{
return new OpenAIStreamResult
{
IsSuccess = false,
IsCanceled = false,
IsEndpointReachable = endpointReachable,
IsConnectionValid = connectionValid,
StatusCode = statusCode,
ErrorMessage = errorMessage ?? string.Empty,
ErrorBody = errorBody ?? string.Empty
};
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8b1df451f58f9f04ea0357989526f6a7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -8,7 +8,7 @@
using ProtoBuf; using ProtoBuf;
using System; using System;
namespace StarForce namespace Network
{ {
[Serializable, ProtoContract(Name = @"CSHeartBeat")] [Serializable, ProtoContract(Name = @"CSHeartBeat")]
public class CSHeartBeat : CSPacketBase public class CSHeartBeat : CSPacketBase

View File

@ -8,7 +8,7 @@
using ProtoBuf; using ProtoBuf;
using System; using System;
namespace StarForce namespace Network
{ {
[Serializable, ProtoContract(Name = @"SCHeartBeat")] [Serializable, ProtoContract(Name = @"SCHeartBeat")]
public class SCHeartBeat : SCPacketBase public class SCHeartBeat : SCPacketBase

View File

@ -8,7 +8,7 @@
using GameFramework.Network; using GameFramework.Network;
using ProtoBuf; using ProtoBuf;
namespace StarForce namespace Network
{ {
public abstract class PacketBase : Packet, IExtensible public abstract class PacketBase : Packet, IExtensible
{ {

View File

@ -8,7 +8,7 @@
using GameFramework.Network; using GameFramework.Network;
using UnityGameFramework.Runtime; using UnityGameFramework.Runtime;
namespace StarForce namespace Network
{ {
public class SCHeartBeatHandler : PacketHandlerBase public class SCHeartBeatHandler : PacketHandlerBase
{ {

View File

@ -7,7 +7,7 @@
using GameFramework.Network; using GameFramework.Network;
namespace StarForce namespace Network
{ {
public abstract class PacketHandlerBase : IPacketHandler public abstract class PacketHandlerBase : IPacketHandler
{ {

View File

@ -8,7 +8,7 @@
using GameFramework; using GameFramework;
using GameFramework.Network; using GameFramework.Network;
namespace StarForce namespace Network
{ {
public abstract class PacketHeaderBase : IPacketHeader, IReference public abstract class PacketHeaderBase : IPacketHeader, IReference
{ {

View File

@ -5,7 +5,7 @@
// Feedback: mailto:ellan@gameframework.cn // Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------ //------------------------------------------------------------
namespace StarForce namespace Network
{ {
public enum PacketType : byte public enum PacketType : byte
{ {

View File

@ -5,7 +5,7 @@
// Feedback: mailto:ellan@gameframework.cn // Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------ //------------------------------------------------------------
namespace StarForce namespace Network
{ {
public abstract class SCPacketBase : PacketBase public abstract class SCPacketBase : PacketBase
{ {

View File

@ -5,7 +5,7 @@
// Feedback: mailto:ellan@gameframework.cn // Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------ //------------------------------------------------------------
namespace StarForce namespace Network
{ {
public sealed class SCPacketHeader : PacketHeaderBase public sealed class SCPacketHeader : PacketHeaderBase
{ {

View File

@ -1,21 +1,12 @@
using Definition.Enum; using Definition.Enum;
using System.Collections.Generic; using System.Collections.Generic;
using CustomComponent; using CustomComponent;
using Event;
using GameFramework.Event;
using UI; using UI;
using UnityEngine; using UnityEngine;
using UnityGameFramework.Runtime;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>; using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
namespace Procedure namespace Procedure
{ {
/// <summary>
/// 斗拱拼装流程:
/// 1. 进入流程后准备组件与事件;
/// 2. 启动并监控拼装关卡(成功或超时);
/// 3. 结算后短暂等待并重开场景。
/// </summary>
public class ProcedureCombine : ProcedureBase public class ProcedureCombine : ProcedureBase
{ {
#region Property #region Property
@ -42,10 +33,15 @@ namespace Procedure
base.OnEnter(procedureOwner); base.OnEnter(procedureOwner);
//InitializeProcedureState(); //InitializeProcedureState();
GameEntry.Dialog.Init(1); //GameEntry.Dialog.Init(1);
//GameEntry.Dialog.StartDialog(1001); //GameEntry.Dialog.StartDialog(1001);
GameEntry.Dialog.StartDialog(1002); //GameEntry.Dialog.StartDialog(1002);
AIChatFormContext context = new AIChatFormContext();
AIChatFormController controller = new AIChatFormController();
context.Controller = controller;
controller.OpenUI(context);
} }
/// <summary> /// <summary>

View File

@ -11,17 +11,20 @@ using UnityEngine.EventSystems;
namespace UI namespace UI
{ {
public class CommonButton : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler public class CommonButton : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler,
IPointerUpHandler
{ {
private const float FadeTime = 0.3f; private const float FadeTime = 0.3f;
private const float OnHoverAlpha = 0.7f; private const float OnHoverAlpha = 0.7f;
private const float OnClickAlpha = 0.6f; private const float OnClickAlpha = 0.6f;
[SerializeField] [SerializeField] private bool _allowFade = true;
private UnityEvent m_OnHover = null;
[SerializeField] [SerializeField] private UnityEvent m_OnHover = null;
private UnityEvent m_OnClick = null;
[SerializeField] private UnityEvent m_OnClick = null;
[SerializeField] private UnityEvent m_OnHoverEnd = null;
private CanvasGroup m_CanvasGroup = null; private CanvasGroup m_CanvasGroup = null;
@ -43,8 +46,9 @@ namespace UI
} }
StopAllCoroutines(); StopAllCoroutines();
StartCoroutine(m_CanvasGroup.FadeToAlpha(OnHoverAlpha, FadeTime)); if (_allowFade)
m_OnHover.Invoke(); StartCoroutine(m_CanvasGroup.FadeToAlpha(OnHoverAlpha, FadeTime));
m_OnHover?.Invoke();
} }
public void OnPointerExit(PointerEventData eventData) public void OnPointerExit(PointerEventData eventData)
@ -55,7 +59,9 @@ namespace UI
} }
StopAllCoroutines(); StopAllCoroutines();
StartCoroutine(m_CanvasGroup.FadeToAlpha(1f, FadeTime)); if (_allowFade)
StartCoroutine(m_CanvasGroup.FadeToAlpha(1f, FadeTime));
m_OnHoverEnd?.Invoke();
} }
public void OnPointerDown(PointerEventData eventData) public void OnPointerDown(PointerEventData eventData)
@ -66,7 +72,7 @@ namespace UI
} }
m_CanvasGroup.alpha = OnClickAlpha; m_CanvasGroup.alpha = OnClickAlpha;
m_OnClick.Invoke(); m_OnClick?.Invoke();
} }
public void OnPointerUp(PointerEventData eventData) public void OnPointerUp(PointerEventData eventData)

View File

@ -0,0 +1,13 @@
using System.Collections.Generic;
namespace UI
{
public class AIChatFormContext : UIContext
{
public AIChatFormController Controller;
public string Title = "AI Chat";
public bool ClearHistoryOnOpen = true;
public int LanguageMode = 0;
public List<AIChatMessageContext> Messages = new List<AIChatMessageContext>();
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bd7b7032876cfea4fba511fe86a86ca4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
namespace UI
{
public sealed class AIChatMessageContext : UIContext
{
public bool IsPlayer;
public string Content;
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0b757f1a76817344396df2fbc235f7a6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
namespace UI
{
public class AIDialogItemContext : UIContext
{
public float ParentWidth;
public string Content;
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2740182b0799e4b4288755e07fd7244b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,7 @@
namespace UI
{
public class PlayerDialogItemContext : UIContext
{
public string Content;
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 10f44b172e664044fa1747d2e45f8c4f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,376 @@
using System.Collections.Generic;
using System.Text;
using CustomComponent;
using GameFramework.Event;
using UnityGameFramework.Runtime;
namespace UI
{
public class AIChatFormController : IFormController<AIChatFormContext>
{
private AIChatFormContext _context;
private AIChatForm _aiChatForm;
private int? _formSerialId;
private bool _pendingRefresh;
private bool _aiChatEventsBound;
private bool _isStreaming;
private int _streamingMessageIndex = -1;
private readonly StringBuilder _streamingMessageBuffer = new StringBuilder();
public AIChatFormController()
{
GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, OnCloseUIFormComplete);
}
public int? OpenUI(AIChatFormContext context)
{
if (context == null)
{
Log.Warning("AIChatFormController open failed. context is null.");
return null;
}
EnsureAIChatEventBinding();
context.Controller = this;
context.Messages ??= new List<AIChatMessageContext>();
_context = context;
if (_aiChatForm != null)
{
_aiChatForm.RefreshUI(_context);
return _formSerialId;
}
CloseUI();
_pendingRefresh = true;
_formSerialId = GameEntry.UI.OpenUIForm(UIFormId.AIChatForm, context);
return _formSerialId;
}
public void CloseUI()
{
_pendingRefresh = false;
if (_formSerialId.HasValue)
{
GameEntry.UI.CloseUIForm(_formSerialId.Value);
return;
}
if (_aiChatForm != null)
{
_aiChatForm.Close();
}
}
public void SubmitPlayerMessage(string input, int languageMode)
{
string trimmedInput = input == null ? string.Empty : input.Trim();
if (string.IsNullOrEmpty(trimmedInput))
{
return;
}
if (_isStreaming)
{
PublishErrorMessage("AI is still responding. Please wait.");
return;
}
EnsureAIChatEventBinding();
if (_context == null)
{
_context = new AIChatFormContext
{
Controller = this,
LanguageMode = 0,
Messages = new List<AIChatMessageContext>()
};
}
_context.LanguageMode = languageMode;
AddMessageToContext(true, trimmedInput);
_aiChatForm?.AppendPlayerDialog(new PlayerDialogItemContext
{
Content = trimmedInput
});
AIChatComponent aiChat = GameEntry.AIChat;
if (aiChat == null)
{
PublishErrorMessage("AIChatComponent is missing.");
return;
}
bool sendStarted = aiChat.SendChat(trimmedInput, BuildLanguageInstruction(languageMode));
if (!sendStarted)
{
PublishErrorMessage(string.IsNullOrEmpty(aiChat.LastRequestErrorMessage)
? "Failed to start AI chat request."
: aiChat.LastRequestErrorMessage);
return;
}
_isStreaming = true;
_streamingMessageIndex = -1;
_streamingMessageBuffer.Length = 0;
_aiChatForm?.SetInputInteractable(false);
}
private static string BuildLanguageInstruction(int languageMode)
{
if (languageMode == 1)
{
return "\u8bf7\u4f7f\u7528\u6587\u8a00\u6587\u56de\u7b54\uff0c\u8bed\u8a00\u5c3d\u91cf\u7b80\u6d01\u3001\u96c5\u6b63\u3001\u901a\u987a\u3002";
}
return "\u8bf7\u4f7f\u7528\u73b0\u4ee3\u767d\u8bdd\u6587\u56de\u7b54\uff0c\u8bed\u8a00\u6e05\u6670\u81ea\u7136\u3001\u6613\u4e8e\u7406\u89e3\u3002";
}
~AIChatFormController()
{
GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, OnCloseUIFormComplete);
UnbindAIChatEvents();
}
private void EnsureAIChatEventBinding()
{
if (_aiChatEventsBound)
{
return;
}
AIChatComponent aiChat = GameEntry.AIChat;
if (aiChat == null)
{
return;
}
aiChat.StreamTextUpdated += OnStreamTextUpdated;
aiChat.StreamRequestCompleted += OnStreamRequestCompleted;
aiChat.StreamRequestFailed += OnStreamRequestFailed;
_aiChatEventsBound = true;
}
private void UnbindAIChatEvents()
{
if (!_aiChatEventsBound)
{
return;
}
AIChatComponent aiChat = GameEntry.AIChat;
if (aiChat == null)
{
_aiChatEventsBound = false;
return;
}
aiChat.StreamTextUpdated -= OnStreamTextUpdated;
aiChat.StreamRequestCompleted -= OnStreamRequestCompleted;
aiChat.StreamRequestFailed -= OnStreamRequestFailed;
_aiChatEventsBound = false;
}
private void TryRefreshUI()
{
if (_context == null)
{
return;
}
if (_aiChatForm == null)
{
_pendingRefresh = true;
return;
}
_aiChatForm.RefreshUI(_context);
_pendingRefresh = false;
}
private void AddMessageToContext(bool isPlayer, string content)
{
if (_context == null)
{
return;
}
_context.Messages ??= new List<AIChatMessageContext>();
_context.Messages.Add(new AIChatMessageContext
{
IsPlayer = isPlayer,
Content = content
});
}
private void PublishErrorMessage(string errorMessage)
{
string content = string.IsNullOrEmpty(errorMessage) ? "Unknown error." : errorMessage;
string formattedContent = "[Error] " + content;
AddMessageToContext(false, formattedContent);
_aiChatForm?.AppendAIDialog(new AIDialogItemContext
{
ParentWidth = GetContentWidth(),
Content = formattedContent
});
_aiChatForm?.SetInputInteractable(true);
_isStreaming = false;
_streamingMessageIndex = -1;
_streamingMessageBuffer.Length = 0;
}
private void EndStreaming(string finalAIContent)
{
string content = string.IsNullOrEmpty(finalAIContent) ? string.Empty : finalAIContent;
if (_streamingMessageIndex >= 0)
{
_aiChatForm?.UpdateAIDialog(_streamingMessageIndex, new AIDialogItemContext
{
ParentWidth = GetContentWidth(),
Content = content
});
}
else if (!string.IsNullOrEmpty(content))
{
_aiChatForm?.AppendAIDialog(new AIDialogItemContext
{
ParentWidth = GetContentWidth(),
Content = content
});
}
if (!string.IsNullOrEmpty(content))
{
AddMessageToContext(false, content);
}
_isStreaming = false;
_streamingMessageIndex = -1;
_streamingMessageBuffer.Length = 0;
_aiChatForm?.SetInputInteractable(true);
_aiChatForm?.FocusInputField();
}
private void OnStreamTextUpdated(string delta)
{
if (!_isStreaming)
{
return;
}
if (string.IsNullOrEmpty(delta))
{
return;
}
_streamingMessageBuffer.Append(delta);
if (_streamingMessageIndex < 0 && _aiChatForm != null)
{
_streamingMessageIndex = _aiChatForm.AppendAIDialog(new AIDialogItemContext
{
ParentWidth = GetContentWidth(),
Content = string.Empty
});
}
if (_streamingMessageIndex >= 0)
{
_aiChatForm?.UpdateAIDialog(_streamingMessageIndex, new AIDialogItemContext
{
ParentWidth = GetContentWidth(),
Content = _streamingMessageBuffer.ToString()
});
}
}
private float GetContentWidth()
{
return _aiChatForm != null ? _aiChatForm.ContentSize.x : 0f;
}
private void OnStreamRequestCompleted(string response)
{
if (!_isStreaming)
{
return;
}
string finalText = string.IsNullOrEmpty(response) ? _streamingMessageBuffer.ToString() : response;
EndStreaming(finalText);
}
private void OnStreamRequestFailed(string errorMessage)
{
if (!_isStreaming)
{
PublishErrorMessage(errorMessage);
return;
}
string partialContent = _streamingMessageBuffer.ToString();
if (string.IsNullOrEmpty(partialContent))
{
EndStreaming("[Error] " + (string.IsNullOrEmpty(errorMessage) ? "Request failed." : errorMessage));
return;
}
EndStreaming(partialContent + "\n\n[Error] " +
(string.IsNullOrEmpty(errorMessage) ? "Request failed." : errorMessage));
}
private void OnOpenUIFormSuccess(object sender, GameEventArgs e)
{
if (!(e is OpenUIFormSuccessEventArgs args))
{
return;
}
if (!_formSerialId.HasValue)
{
return;
}
if (args.UIForm == null || args.UIForm.SerialId != _formSerialId.Value || args.UserData != _context)
{
return;
}
_aiChatForm = args.UIForm.Logic as AIChatForm;
if (_aiChatForm == null)
{
Log.Warning("AIChatFormController open success but form logic is invalid.");
return;
}
if (_pendingRefresh)
{
TryRefreshUI();
}
}
private void OnCloseUIFormComplete(object sender, GameEventArgs e)
{
if (!(e is CloseUIFormCompleteEventArgs args))
{
return;
}
if (args.SerialId != _formSerialId)
{
return;
}
_aiChatForm = null;
_formSerialId = null;
_pendingRefresh = false;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7b81d9526357e63489249ce90808e71c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,333 @@
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityGameFramework.Runtime;
namespace UI
{
public class AIChatForm : UGuiForm
{
[SerializeField] private TMP_Text _returnButtonText;
[SerializeField] private TMP_InputField _inputField;
[SerializeField] private RectTransform _dialogContent;
[SerializeField] private TMP_Text _titleText;
[SerializeField] private ScrollRect _historyScrollRect;
[SerializeField] private AIDialogItem _aiDialogItemPrefab;
[SerializeField] private PlayerDialogItem _playerDialogItemPrefab;
[SerializeField] private HorizonSelectGroup _languageSelectGroup;
[SerializeField] private string _returnButtonNormalText = "<sprite name=\"KEYBOARD_Esc\"> Back";
[SerializeField] private string _returnButtonHoverText = "<sprite name=\"KEYBOARD_Esc\"><u> Back </u>";
private readonly List<Component> _dialogItems = new List<Component>();
private AIChatFormController _controller;
private VerticalLayoutGroup _contentLayoutGroup;
public Vector2 ContentSize => _dialogContent != null
? new Vector2(_dialogContent.rect.width, _dialogContent.rect.height)
: Vector2.zero;
protected override void OnOpen(object userData)
{
base.OnOpen(userData);
EnsureReferences();
if (_inputField != null)
{
_inputField.onSubmit.RemoveListener(OnInputFieldSubmitted);
_inputField.onSubmit.AddListener(OnInputFieldSubmitted);
}
if (!(userData is AIChatFormContext context))
{
Log.Error("AIChatFormContext is invalid.");
return;
}
RefreshUI(context);
}
protected override void OnClose(bool isShutdown, object userData)
{
if (_inputField != null)
{
_inputField.onSubmit.RemoveListener(OnInputFieldSubmitted);
}
ClearDialogItems();
_dialogItems.Clear();
_controller = null;
base.OnClose(isShutdown, userData);
}
public void RefreshUI(AIChatFormContext context)
{
EnsureReferences();
if (context == null)
{
return;
}
_controller = context.Controller;
if (_titleText != null && !string.IsNullOrEmpty(context.Title))
{
_titleText.text = context.Title;
}
if (_languageSelectGroup != null)
{
int targetLanguageMode = Mathf.Max(0, context.LanguageMode);
try
{
_languageSelectGroup.SetValue(targetLanguageMode);
}
catch
{
_languageSelectGroup.SetValue(0);
context.LanguageMode = 0;
}
}
if (context.ClearHistoryOnOpen || _dialogItems.Count == 0)
{
ClearDialogItems();
BuildHistory(context.Messages);
}
FocusInputField();
}
public int AppendAIDialog(AIDialogItemContext context)
{
EnsureReferences();
if (_aiDialogItemPrefab == null || _dialogContent == null)
{
Log.Warning("Append AI dialog failed. Missing AI item prefab or content root.");
return -1;
}
AIDialogItem item = Instantiate(_aiDialogItemPrefab, _dialogContent, false);
item.gameObject.SetActive(true);
item.OnInit(context);
_dialogItems.Add(item);
ScrollToBottom();
return _dialogItems.Count - 1;
}
public void UpdateAIDialog(int itemIndex, AIDialogItemContext context)
{
if (itemIndex < 0 || itemIndex >= _dialogItems.Count)
{
return;
}
if (!(_dialogItems[itemIndex] is AIDialogItem item))
{
return;
}
item.OnInit(context);
ScrollToBottom();
}
public int AppendPlayerDialog(PlayerDialogItemContext context)
{
EnsureReferences();
if (_playerDialogItemPrefab == null || _dialogContent == null)
{
Log.Warning("Append player dialog failed. Missing player item prefab or content root.");
return -1;
}
PlayerDialogItem item = Instantiate(_playerDialogItemPrefab, _dialogContent, false);
item.gameObject.SetActive(true);
item.OnInit(context);
_dialogItems.Add(item);
ScrollToBottom();
return _dialogItems.Count - 1;
}
public void SetInputInteractable(bool interactable)
{
if (_inputField == null)
{
return;
}
_inputField.interactable = interactable;
}
public void FocusInputField()
{
if (_inputField == null || !_inputField.interactable)
{
return;
}
_inputField.Select();
_inputField.ActivateInputField();
}
public void OnCommitButtonClick()
{
CommitInput();
}
public void OnReturnButtonHover()
{
if (_returnButtonText != null)
{
_returnButtonText.text = _returnButtonHoverText;
}
}
public void OnReturnButtonClick()
{
_controller?.CloseUI();
}
public void OnReturnButtonHoverEnd()
{
if (_returnButtonText != null)
{
_returnButtonText.text = _returnButtonNormalText;
}
}
private void EnsureReferences()
{
if (_historyScrollRect == null)
{
_historyScrollRect = GetComponentInChildren<ScrollRect>(true);
}
if (_historyScrollRect != null && _dialogContent == null)
{
_dialogContent = _historyScrollRect.content;
}
if (_dialogContent != null)
{
_contentLayoutGroup = _dialogContent.GetComponent<VerticalLayoutGroup>();
if (_contentLayoutGroup == null)
{
_contentLayoutGroup = _dialogContent.gameObject.AddComponent<VerticalLayoutGroup>();
}
_contentLayoutGroup.enabled = true;
_contentLayoutGroup.childAlignment = TextAnchor.UpperLeft;
_contentLayoutGroup.childForceExpandHeight = false;
_contentLayoutGroup.childForceExpandWidth = true;
_contentLayoutGroup.childControlHeight = true;
_contentLayoutGroup.childControlWidth = true;
_contentLayoutGroup.spacing = 12f;
}
}
private void BuildHistory(List<AIChatMessageContext> messages)
{
if (messages == null || messages.Count == 0)
{
return;
}
for (int i = 0; i < messages.Count; i++)
{
AIChatMessageContext message = messages[i];
if (message == null || string.IsNullOrEmpty(message.Content))
{
continue;
}
if (message.IsPlayer)
{
AppendPlayerDialog(new PlayerDialogItemContext
{
Content = message.Content
});
}
else
{
AppendAIDialog(new AIDialogItemContext
{
ParentWidth = ContentSize.x,
Content = message.Content
});
}
}
}
private void CommitInput()
{
if (_controller == null || _inputField == null || !_inputField.interactable)
{
return;
}
string content = _inputField.text;
_inputField.text = string.Empty;
_controller.SubmitPlayerMessage(content, GetLanguageMode());
FocusInputField();
}
private void OnInputFieldSubmitted(string submittedText)
{
CommitInput();
}
private int GetLanguageMode()
{
return _languageSelectGroup != null ? _languageSelectGroup.GetIntValue() : 0;
}
private void ClearDialogItems()
{
if (_dialogContent == null)
{
_dialogItems.Clear();
return;
}
for (int i = _dialogContent.childCount - 1; i >= 0; i--)
{
Transform child = _dialogContent.GetChild(i);
if (child != null)
{
Destroy(child.gameObject);
}
}
_dialogItems.Clear();
}
private void ScrollToBottom()
{
if (_historyScrollRect == null)
{
return;
}
StopCoroutine(nameof(ScrollToBottomAtEndOfFrame));
StartCoroutine(nameof(ScrollToBottomAtEndOfFrame));
}
private IEnumerator ScrollToBottomAtEndOfFrame()
{
yield return null;
Canvas.ForceUpdateCanvases();
_historyScrollRect.verticalNormalizedPosition = 0f;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e59af4c8fe70e184ea5ab8d33fe39c4b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,90 @@
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace UI
{
public class AIDialogItem : MonoBehaviour
{
[SerializeField] private RectTransform _rectTransform;
[SerializeField] private TMP_Text _contentText;
private LayoutElement _layoutElement;
private float _minHeight;
private void Awake()
{
CacheReferences();
}
public void OnInit(AIDialogItemContext context)
{
if (context == null)
{
return;
}
OnInit(context.ParentWidth, context.Content);
}
public void OnInit(float parentWidth, string content)
{
CacheReferences();
if (_rectTransform == null || _contentText == null)
{
return;
}
_contentText.text = content ?? string.Empty;
if (parentWidth > 0f)
{
_rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, parentWidth);
}
float preferredHeight = _contentText.GetPreferredValues(_contentText.text, _rectTransform.rect.width,
float.PositiveInfinity).y;
float targetHeight = Mathf.Max(_minHeight, preferredHeight);
if (_layoutElement != null)
{
_layoutElement.preferredHeight = targetHeight;
}
_rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, targetHeight);
}
public void SetContent(string content, float parentWidth)
{
OnInit(parentWidth, content);
}
private void CacheReferences()
{
if (_rectTransform == null)
{
_rectTransform = transform as RectTransform;
}
if (_contentText == null)
{
_contentText = GetComponentInChildren<TMP_Text>(true);
}
if (_layoutElement == null && _rectTransform != null)
{
_layoutElement = gameObject.GetComponent<LayoutElement>();
if (_layoutElement == null)
{
_layoutElement = gameObject.AddComponent<LayoutElement>();
}
}
if (_rectTransform != null && _minHeight <= 0f)
{
_minHeight = Mathf.Max(20f, _rectTransform.rect.height);
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e9fe74c6a0acb0a40bae49bdf039be60
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -10,7 +10,6 @@ namespace UI
/// 可拖拽拼装部件:负责拖拽交互、出生点回退与放置到槽位。 /// 可拖拽拼装部件:负责拖拽交互、出生点回退与放置到槽位。
/// </summary> /// </summary>
[RequireComponent(typeof(RectTransform))] [RequireComponent(typeof(RectTransform))]
[DisallowMultipleComponent]
public class CombineDraggablePart : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler public class CombineDraggablePart : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
{ {
#region Inspector Config #region Inspector Config

View File

@ -4,7 +4,6 @@ using Event;
using GameFramework.Event; using GameFramework.Event;
using TMPro; using TMPro;
using UnityEngine; using UnityEngine;
using UnityEngine.UI;
using UnityGameFramework.Runtime; using UnityGameFramework.Runtime;
namespace UI namespace UI
@ -12,7 +11,6 @@ namespace UI
/// <summary> /// <summary>
/// MVC UI form for GameplayA. It builds slots and draggable parts from external data. /// MVC UI form for GameplayA. It builds slots and draggable parts from external data.
/// </summary> /// </summary>
[DisallowMultipleComponent]
public class CombineForm : UGuiForm public class CombineForm : UGuiForm
{ {
#region Property #region Property

View File

@ -8,7 +8,6 @@ namespace UI
/// <summary> /// <summary>
/// 拼装槽位:接收拖拽部件并转发给玩法控制器做规则校验。 /// 拼装槽位:接收拖拽部件并转发给玩法控制器做规则校验。
/// </summary> /// </summary>
[DisallowMultipleComponent]
public class CombineSlot : MonoBehaviour, IDropHandler public class CombineSlot : MonoBehaviour, IDropHandler
{ {
#region Inspector Config #region Inspector Config

View File

@ -0,0 +1,114 @@
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace UI
{
public class PlayerDialogItem : MonoBehaviour
{
[SerializeField] private TMP_Text _contentText;
[SerializeField] private Image _bg;
[SerializeField] private float _preferredWidth;
[SerializeField] private float _horizontalPadding;
[SerializeField] private float _verticalPadding;
private RectTransform _rootRectTransform;
private LayoutElement _layoutElement;
private void Awake()
{
CacheReferences();
}
public void OnInit(PlayerDialogItemContext context)
{
if (context == null)
{
return;
}
OnInit(context.Content);
}
public void OnInit(string content)
{
CacheReferences();
if (_contentText == null || _bg == null || _rootRectTransform == null)
{
return;
}
_contentText.text = content ?? string.Empty;
Vector2 unconstrainedSize = _contentText.GetPreferredValues(_contentText.text, float.PositiveInfinity,
float.PositiveInfinity);
float targetWidth = Mathf.Min(_preferredWidth, unconstrainedSize.x + _horizontalPadding);
targetWidth = Mathf.Max(_horizontalPadding, targetWidth);
float textWidth = Mathf.Max(0f, targetWidth - _horizontalPadding);
Vector2 constrainedSize = _contentText.GetPreferredValues(_contentText.text, textWidth,
float.PositiveInfinity);
float targetHeight = Mathf.Max(0f, constrainedSize.y + _verticalPadding);
RectTransform bgRect = _bg.rectTransform;
bgRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, targetWidth);
bgRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, targetHeight);
if (_layoutElement != null)
{
_layoutElement.preferredHeight = targetHeight;
_layoutElement.minHeight = targetHeight;
}
_rootRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, targetHeight);
}
private void CacheReferences()
{
if (_rootRectTransform == null)
{
_rootRectTransform = transform as RectTransform;
}
if (_contentText == null)
{
_contentText = GetComponentInChildren<TMP_Text>(true);
}
if (_bg == null)
{
_bg = GetComponentInChildren<Image>(true);
}
if (_layoutElement == null && _rootRectTransform != null)
{
_layoutElement = gameObject.GetComponent<LayoutElement>();
if (_layoutElement == null)
{
_layoutElement = gameObject.AddComponent<LayoutElement>();
}
}
if (_contentText == null || _bg == null || _rootRectTransform == null)
{
return;
}
RectTransform bgRect = _bg.rectTransform;
RectTransform textRect = _contentText.rectTransform;
_horizontalPadding = Mathf.Max(0f, bgRect.rect.width - textRect.rect.width);
_verticalPadding = Mathf.Max(0f, bgRect.rect.height - textRect.rect.height);
if (_preferredWidth <= 0f)
{
_preferredWidth = bgRect.rect.width > 0f ? bgRect.rect.width : _rootRectTransform.rect.width;
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d82051b50b7801c4f86c71e77c353f77
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -12,6 +12,8 @@ namespace UI
[SerializeField] private float _fadeDuration; [SerializeField] private float _fadeDuration;
[SerializeField] private bool _allowFade = true;
private Sequence _fadeSequence; private Sequence _fadeSequence;
public UnityEvent _onSelect; public UnityEvent _onSelect;
@ -21,8 +23,13 @@ namespace UI
public void OnPointerEnter(PointerEventData eventData) public void OnPointerEnter(PointerEventData eventData)
{ {
KillFadeSequence(); KillFadeSequence();
_fadeSequence = DOTween.Sequence();
_fadeSequence.Append(_bgImage.DOFade(1, _fadeDuration)); if (_allowFade)
{
_fadeSequence = DOTween.Sequence();
_fadeSequence.Append(_bgImage.DOFade(1, _fadeDuration));
}
_onSelect.Invoke(); _onSelect.Invoke();
} }
@ -30,8 +37,12 @@ namespace UI
{ {
KillFadeSequence(); KillFadeSequence();
_fadeSequence = DOTween.Sequence(); if (_allowFade)
_fadeSequence.Append(_bgImage.DOFade(0, _fadeDuration)); {
_fadeSequence = DOTween.Sequence();
_fadeSequence.Append(_bgImage.DOFade(0, _fadeDuration));
}
_onDeselect.Invoke(); _onDeselect.Invoke();
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 15e14474d026f364b98d3c4c6b5da523
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -422,7 +422,7 @@ GameObject:
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 4910643681303047144} - component: {fileID: 4910643681303047144}
- component: {fileID: 6733591769868877266} - component: {fileID: 1929177314570966893}
m_Layer: 5 m_Layer: 5
m_Name: CombineForm m_Name: CombineForm
m_TagString: Untagged m_TagString: Untagged
@ -455,7 +455,7 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6733591769868877266 --- !u!114 &1929177314570966893
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}

View File

@ -610,90 +610,6 @@ MonoBehaviour:
m_hasFontAssetChanged: 0 m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0} m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &764375517089385573
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7510813308491875238}
- component: {fileID: 3240726702251660125}
m_Layer: 5
m_Name: DialogWIndowAlpha
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7510813308491875238
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 764375517089385573}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 3272997441484678303}
- {fileID: 6258651389860587192}
- {fileID: 660319051619429877}
- {fileID: 3595804120529266085}
m_Father: {fileID: 8200591455415019476}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 750, y: -370}
m_SizeDelta: {x: 1500, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &3240726702251660125
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 764375517089385573}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 74ad2e39e0d4fc546ab11cf446143f44, type: 3}
m_Name:
m_EditorClassIdentifier:
_bgImage: {fileID: 91675388286977073}
_fadeDuration: 0.3
_onSelect:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 5741674929265892048}
m_TargetAssemblyTypeName: UI.HorizonSelectGroup, Assembly-CSharp
m_MethodName: UpdateButtonState
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
_onDeselect:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 5741674929265892048}
m_TargetAssemblyTypeName: UI.HorizonSelectGroup, Assembly-CSharp
m_MethodName: HideButtons
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!1 &848378281409259584 --- !u!1 &848378281409259584
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -2009,141 +1925,6 @@ MonoBehaviour:
m_FillOrigin: 0 m_FillOrigin: 0
m_UseSpriteMesh: 0 m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1 m_PixelsPerUnitMultiplier: 1
--- !u!1 &3802751848953325018
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 660319051619429877}
- component: {fileID: 5351914414801502506}
- component: {fileID: 4324465347832285538}
m_Layer: 5
m_Name: TItle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &660319051619429877
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3802751848953325018}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7510813308491875238}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 50, y: 0}
m_SizeDelta: {x: 500, y: 90}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &5351914414801502506
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3802751848953325018}
m_CullTransparentMesh: 1
--- !u!114 &4324465347832285538
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3802751848953325018}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u5BF9\u8BDD\u7A97\u53E3\u900F\u660E\u5EA6"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 99d811b0183246646a2ce8df996f4bca, type: 2}
m_sharedMaterial: {fileID: -1106088975554028259, guid: 99d811b0183246646a2ce8df996f4bca,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4280163870
m_fontColor: {r: 0.11764706, g: 0.11764706, b: 0.11764706, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 55
m_fontSizeBase: 55
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 55
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &3945749965587499522 --- !u!1 &3945749965587499522
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -3310,81 +3091,6 @@ MonoBehaviour:
m_hasFontAssetChanged: 0 m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0} m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &5440300571759041585
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3272997441484678303}
- component: {fileID: 5700058317512482256}
- component: {fileID: 2582928097684041619}
m_Layer: 5
m_Name: Line
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3272997441484678303
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5440300571759041585}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7510813308491875238}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 1}
m_SizeDelta: {x: -80, y: 2}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5700058317512482256
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5440300571759041585}
m_CullTransparentMesh: 1
--- !u!114 &2582928097684041619
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5440300571759041585}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.3137255, g: 0.3137255, b: 0.3137255, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 6cbc2c323b77f804fb958fa4eca33998, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &5731090303618681186 --- !u!1 &5731090303618681186
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -5383,81 +5089,6 @@ MonoBehaviour:
_screenWindow: {fileID: 8131677828388103988} _screenWindow: {fileID: 8131677828388103988}
_vSyncGroup: {fileID: 5268747733441783078} _vSyncGroup: {fileID: 5268747733441783078}
_antiAliasingGroup: {fileID: 7139485312723883185} _antiAliasingGroup: {fileID: 7139485312723883185}
--- !u!1 &7220185562057603272
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6258651389860587192}
- component: {fileID: 9217840769908596954}
- component: {fileID: 91675388286977073}
m_Layer: 5
m_Name: Bg
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6258651389860587192
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7220185562057603272}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7510813308491875238}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9217840769908596954
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7220185562057603272}
m_CullTransparentMesh: 1
--- !u!114 &91675388286977073
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7220185562057603272}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 9f847ec5e66e03e4ead1d3c5f7b510e8, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &7223492796756256773 --- !u!1 &7223492796756256773
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -7433,167 +7064,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: e3ad474ed1648574f984d626f3d9726a, type: 3} m_Script: {fileID: 11500000, guid: e3ad474ed1648574f984d626f3d9726a, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!1001 &4482649854652917363
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 7510813308491875238}
m_Modifications:
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_Pivot.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_Pivot.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchorMax.x
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchorMax.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchorMin.x
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchorMin.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_SizeDelta.x
value: 500
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_SizeDelta.y
value: 98
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchoredPosition.x
value: -300
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: _showTexts.Array.size
value: 4
objectReference: {fileID: 0}
- target: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: _showTexts.Array.data[0]
value: "\u65E0"
objectReference: {fileID: 0}
- target: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: _showTexts.Array.data[1]
value: "\u4F4E"
objectReference: {fileID: 0}
- target: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: _showTexts.Array.data[2]
value: "\u4E2D"
objectReference: {fileID: 0}
- target: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: _showTexts.Array.data[3]
value: "\u9AD8"
objectReference: {fileID: 0}
- target: {fileID: 8689142225738196505, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_Name
value: HorizonSelectGroup
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 7f72e35a938b99d478b47012eacff084, type: 3}
--- !u!224 &3595804120529266085 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
m_PrefabInstance: {fileID: 4482649854652917363}
m_PrefabAsset: {fileID: 0}
--- !u!114 &5741674929265892048 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
m_PrefabInstance: {fileID: 4482649854652917363}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e3ad474ed1648574f984d626f3d9726a, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &7359290805302701708 --- !u!1001 &7359290805302701708
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -7901,3 +7371,139 @@ RectTransform:
type: 3} type: 3}
m_PrefabInstance: {fileID: 8440045343368780012} m_PrefabInstance: {fileID: 8440045343368780012}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1001 &8767670042565557697
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 8200591455415019476}
m_Modifications:
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_Pivot.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_Pivot.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_AnchorMax.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_SizeDelta.x
value: 1500
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_SizeDelta.y
value: 100
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 750
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -370
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8301996724493906340, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
propertyPath: m_Name
value: DialogWIndowAlpha
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: b3f2a3962650de54a8acd104167be5f6, type: 3}
--- !u!114 &5741674929265892048 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 3892099218484815633, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
m_PrefabInstance: {fileID: 8767670042565557697}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e3ad474ed1648574f984d626f3d9726a, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!224 &7510813308491875238 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 1267413219301621351, guid: b3f2a3962650de54a8acd104167be5f6,
type: 3}
m_PrefabInstance: {fileID: 8767670042565557697}
m_PrefabAsset: {fileID: 0}

View File

@ -0,0 +1,152 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &4870410040019185678
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3530375629471539458}
- component: {fileID: 6653012665189593793}
- component: {fileID: 5890242597218149291}
- component: {fileID: -8390734221120669374}
m_Layer: 5
m_Name: AIDialogItem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3530375629471539458
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4870410040019185678}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -25}
m_SizeDelta: {x: 0, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6653012665189593793
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4870410040019185678}
m_CullTransparentMesh: 1
--- !u!114 &5890242597218149291
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4870410040019185678}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text:
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 99d811b0183246646a2ce8df996f4bca, type: 2}
m_sharedMaterial: {fileID: -1106088975554028259, guid: 99d811b0183246646a2ce8df996f4bca,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 40
m_fontSizeBase: 40
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &-8390734221120669374
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4870410040019185678}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e9fe74c6a0acb0a40bae49bdf039be60, type: 3}
m_Name:
m_EditorClassIdentifier:
_rectTransform: {fileID: 3530375629471539458}
_contentText: {fileID: 5890242597218149291}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 684fc10c9bf962847971ded6767d98fd
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,280 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1145782191330768135
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6711542110038885951}
- component: {fileID: 6429856719733515187}
- component: {fileID: 6122760803139968604}
m_Layer: 5
m_Name: Board
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6711542110038885951
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1145782191330768135}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3453098817964035836}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6429856719733515187
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1145782191330768135}
m_CullTransparentMesh: 1
--- !u!114 &6122760803139968604
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1145782191330768135}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.8, g: 0.8, b: 0.8, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 9f847ec5e66e03e4ead1d3c5f7b510e8, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &4173418726953044173
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8774159874010650544}
- component: {fileID: 1355976159568358933}
- component: {fileID: 6591711722073990059}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8774159874010650544
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4173418726953044173}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3453098817964035836}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -10, y: -20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1355976159568358933
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4173418726953044173}
m_CullTransparentMesh: 1
--- !u!114 &6591711722073990059
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4173418726953044173}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u63D0\u95EE"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 99d811b0183246646a2ce8df996f4bca, type: 2}
m_sharedMaterial: {fileID: -1106088975554028259, guid: 99d811b0183246646a2ce8df996f4bca,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 45.45
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &4689775503634890437
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3453098817964035836}
- component: {fileID: 685002076781170785}
- component: {fileID: 7923244859910398399}
m_Layer: 5
m_Name: CommonButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3453098817964035836
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4689775503634890437}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6711542110038885951}
- {fileID: 8774159874010650544}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: -130, y: 60}
m_SizeDelta: {x: 200, y: 80}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &685002076781170785
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4689775503634890437}
m_CullTransparentMesh: 1
--- !u!114 &7923244859910398399
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4689775503634890437}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a5079836f95c2a44b96fa331487ebb70, type: 3}
m_Name:
m_EditorClassIdentifier:
m_OnHover:
m_PersistentCalls:
m_Calls: []
m_OnClick:
m_PersistentCalls:
m_Calls: []
m_OnHoverEnd:
m_PersistentCalls:
m_Calls: []

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: af7c6fb5cffde414b89d706442f60597
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,276 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &365036975752693365
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8320695715578921065}
- component: {fileID: 1754404334378661090}
- component: {fileID: 6168762946931663031}
m_Layer: 5
m_Name: PlayerDialogItem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8320695715578921065
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 365036975752693365}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 736583374502549420}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -301.94275, y: -81.24585}
m_SizeDelta: {x: 600, y: 60}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1754404334378661090
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 365036975752693365}
m_CullTransparentMesh: 1
--- !u!114 &6168762946931663031
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 365036975752693365}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d82051b50b7801c4f86c71e77c353f77, type: 3}
m_Name:
m_EditorClassIdentifier:
_contentText: {fileID: 7706117343281428467}
_bg: {fileID: 3767430116500384552}
_preferredWidth: 600
_horizontalPadding: 0
_verticalPadding: 0
--- !u!1 &1012495713723909048
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5290419392355794438}
- component: {fileID: 3748219505294839740}
- component: {fileID: 7706117343281428467}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5290419392355794438
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1012495713723909048}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 736583374502549420}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -20, y: -20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3748219505294839740
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1012495713723909048}
m_CullTransparentMesh: 1
--- !u!114 &7706117343281428467
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1012495713723909048}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u4F60\u597D\u5C0F\u751F\uFF0C\u6709\u4F55\u8D35\u5E72\u554A"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 99d811b0183246646a2ce8df996f4bca, type: 2}
m_sharedMaterial: {fileID: -1106088975554028259, guid: 99d811b0183246646a2ce8df996f4bca,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 40
m_fontSizeBase: 40
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &6677977314033455624
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 736583374502549420}
- component: {fileID: 810342635784498600}
- component: {fileID: 3767430116500384552}
m_Layer: 5
m_Name: bg
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &736583374502549420
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6677977314033455624}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 5290419392355794438}
m_Father: {fileID: 8320695715578921065}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 620, y: 124.47}
m_Pivot: {x: 1, y: 1}
--- !u!222 &810342635784498600
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6677977314033455624}
m_CullTransparentMesh: 1
--- !u!114 &3767430116500384552
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6677977314033455624}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.8, g: 0.8, b: 0.8, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 9f847ec5e66e03e4ead1d3c5f7b510e8, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 43631c5a72199e14db78e4d4be0c3efb
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,533 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2134220174477018377
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3419981667191823225}
- component: {fileID: 450742750966963483}
- component: {fileID: 8712414917200312816}
m_Layer: 5
m_Name: Bg
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3419981667191823225
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2134220174477018377}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1267413219301621351}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &450742750966963483
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2134220174477018377}
m_CullTransparentMesh: 1
--- !u!114 &8712414917200312816
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2134220174477018377}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 9f847ec5e66e03e4ead1d3c5f7b510e8, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &3662220312536769008
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6107163289643440478}
- component: {fileID: 3942806527951478801}
- component: {fileID: 6518223891513545298}
m_Layer: 5
m_Name: Line
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6107163289643440478
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3662220312536769008}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1267413219301621351}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 1}
m_SizeDelta: {x: -80, y: 2}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3942806527951478801
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3662220312536769008}
m_CullTransparentMesh: 1
--- !u!114 &6518223891513545298
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3662220312536769008}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.3137255, g: 0.3137255, b: 0.3137255, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 6cbc2c323b77f804fb958fa4eca33998, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &5578574399027976219
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8107862371361804340}
- component: {fileID: 3740473405732650219}
- component: {fileID: 5021112405580821667}
m_Layer: 5
m_Name: TItle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8107862371361804340
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5578574399027976219}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1267413219301621351}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 50, y: 0}
m_SizeDelta: {x: 500, y: 90}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &3740473405732650219
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5578574399027976219}
m_CullTransparentMesh: 1
--- !u!114 &5021112405580821667
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5578574399027976219}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u5BF9\u8BDD\u7A97\u53E3\u900F\u660E\u5EA6"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 99d811b0183246646a2ce8df996f4bca, type: 2}
m_sharedMaterial: {fileID: -1106088975554028259, guid: 99d811b0183246646a2ce8df996f4bca,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4280163870
m_fontColor: {r: 0.11764706, g: 0.11764706, b: 0.11764706, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 55
m_fontSizeBase: 55
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 55
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &8301996724493906340
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1267413219301621351}
- component: {fileID: 6148639106032299676}
m_Layer: 5
m_Name: SelectableItem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1267413219301621351
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8301996724493906340}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6107163289643440478}
- {fileID: 3419981667191823225}
- {fileID: 8107862371361804340}
- {fileID: 5209496780646668388}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 1500, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6148639106032299676
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8301996724493906340}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 74ad2e39e0d4fc546ab11cf446143f44, type: 3}
m_Name:
m_EditorClassIdentifier:
_bgImage: {fileID: 8712414917200312816}
_fadeDuration: 0.3
_allowFade: 1
_onSelect:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 3892099218484815633}
m_TargetAssemblyTypeName: UI.HorizonSelectGroup, Assembly-CSharp
m_MethodName: UpdateButtonState
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
_onDeselect:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 3892099218484815633}
m_TargetAssemblyTypeName: UI.HorizonSelectGroup, Assembly-CSharp
m_MethodName: HideButtons
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!1001 &5159039647275228082
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 1267413219301621351}
m_Modifications:
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_Pivot.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_Pivot.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchorMax.x
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchorMax.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchorMin.x
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchorMin.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_SizeDelta.x
value: 500
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_SizeDelta.y
value: 98
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchoredPosition.x
value: -300
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: _showTexts.Array.size
value: 4
objectReference: {fileID: 0}
- target: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: _showTexts.Array.data[0]
value: "\u65E0"
objectReference: {fileID: 0}
- target: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: _showTexts.Array.data[1]
value: "\u4F4E"
objectReference: {fileID: 0}
- target: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: _showTexts.Array.data[2]
value: "\u4E2D"
objectReference: {fileID: 0}
- target: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: _showTexts.Array.data[3]
value: "\u9AD8"
objectReference: {fileID: 0}
- target: {fileID: 8689142225738196505, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
propertyPath: m_Name
value: HorizonSelectGroup
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 7f72e35a938b99d478b47012eacff084, type: 3}
--- !u!114 &3892099218484815633 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 8186159457343110307, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
m_PrefabInstance: {fileID: 5159039647275228082}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e3ad474ed1648574f984d626f3d9726a, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!224 &5209496780646668388 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 1140341447569130454, guid: 7f72e35a938b99d478b47012eacff084,
type: 3}
m_PrefabInstance: {fileID: 5159039647275228082}
m_PrefabAsset: {fileID: 0}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: b3f2a3962650de54a8acd104167be5f6
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -154,6 +154,7 @@ Transform:
- {fileID: 513208573} - {fileID: 513208573}
- {fileID: 1968988098} - {fileID: 1968988098}
- {fileID: 434859534} - {fileID: 434859534}
- {fileID: 1064285105}
m_Father: {fileID: 1852670053} m_Father: {fileID: 1852670053}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &120093239 --- !u!1 &120093239
@ -262,7 +263,6 @@ GameObject:
m_Component: m_Component:
- component: {fileID: 265274950} - component: {fileID: 265274950}
- component: {fileID: 265274949} - component: {fileID: 265274949}
- component: {fileID: 265274948}
- component: {fileID: 265274947} - component: {fileID: 265274947}
m_Layer: 0 m_Layer: 0
m_Name: Camera m_Name: Camera
@ -315,14 +315,6 @@ MonoBehaviour:
m_MipBias: 0 m_MipBias: 0
m_VarianceClampScale: 0.9 m_VarianceClampScale: 0.9
m_ContrastAdaptiveSharpening: 0 m_ContrastAdaptiveSharpening: 0
--- !u!81 &265274948
AudioListener:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 265274946}
m_Enabled: 1
--- !u!20 &265274949 --- !u!20 &265274949
Camera: Camera:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -801,7 +793,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 11499388, guid: adb3eb1c35fcff14f89fba7b05c9d71c, type: 3} - target: {fileID: 11499388, guid: adb3eb1c35fcff14f89fba7b05c9d71c, type: 3}
propertyPath: m_EditorResourceMode propertyPath: m_EditorResourceMode
value: 0 value: 1
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 11499388, guid: adb3eb1c35fcff14f89fba7b05c9d71c, type: 3} - target: {fileID: 11499388, guid: adb3eb1c35fcff14f89fba7b05c9d71c, type: 3}
propertyPath: m_JsonHelperTypeName propertyPath: m_JsonHelperTypeName
@ -1080,6 +1072,61 @@ Canvas:
m_SortingLayerID: 0 m_SortingLayerID: 0
m_SortingOrder: 0 m_SortingOrder: 0
m_TargetDisplay: 0 m_TargetDisplay: 0
--- !u!1 &1064285104
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1064285105}
- component: {fileID: 1064285106}
m_Layer: 0
m_Name: AIChat
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1064285105
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1064285104}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 119167776}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1064285106
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1064285104}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 721362e43780c4043ae6e7ce92463755, type: 3}
m_Name:
m_EditorClassIdentifier:
_apiBaseUrl: https://dashscope.aliyuncs.com/compatible-mode/v1
_apiKey: sk-cba96782070546aeade8de5f555a9c40
_chatCompletionsPath: /chat/completions
_heartbeatPath: /models
_model: qwen-plus
_autoInitializeOnEnable: 1
_chatTimeoutSeconds: 60
_temperature: 0.7
_systemPrompt: "\u4F60\u662F\u5317\u5B8B\u8457\u540D\u5EFA\u7B51\u5B66\u5BB6\u674E\u8BEB\uFF0C\u73B0\u5728\u4F60\u9700\u8981\u6839\u636E\u63D0\u95EE\u7684\u5185\u5BB9\u548C\u56DE\u7B54\u7684\u8981\u6C42\u5BF9\u95EE\u9898\u505A\u51FA\u56DE\u590D\uFF0C\u56DE\u7B54\u95EE\u9898\u5C31\u884C\uFF0C\u4E0D\u8981\u7528\u751F\u50FB\u5B57\uFF0C\u5207\u52FF\u53D1\u6563\u3002"
_heartbeatIntervalSeconds: 5
_heartbeatTimeoutSeconds: 8
--- !u!1 &1852670052 --- !u!1 &1852670052
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,7 @@
{ {
"dependencies": { "dependencies": {
"com.unity.collab-proxy": "2.11.2", "com.unity.collab-proxy": "2.11.2",
"com.unity.feature.2d": "2.0.1",
"com.unity.ide.rider": "3.0.39", "com.unity.ide.rider": "3.0.39",
"com.unity.ide.visualstudio": "2.0.22", "com.unity.ide.visualstudio": "2.0.22",
"com.unity.ide.vscode": "1.2.5", "com.unity.ide.vscode": "1.2.5",

View File

@ -1,5 +1,101 @@
{ {
"dependencies": { "dependencies": {
"com.unity.2d.animation": {
"version": "9.2.0",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.2d.common": "8.1.0",
"com.unity.2d.sprite": "1.0.0",
"com.unity.collections": "1.1.0",
"com.unity.modules.animation": "1.0.0",
"com.unity.modules.uielements": "1.0.0"
},
"url": "https://packages.unity.cn"
},
"com.unity.2d.aseprite": {
"version": "1.1.9",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.2d.common": "6.0.6",
"com.unity.2d.sprite": "1.0.0",
"com.unity.mathematics": "1.2.6",
"com.unity.modules.animation": "1.0.0"
},
"url": "https://packages.unity.cn"
},
"com.unity.2d.common": {
"version": "8.1.0",
"depth": 2,
"source": "registry",
"dependencies": {
"com.unity.burst": "1.7.3",
"com.unity.2d.sprite": "1.0.0",
"com.unity.mathematics": "1.1.0",
"com.unity.modules.animation": "1.0.0",
"com.unity.modules.uielements": "1.0.0"
},
"url": "https://packages.unity.cn"
},
"com.unity.2d.pixel-perfect": {
"version": "5.1.0",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.modules.imgui": "1.0.0"
},
"url": "https://packages.unity.cn"
},
"com.unity.2d.psdimporter": {
"version": "8.1.0",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.2d.common": "8.1.0",
"com.unity.2d.sprite": "1.0.0",
"com.unity.2d.animation": "9.2.0"
},
"url": "https://packages.unity.cn"
},
"com.unity.2d.sprite": {
"version": "1.0.0",
"depth": 1,
"source": "builtin",
"dependencies": {}
},
"com.unity.2d.spriteshape": {
"version": "9.1.0",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.2d.common": "8.1.0",
"com.unity.mathematics": "1.1.0",
"com.unity.modules.physics2d": "1.0.0"
},
"url": "https://packages.unity.cn"
},
"com.unity.2d.tilemap": {
"version": "1.0.0",
"depth": 1,
"source": "builtin",
"dependencies": {
"com.unity.modules.tilemap": "1.0.0",
"com.unity.modules.uielements": "1.0.0"
}
},
"com.unity.2d.tilemap.extras": {
"version": "3.1.3",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.ugui": "1.0.0",
"com.unity.2d.tilemap": "1.0.0",
"com.unity.modules.tilemap": "1.0.0",
"com.unity.modules.jsonserialize": "1.0.0"
},
"url": "https://packages.unity.cn"
},
"com.unity.burst": { "com.unity.burst": {
"version": "1.8.21", "version": "1.8.21",
"depth": 1, "depth": 1,
@ -17,6 +113,16 @@
"dependencies": {}, "dependencies": {},
"url": "https://packages.unity.cn" "url": "https://packages.unity.cn"
}, },
"com.unity.collections": {
"version": "1.2.4",
"depth": 2,
"source": "registry",
"dependencies": {
"com.unity.burst": "1.6.6",
"com.unity.test-framework": "1.1.31"
},
"url": "https://packages.unity.cn"
},
"com.unity.ext.nunit": { "com.unity.ext.nunit": {
"version": "1.0.6", "version": "1.0.6",
"depth": 1, "depth": 1,
@ -24,6 +130,21 @@
"dependencies": {}, "dependencies": {},
"url": "https://packages.unity.cn" "url": "https://packages.unity.cn"
}, },
"com.unity.feature.2d": {
"version": "2.0.1",
"depth": 0,
"source": "builtin",
"dependencies": {
"com.unity.2d.animation": "9.2.0",
"com.unity.2d.pixel-perfect": "5.1.0",
"com.unity.2d.psdimporter": "8.1.0",
"com.unity.2d.sprite": "1.0.0",
"com.unity.2d.spriteshape": "9.1.0",
"com.unity.2d.tilemap": "1.0.0",
"com.unity.2d.tilemap.extras": "3.1.3",
"com.unity.2d.aseprite": "1.1.9"
}
},
"com.unity.ide.rider": { "com.unity.ide.rider": {
"version": "3.0.39", "version": "3.0.39",
"depth": 0, "depth": 0,

View File

@ -11,3 +11,4 @@
105 Bottom对话UI BottomBoxDialogForm Dialog False False 105 Bottom对话UI BottomBoxDialogForm Dialog False False
106 Bubble对话UI BubbleDialogForm Dialog True False 106 Bubble对话UI BubbleDialogForm Dialog True False
107 游戏场景覆盖UI MainOverlayForm Overlay False False 107 游戏场景覆盖UI MainOverlayForm Overlay False False
108 AI对话UI AIChatForm Overlay False False

Binary file not shown.