commit
d210318a2e
|
|
@ -11,3 +11,4 @@
|
|||
105 Bottom对话UI BottomBoxDialogForm Dialog False False
|
||||
106 Bubble对话UI BubbleDialogForm Dialog True False
|
||||
107 游戏场景覆盖UI MainOverlayForm Overlay False False
|
||||
108 AI对话UI AIChatForm Overlay False False
|
||||
|
|
|
|||
|
|
@ -16,11 +16,13 @@ public partial class GameEntry : MonoBehaviour
|
|||
public static BuiltinDataComponent BuiltinData { get; private set; }
|
||||
public static CombineComponent Combine { get; private set; }
|
||||
public static DialogComponent Dialog { get; private set; }
|
||||
public static AIChatComponent AIChat { get; private set; }
|
||||
|
||||
private static void InitCustomComponents()
|
||||
{
|
||||
BuiltinData = UnityGameFramework.Runtime.GameEntry.GetComponent<BuiltinDataComponent>();
|
||||
Combine = UnityGameFramework.Runtime.GameEntry.GetComponent<CombineComponent>();
|
||||
Dialog = UnityGameFramework.Runtime.GameEntry.GetComponent<DialogComponent>();
|
||||
AIChat = UnityGameFramework.Runtime.GameEntry.GetComponent<AIChatComponent>();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,603 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
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 _configFileName = "openai_config.json";
|
||||
|
||||
[SerializeField] private string _chatCompletionsPath = "/chat/completions";
|
||||
[SerializeField] private string _heartbeatPath = "/models";
|
||||
|
||||
private string _apiBaseUrl;
|
||||
private string _apiKey;
|
||||
private string _model;
|
||||
|
||||
[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()
|
||||
{
|
||||
if (!LoadConfigFromStreamingAssets())
|
||||
{
|
||||
_isInitialized = false;
|
||||
return;
|
||||
}
|
||||
|
||||
_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 bool LoadConfigFromStreamingAssets()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(_configFileName))
|
||||
{
|
||||
Log.Error("AIChat config filename is empty.");
|
||||
return false;
|
||||
}
|
||||
|
||||
string configPath = Path.Combine(Application.streamingAssetsPath, _configFileName);
|
||||
if (!File.Exists(configPath))
|
||||
{
|
||||
Log.Error("AIChat config file not found. path='{0}'", configPath);
|
||||
return false;
|
||||
}
|
||||
|
||||
string json;
|
||||
try
|
||||
{
|
||||
json = File.ReadAllText(configPath, Encoding.UTF8);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
Log.Error("AIChat config read failed. path='{0}', error='{1}'", configPath, exception.Message);
|
||||
return false;
|
||||
}
|
||||
|
||||
OpenAIConfig config;
|
||||
try
|
||||
{
|
||||
config = Utility.Json.ToObject<OpenAIConfig>(json);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
Log.Error("AIChat config parse failed. error='{0}'", exception.Message);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (config == null ||
|
||||
string.IsNullOrWhiteSpace(config.apiBaseUrl) ||
|
||||
string.IsNullOrWhiteSpace(config.apiKey) ||
|
||||
string.IsNullOrWhiteSpace(config.model))
|
||||
{
|
||||
Log.Error("AIChat config is invalid. baseUrl/key/model must be provided.");
|
||||
return false;
|
||||
}
|
||||
|
||||
_apiBaseUrl = config.apiBaseUrl;
|
||||
_apiKey = config.apiKey;
|
||||
_model = config.model;
|
||||
return true;
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
private sealed class OpenAIConfig
|
||||
{
|
||||
public string apiBaseUrl;
|
||||
public string apiKey;
|
||||
public string model;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 721362e43780c4043ae6e7ce92463755
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 4ae65566eea74645bfbebbd8edc2eeb2
|
||||
timeCreated: 1772005238
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
using System;
|
||||
|
||||
namespace Definition.DataStruct
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class OpenAIMessage
|
||||
{
|
||||
public string role;
|
||||
public string content;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
fileFormatVersion: 2
|
||||
guid: da985afe4cdd41b985cdc55b16669248
|
||||
timeCreated: 1772005281
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
using System;
|
||||
|
||||
namespace Definition.DataStruct
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class OpenAIStreamChoice
|
||||
{
|
||||
public int index;
|
||||
public OpenAIStreamDelta delta;
|
||||
public string finish_reason;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 68ead73e1887412caf82bc156fe7960b
|
||||
timeCreated: 1772005319
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 8aaa860de9da4771a22469c918a8346e
|
||||
timeCreated: 1772005300
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
using System;
|
||||
|
||||
namespace Definition.DataStruct
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class OpenAIStreamDelta
|
||||
{
|
||||
public string role;
|
||||
public string content;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 151022fd6325477aa9810f1914030419
|
||||
timeCreated: 1772005339
|
||||
|
|
@ -55,5 +55,7 @@ namespace UI
|
|||
BubbleDialogForm = 106,
|
||||
|
||||
MainOverlayForm = 107,
|
||||
|
||||
AIChatForm = 108,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
// Feedback: mailto:ellan@gameframework.cn
|
||||
//------------------------------------------------------------
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
public abstract class CSPacketBase : PacketBase
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
// Feedback: mailto:ellan@gameframework.cn
|
||||
//------------------------------------------------------------
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
public sealed class CSPacketHeader : PacketHeaderBase
|
||||
{
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ using System.IO;
|
|||
using System.Reflection;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
public class NetworkChannelHelper : INetworkChannelHelper
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 8b1df451f58f9f04ea0357989526f6a7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
using ProtoBuf;
|
||||
using System;
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
[Serializable, ProtoContract(Name = @"CSHeartBeat")]
|
||||
public class CSHeartBeat : CSPacketBase
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
using ProtoBuf;
|
||||
using System;
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
[Serializable, ProtoContract(Name = @"SCHeartBeat")]
|
||||
public class SCHeartBeat : SCPacketBase
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
using GameFramework.Network;
|
||||
using ProtoBuf;
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
public abstract class PacketBase : Packet, IExtensible
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
using GameFramework.Network;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
public class SCHeartBeatHandler : PacketHandlerBase
|
||||
{
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
using GameFramework.Network;
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
public abstract class PacketHandlerBase : IPacketHandler
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
using GameFramework;
|
||||
using GameFramework.Network;
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
public abstract class PacketHeaderBase : IPacketHeader, IReference
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
// Feedback: mailto:ellan@gameframework.cn
|
||||
//------------------------------------------------------------
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
public enum PacketType : byte
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
// Feedback: mailto:ellan@gameframework.cn
|
||||
//------------------------------------------------------------
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
public abstract class SCPacketBase : PacketBase
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
// Feedback: mailto:ellan@gameframework.cn
|
||||
//------------------------------------------------------------
|
||||
|
||||
namespace StarForce
|
||||
namespace Network
|
||||
{
|
||||
public sealed class SCPacketHeader : PacketHeaderBase
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,21 +1,12 @@
|
|||
using Definition.Enum;
|
||||
using System.Collections.Generic;
|
||||
using CustomComponent;
|
||||
using Event;
|
||||
using GameFramework.Event;
|
||||
using UI;
|
||||
using UnityEngine;
|
||||
using UnityGameFramework.Runtime;
|
||||
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
|
||||
|
||||
namespace Procedure
|
||||
{
|
||||
/// <summary>
|
||||
/// 斗拱拼装流程:
|
||||
/// 1. 进入流程后准备组件与事件;
|
||||
/// 2. 启动并监控拼装关卡(成功或超时);
|
||||
/// 3. 结算后短暂等待并重开场景。
|
||||
/// </summary>
|
||||
public class ProcedureCombine : ProcedureBase
|
||||
{
|
||||
#region Property
|
||||
|
|
@ -40,12 +31,17 @@ namespace Procedure
|
|||
protected override void OnEnter(ProcedureOwner procedureOwner)
|
||||
{
|
||||
base.OnEnter(procedureOwner);
|
||||
|
||||
|
||||
//InitializeProcedureState();
|
||||
GameEntry.Dialog.Init(1);
|
||||
//GameEntry.Dialog.Init(1);
|
||||
|
||||
//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>
|
||||
|
|
|
|||
|
|
@ -11,17 +11,20 @@ using UnityEngine.EventSystems;
|
|||
|
||||
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 OnHoverAlpha = 0.7f;
|
||||
private const float OnClickAlpha = 0.6f;
|
||||
|
||||
[SerializeField]
|
||||
private UnityEvent m_OnHover = null;
|
||||
[SerializeField] private bool _allowFade = true;
|
||||
|
||||
[SerializeField]
|
||||
private UnityEvent m_OnClick = null;
|
||||
[SerializeField] private UnityEvent m_OnHover = null;
|
||||
|
||||
[SerializeField] private UnityEvent m_OnClick = null;
|
||||
|
||||
[SerializeField] private UnityEvent m_OnHoverEnd = null;
|
||||
|
||||
private CanvasGroup m_CanvasGroup = null;
|
||||
|
||||
|
|
@ -43,8 +46,9 @@ namespace UI
|
|||
}
|
||||
|
||||
StopAllCoroutines();
|
||||
StartCoroutine(m_CanvasGroup.FadeToAlpha(OnHoverAlpha, FadeTime));
|
||||
m_OnHover.Invoke();
|
||||
if (_allowFade)
|
||||
StartCoroutine(m_CanvasGroup.FadeToAlpha(OnHoverAlpha, FadeTime));
|
||||
m_OnHover?.Invoke();
|
||||
}
|
||||
|
||||
public void OnPointerExit(PointerEventData eventData)
|
||||
|
|
@ -55,7 +59,9 @@ namespace UI
|
|||
}
|
||||
|
||||
StopAllCoroutines();
|
||||
StartCoroutine(m_CanvasGroup.FadeToAlpha(1f, FadeTime));
|
||||
if (_allowFade)
|
||||
StartCoroutine(m_CanvasGroup.FadeToAlpha(1f, FadeTime));
|
||||
m_OnHoverEnd?.Invoke();
|
||||
}
|
||||
|
||||
public void OnPointerDown(PointerEventData eventData)
|
||||
|
|
@ -66,7 +72,7 @@ namespace UI
|
|||
}
|
||||
|
||||
m_CanvasGroup.alpha = OnClickAlpha;
|
||||
m_OnClick.Invoke();
|
||||
m_OnClick?.Invoke();
|
||||
}
|
||||
|
||||
public void OnPointerUp(PointerEventData eventData)
|
||||
|
|
@ -79,4 +85,4 @@ namespace UI
|
|||
m_CanvasGroup.alpha = OnHoverAlpha;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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>();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: bd7b7032876cfea4fba511fe86a86ca4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
namespace UI
|
||||
{
|
||||
public sealed class AIChatMessageContext : UIContext
|
||||
{
|
||||
public bool IsPlayer;
|
||||
public string Content;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 0b757f1a76817344396df2fbc235f7a6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
namespace UI
|
||||
{
|
||||
public class AIDialogItemContext : UIContext
|
||||
{
|
||||
public float ParentWidth;
|
||||
public string Content;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 2740182b0799e4b4288755e07fd7244b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
namespace UI
|
||||
{
|
||||
public class PlayerDialogItemContext : UIContext
|
||||
{
|
||||
public string Content;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 10f44b172e664044fa1747d2e45f8c4f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 7b81d9526357e63489249ce90808e71c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: e59af4c8fe70e184ea5ab8d33fe39c4b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: e9fe74c6a0acb0a40bae49bdf039be60
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -10,7 +10,6 @@ namespace UI
|
|||
/// 可拖拽拼装部件:负责拖拽交互、出生点回退与放置到槽位。
|
||||
/// </summary>
|
||||
[RequireComponent(typeof(RectTransform))]
|
||||
[DisallowMultipleComponent]
|
||||
public class CombineDraggablePart : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
|
||||
{
|
||||
#region Inspector Config
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ using Event;
|
|||
using GameFramework.Event;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace UI
|
||||
|
|
@ -12,7 +11,6 @@ namespace UI
|
|||
/// <summary>
|
||||
/// MVC UI form for GameplayA. It builds slots and draggable parts from external data.
|
||||
/// </summary>
|
||||
[DisallowMultipleComponent]
|
||||
public class CombineForm : UGuiForm
|
||||
{
|
||||
#region Property
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ namespace UI
|
|||
/// <summary>
|
||||
/// 拼装槽位:接收拖拽部件并转发给玩法控制器做规则校验。
|
||||
/// </summary>
|
||||
[DisallowMultipleComponent]
|
||||
public class CombineSlot : MonoBehaviour, IDropHandler
|
||||
{
|
||||
#region Inspector Config
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: d82051b50b7801c4f86c71e77c353f77
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -12,6 +12,8 @@ namespace UI
|
|||
|
||||
[SerializeField] private float _fadeDuration;
|
||||
|
||||
[SerializeField] private bool _allowFade = true;
|
||||
|
||||
private Sequence _fadeSequence;
|
||||
|
||||
public UnityEvent _onSelect;
|
||||
|
|
@ -21,17 +23,26 @@ namespace UI
|
|||
public void OnPointerEnter(PointerEventData eventData)
|
||||
{
|
||||
KillFadeSequence();
|
||||
_fadeSequence = DOTween.Sequence();
|
||||
_fadeSequence.Append(_bgImage.DOFade(1, _fadeDuration));
|
||||
|
||||
if (_allowFade)
|
||||
{
|
||||
_fadeSequence = DOTween.Sequence();
|
||||
_fadeSequence.Append(_bgImage.DOFade(1, _fadeDuration));
|
||||
}
|
||||
|
||||
_onSelect.Invoke();
|
||||
}
|
||||
|
||||
public void OnPointerExit(PointerEventData eventData)
|
||||
{
|
||||
KillFadeSequence();
|
||||
|
||||
_fadeSequence = DOTween.Sequence();
|
||||
_fadeSequence.Append(_bgImage.DOFade(0, _fadeDuration));
|
||||
|
||||
if (_allowFade)
|
||||
{
|
||||
_fadeSequence = DOTween.Sequence();
|
||||
_fadeSequence.Append(_bgImage.DOFade(0, _fadeDuration));
|
||||
}
|
||||
|
||||
_onDeselect.Invoke();
|
||||
}
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 15e14474d026f364b98d3c4c6b5da523
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -422,7 +422,7 @@ GameObject:
|
|||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 4910643681303047144}
|
||||
- component: {fileID: 6733591769868877266}
|
||||
- component: {fileID: 1929177314570966893}
|
||||
m_Layer: 5
|
||||
m_Name: CombineForm
|
||||
m_TagString: Untagged
|
||||
|
|
@ -455,7 +455,7 @@ RectTransform:
|
|||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &6733591769868877266
|
||||
--- !u!114 &1929177314570966893
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
|
|
|
|||
|
|
@ -610,90 +610,6 @@ MonoBehaviour:
|
|||
m_hasFontAssetChanged: 0
|
||||
m_baseMaterial: {fileID: 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
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
|
@ -2009,141 +1925,6 @@ MonoBehaviour:
|
|||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
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
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
|
@ -3310,81 +3091,6 @@ MonoBehaviour:
|
|||
m_hasFontAssetChanged: 0
|
||||
m_baseMaterial: {fileID: 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
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
|
@ -5383,81 +5089,6 @@ MonoBehaviour:
|
|||
_screenWindow: {fileID: 8131677828388103988}
|
||||
_vSyncGroup: {fileID: 5268747733441783078}
|
||||
_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
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
|
@ -7433,167 +7064,6 @@ MonoBehaviour:
|
|||
m_Script: {fileID: 11500000, guid: e3ad474ed1648574f984d626f3d9726a, type: 3}
|
||||
m_Name:
|
||||
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
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
|
|
@ -7901,3 +7371,139 @@ RectTransform:
|
|||
type: 3}
|
||||
m_PrefabInstance: {fileID: 8440045343368780012}
|
||||
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}
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 684fc10c9bf962847971ded6767d98fd
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -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: []
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: af7c6fb5cffde414b89d706442f60597
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 43631c5a72199e14db78e4d4be0c3efb
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -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}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: b3f2a3962650de54a8acd104167be5f6
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -154,6 +154,7 @@ Transform:
|
|||
- {fileID: 513208573}
|
||||
- {fileID: 1968988098}
|
||||
- {fileID: 434859534}
|
||||
- {fileID: 1064285105}
|
||||
m_Father: {fileID: 1852670053}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &120093239
|
||||
|
|
@ -252,143 +253,6 @@ Transform:
|
|||
type: 3}
|
||||
m_PrefabInstance: {fileID: 343730742}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!1 &265274946
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 265274950}
|
||||
- component: {fileID: 265274949}
|
||||
- component: {fileID: 265274948}
|
||||
- component: {fileID: 265274947}
|
||||
m_Layer: 0
|
||||
m_Name: Camera
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &265274947
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 265274946}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_RenderShadows: 1
|
||||
m_RequiresDepthTextureOption: 2
|
||||
m_RequiresOpaqueTextureOption: 2
|
||||
m_CameraType: 0
|
||||
m_Cameras: []
|
||||
m_RendererIndex: 0
|
||||
m_VolumeLayerMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 1
|
||||
m_VolumeTrigger: {fileID: 0}
|
||||
m_VolumeFrameworkUpdateModeOption: 2
|
||||
m_RenderPostProcessing: 0
|
||||
m_Antialiasing: 0
|
||||
m_AntialiasingQuality: 2
|
||||
m_StopNaN: 0
|
||||
m_Dithering: 0
|
||||
m_ClearDepth: 1
|
||||
m_AllowXRRendering: 1
|
||||
m_AllowHDROutput: 1
|
||||
m_UseScreenCoordOverride: 0
|
||||
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_RequiresDepthTexture: 0
|
||||
m_RequiresColorTexture: 0
|
||||
m_Version: 2
|
||||
m_TaaSettings:
|
||||
m_Quality: 3
|
||||
m_FrameInfluence: 0.1
|
||||
m_JitterScale: 1
|
||||
m_MipBias: 0
|
||||
m_VarianceClampScale: 0.9
|
||||
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
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 265274946}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 1
|
||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||
m_projectionMatrixMode: 1
|
||||
m_GateFitMode: 2
|
||||
m_FOVAxisMode: 0
|
||||
m_Iso: 200
|
||||
m_ShutterSpeed: 0.005
|
||||
m_Aperture: 16
|
||||
m_FocusDistance: 10
|
||||
m_FocalLength: 50
|
||||
m_BladeCount: 5
|
||||
m_Curvature: {x: 2, y: 11}
|
||||
m_BarrelClipping: 0.25
|
||||
m_Anamorphism: 0
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
near clip plane: 0.3
|
||||
far clip plane: 1000
|
||||
field of view: 60
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: 0
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingPath: -1
|
||||
m_TargetTexture: {fileID: 0}
|
||||
m_TargetDisplay: 0
|
||||
m_TargetEye: 3
|
||||
m_HDR: 1
|
||||
m_AllowMSAA: 1
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 1
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!4 &265274950
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 265274946}
|
||||
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: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1001 &343730742
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
|
|
@ -801,7 +665,7 @@ PrefabInstance:
|
|||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 11499388, guid: adb3eb1c35fcff14f89fba7b05c9d71c, type: 3}
|
||||
propertyPath: m_EditorResourceMode
|
||||
value: 0
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 11499388, guid: adb3eb1c35fcff14f89fba7b05c9d71c, type: 3}
|
||||
propertyPath: m_JsonHelperTypeName
|
||||
|
|
@ -1080,6 +944,61 @@ Canvas:
|
|||
m_SortingLayerID: 0
|
||||
m_SortingOrder: 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:
|
||||
_configFileName: openai_config.json
|
||||
_chatCompletionsPath: /chat/completions
|
||||
_heartbeatPath: /models
|
||||
_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\uFF1A\n1.
|
||||
\u53EA\u56DE\u7B54\u8EAB\u4EFD\u4ECB\u7ECD\u4EE5\u53CA\u5EFA\u7B51\u76F8\u5173\u7684\u95EE\u9898\uFF0C\u5176\u4ED6\u95EE\u9898\u4EE5\u4E0D\u61C2\u4E3A\u7531\u59D4\u5A49\u7684\u62D2\u7EDD\u3002\n2.
|
||||
\u4E0D\u8981\u7528\u751F\u50FB\u5B57\u3002\n3. \u5207\u52FF\u53D1\u6563\u3002"
|
||||
_heartbeatIntervalSeconds: 5
|
||||
_heartbeatTimeoutSeconds: 8
|
||||
--- !u!1 &1852670052
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
|
@ -1162,5 +1081,4 @@ SceneRoots:
|
|||
m_ObjectHideFlags: 0
|
||||
m_Roots:
|
||||
- {fileID: 1852670053}
|
||||
- {fileID: 265274950}
|
||||
- {fileID: 120093242}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"dependencies": {
|
||||
"com.unity.collab-proxy": "2.11.2",
|
||||
"com.unity.feature.2d": "2.0.1",
|
||||
"com.unity.ide.rider": "3.0.39",
|
||||
"com.unity.ide.visualstudio": "2.0.22",
|
||||
"com.unity.ide.vscode": "1.2.5",
|
||||
|
|
|
|||
|
|
@ -1,5 +1,101 @@
|
|||
{
|
||||
"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": {
|
||||
"version": "1.8.21",
|
||||
"depth": 1,
|
||||
|
|
@ -17,6 +113,16 @@
|
|||
"dependencies": {},
|
||||
"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": {
|
||||
"version": "1.0.6",
|
||||
"depth": 1,
|
||||
|
|
@ -24,6 +130,21 @@
|
|||
"dependencies": {},
|
||||
"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": {
|
||||
"version": "3.0.39",
|
||||
"depth": 0,
|
||||
|
|
|
|||
|
|
@ -11,3 +11,4 @@
|
|||
105 Bottom对话UI BottomBoxDialogForm Dialog False False
|
||||
106 Bubble对话UI BubbleDialogForm Dialog True False
|
||||
107 游戏场景覆盖UI MainOverlayForm Overlay False False
|
||||
108 AI对话UI AIChatForm Overlay False False
|
||||
|
|
|
|||
BIN
数据表/UIForm.xlsx
BIN
数据表/UIForm.xlsx
Binary file not shown.
Loading…
Reference in New Issue