UI基本完成
This commit is contained in:
parent
c7d2ecea3d
commit
1dd92333ae
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,47 +1,50 @@
|
|||
using UnityEngine;
|
||||
using System.Net.Sockets;
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
public class BroadcastServer : MonoBehaviour
|
||||
{
|
||||
private UdpClient udpBroadcaster; // 用于广播本地IP的UDP客户端
|
||||
private Thread broadcastThread; // 运行广播循环的线程
|
||||
private CancellationTokenSource cts = new CancellationTokenSource(); // 控制线程取消
|
||||
private volatile bool isRunning = true; // 控制广播循环的线程安全标志
|
||||
private UdpClient udpClient; // 用于发送广播的UDP客户端
|
||||
private Thread broadcastThread; // 广播线程
|
||||
private volatile bool isRunning = true; // 线程安全的运行标志
|
||||
|
||||
// 脚本启动时调用
|
||||
void Start()
|
||||
{
|
||||
// 初始化UDP客户端并启用广播
|
||||
udpBroadcaster = new UdpClient();
|
||||
udpBroadcaster.EnableBroadcast = true;
|
||||
udpClient = new UdpClient();
|
||||
udpClient.EnableBroadcast = true;
|
||||
|
||||
// 启动新线程以广播本地IP
|
||||
broadcastThread = new Thread(() => BroadcastIP(cts.Token));
|
||||
// 启动广播线程
|
||||
broadcastThread = new Thread(BroadcastIP);
|
||||
broadcastThread.Start();
|
||||
|
||||
Debug.Log("显示端正在广播IP...");
|
||||
Debug.Log("广播服务器已启动");
|
||||
}
|
||||
|
||||
// 定期广播本地IP地址
|
||||
private void BroadcastIP(CancellationToken token)
|
||||
// 广播显示端服务器的IP地址
|
||||
private void BroadcastIP()
|
||||
{
|
||||
// 定义广播端点(IP: 255.255.255.255,端口: 9999)
|
||||
IPEndPoint endPoint = new IPEndPoint(IPAddress.Broadcast, 9999);
|
||||
string localIP = GetLocalIPAddress(); // 获取本地IPv4地址
|
||||
string localIP = GetLocalIPAddress();
|
||||
if (string.IsNullOrEmpty(localIP))
|
||||
{
|
||||
Debug.LogError("无法获取本地IP地址");
|
||||
return;
|
||||
}
|
||||
|
||||
// 在未取消的情况下持续广播
|
||||
while (!token.IsCancellationRequested && isRunning)
|
||||
string message = $"ServerIP:{localIP}";
|
||||
byte[] data = Encoding.UTF8.GetBytes(message);
|
||||
IPEndPoint endPoint = new IPEndPoint(IPAddress.Broadcast, 8887);
|
||||
|
||||
while (isRunning)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 将IP地址转换为字节并通过UDP发送
|
||||
byte[] data = Encoding.UTF8.GetBytes(localIP);
|
||||
udpBroadcaster.Send(data, data.Length, endPoint);
|
||||
Thread.Sleep(2000); // 每2秒广播一次,减少网络负载
|
||||
udpClient.Send(data, data.Length, endPoint);
|
||||
Debug.Log($"广播IP: {message}");
|
||||
Thread.Sleep(1000); // 每秒广播一次
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
@ -50,30 +53,40 @@ public class BroadcastServer : MonoBehaviour
|
|||
}
|
||||
}
|
||||
|
||||
// 获取本机的IPv4地址
|
||||
// 获取本地IP地址
|
||||
private string GetLocalIPAddress()
|
||||
{
|
||||
string localIP = "127.0.0.1"; // 如果未找到有效IP,则回退到本地回环地址
|
||||
foreach (var ip in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
|
||||
try
|
||||
{
|
||||
if (ip.AddressFamily == AddressFamily.InterNetwork)
|
||||
foreach (var networkInterface in NetworkInterface.GetAllNetworkInterfaces())
|
||||
{
|
||||
localIP = ip.ToString(); // 使用找到的第一个IPv4地址
|
||||
break;
|
||||
if (networkInterface.OperationalStatus == OperationalStatus.Up)
|
||||
{
|
||||
foreach (var unicastIPAddress in networkInterface.GetIPProperties().UnicastAddresses)
|
||||
{
|
||||
if (unicastIPAddress.Address.AddressFamily == AddressFamily.InterNetwork)
|
||||
{
|
||||
return unicastIPAddress.Address.ToString();
|
||||
}
|
||||
}
|
||||
return localIP;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"获取IP地址错误: {ex.Message}");
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
// 应用程序退出时清理资源
|
||||
private void OnApplicationQuit()
|
||||
{
|
||||
isRunning = false; // 通知广播循环停止
|
||||
cts.Cancel(); // 请求线程取消
|
||||
udpBroadcaster?.Close(); // 关闭UDP客户端
|
||||
isRunning = false;
|
||||
udpClient?.Close();
|
||||
if (broadcastThread != null && broadcastThread.IsAlive)
|
||||
{
|
||||
broadcastThread.Join(1000); // 等待线程结束,超时1秒
|
||||
broadcastThread.Join(1000); // 等待线程结束
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -5,6 +5,7 @@ using System.Text;
|
|||
using System.Threading;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public class DisplayServer : MonoBehaviour
|
||||
{
|
||||
|
|
@ -35,6 +36,10 @@ public class DisplayServer : MonoBehaviour
|
|||
private float sendInterval = 0.05f; // 进度发送间隔(秒)
|
||||
private float lastSentProgress = 0f; // 记录上次发送的进度
|
||||
|
||||
[Header("Background Sprites")]
|
||||
public Sprite textBackgroundSprite; // 有文字时的背景Sprite
|
||||
public Sprite noTextBackgroundSprite; // 无文字时的背景Sprite
|
||||
|
||||
// 脚本启动时调用
|
||||
void Start()
|
||||
{
|
||||
|
|
@ -167,6 +172,18 @@ public class DisplayServer : MonoBehaviour
|
|||
isClientDragging = false; // 客户端拖动结束
|
||||
Debug.Log("客户端Slider拖动结束");
|
||||
}
|
||||
else if (msg.StartsWith("TextPanel:"))
|
||||
{
|
||||
string command = msg.Replace("TextPanel:", "");
|
||||
SetTextPanelVisibility(command == "Show");
|
||||
Debug.Log($"处理文字面板消息: {msg}");
|
||||
}
|
||||
else if (msg.StartsWith("Background:"))
|
||||
{
|
||||
string command = msg.Replace("Background:", "");
|
||||
SetBackgroundSprite(command == "Text");
|
||||
Debug.Log($"处理背景消息: {msg}");
|
||||
}
|
||||
}
|
||||
|
||||
// 仅当动画播放且客户端未拖动时发送进度,且限制发送频率
|
||||
|
|
@ -242,6 +259,11 @@ public class DisplayServer : MonoBehaviour
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 初始化文字面板为显示
|
||||
SetTextPanelVisibility(true);
|
||||
// 初始化背景为有文字背景
|
||||
SetBackgroundSprite(true);
|
||||
Debug.Log($"显示端切换到页面: {pageName}");
|
||||
}
|
||||
|
||||
|
|
@ -292,6 +314,65 @@ public class DisplayServer : MonoBehaviour
|
|||
}
|
||||
}
|
||||
|
||||
// 设置当前页面文字面板的显隐
|
||||
private void SetTextPanelVisibility(bool isVisible)
|
||||
{
|
||||
if (background == null || currentPage == "首页") return;
|
||||
|
||||
Transform pageTransform = background.Find(currentPage);
|
||||
if (pageTransform != null)
|
||||
{
|
||||
Transform textPanel = pageTransform.Find("TextPanel");
|
||||
if (textPanel != null)
|
||||
{
|
||||
textPanel.gameObject.SetActive(isVisible);
|
||||
Debug.Log($"设置页面 {currentPage} 文字面板显隐: {isVisible}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"未在页面 {currentPage} 找到TextPanel");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"未找到页面 {currentPage}");
|
||||
}
|
||||
}
|
||||
|
||||
// 设置当前页面背景的Sprite
|
||||
private void SetBackgroundSprite(bool hasText)
|
||||
{
|
||||
if (background == null || currentPage == "首页") return;
|
||||
|
||||
Transform pageTransform = background.Find(currentPage);
|
||||
if (pageTransform != null)
|
||||
{
|
||||
Transform backgroundTransform = pageTransform.Find("PageBackground");
|
||||
if (backgroundTransform != null)
|
||||
{
|
||||
Image backgroundImage = backgroundTransform.GetComponent<Image>();
|
||||
if (backgroundImage != null)
|
||||
{
|
||||
Sprite newSprite = hasText ? textBackgroundSprite : noTextBackgroundSprite;
|
||||
backgroundImage.sprite = newSprite;
|
||||
Debug.Log($"设置页面 {currentPage} 背景: {(newSprite != null ? newSprite.name : "null")}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"页面 {currentPage} 的PageBackground未找到Image组件");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"未在页面 {currentPage} 找到PageBackground");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"未找到页面 {currentPage}");
|
||||
}
|
||||
}
|
||||
|
||||
// 处理动画结束事件
|
||||
private void OnModelAnimationFinished()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,190 +1,79 @@
|
|||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
|
||||
public class ModelController : MonoBehaviour
|
||||
{
|
||||
private Animator animator; // 控制动画的Animator组件
|
||||
private string currentAnim = ""; // 跟踪当前播放的动画
|
||||
private bool isPlaying = false; // 跟踪动画播放状态
|
||||
private Animator animator; // 用于控制动画
|
||||
public delegate void AnimationFinished(); // 动画结束事件
|
||||
public event AnimationFinished OnAnimationFinished; // 动画结束事件
|
||||
|
||||
[Header("默认动画状态名称")]
|
||||
public string defaultAnimName = "Take 001"; // 默认动画状态名称
|
||||
|
||||
private Dictionary<string, int> stateHashes = new Dictionary<string, int>(); // 动画状态哈希缓存
|
||||
private float lastLoggedProgress = -1f; // 记录上次日志的进度值
|
||||
private float lastWarningTime = 0f; // 记录上次警告日志时间
|
||||
private const float warningInterval = 1f; // 警告日志间隔(秒)
|
||||
|
||||
// 动画结束事件
|
||||
public event Action OnAnimationFinished;
|
||||
|
||||
// 脚本初始化时调用
|
||||
void Awake()
|
||||
// 脚本启动时调用
|
||||
void Start()
|
||||
{
|
||||
animator = GetComponent<Animator>();
|
||||
// 缓存默认动画状态的哈希值以提高性能
|
||||
if (!string.IsNullOrEmpty(defaultAnimName))
|
||||
if (animator == null)
|
||||
{
|
||||
stateHashes[defaultAnimName] = Animator.StringToHash(defaultAnimName);
|
||||
Debug.LogError($"模型 {gameObject.name} 未找到Animator组件");
|
||||
}
|
||||
}
|
||||
|
||||
// 在Update中更新动画状态
|
||||
void Update()
|
||||
{
|
||||
if (isPlaying && animator != null && !string.IsNullOrEmpty(currentAnim))
|
||||
{
|
||||
if (!animator.enabled)
|
||||
{
|
||||
animator.enabled = true; // 确保Animator启用
|
||||
Debug.Log($"重新启用Animator: {currentAnim}");
|
||||
}
|
||||
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
|
||||
if (stateInfo.IsName(currentAnim) && stateInfo.normalizedTime >= 1f)
|
||||
{
|
||||
// 动画播放完成,暂停并标记
|
||||
animator.enabled = false;
|
||||
isPlaying = false;
|
||||
OnAnimationFinished?.Invoke(); // 通知动画结束
|
||||
Debug.Log($"动画 {currentAnim} 播放完成,暂停");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从头播放默认动画
|
||||
/// </summary>
|
||||
// 播放动画
|
||||
public void PlayAnimation()
|
||||
{
|
||||
if (animator == null || string.IsNullOrEmpty(defaultAnimName)) return;
|
||||
if (!AnimatorHasState(defaultAnimName))
|
||||
if (animator != null)
|
||||
{
|
||||
Debug.LogWarning($"Animator上不存在状态: {defaultAnimName}");
|
||||
return;
|
||||
animator.Play("Base Layer.AnimationName", 0, 0f); // 替换为实际动画名称
|
||||
Debug.Log($"模型 {gameObject.name} 开始播放动画");
|
||||
}
|
||||
}
|
||||
|
||||
currentAnim = defaultAnimName;
|
||||
animator.enabled = true;
|
||||
animator.Play(currentAnim, 0, 0f); // 从头播放动画
|
||||
animator.Update(0f); // 强制立即更新
|
||||
isPlaying = true; // 标记动画正在播放
|
||||
Debug.Log($"开始播放动画: {currentAnim}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置动画进度(0到1)
|
||||
/// </summary>
|
||||
public void SetAnimationProgress(float normalizedTime)
|
||||
// 设置动画进度
|
||||
public void SetAnimationProgress(float progress)
|
||||
{
|
||||
if (animator == null || string.IsNullOrEmpty(defaultAnimName)) return;
|
||||
if (!gameObject.activeSelf) return;
|
||||
|
||||
// 确保currentAnim已设置
|
||||
if (string.IsNullOrEmpty(currentAnim))
|
||||
if (animator != null)
|
||||
{
|
||||
currentAnim = defaultAnimName;
|
||||
Debug.Log($"设置动画进度前初始化currentAnim: {currentAnim}");
|
||||
animator.Play("Base Layer.AnimationName", 0, progress); // 替换为实际动画名称
|
||||
animator.speed = 0f; // 暂停动画以保持进度
|
||||
Debug.Log($"模型 {gameObject.name} 设置动画进度: {progress:F2}");
|
||||
}
|
||||
}
|
||||
|
||||
if (!AnimatorHasState(currentAnim))
|
||||
{
|
||||
Debug.LogWarning($"Animator上不存在状态: {currentAnim}");
|
||||
return;
|
||||
}
|
||||
|
||||
// 停止播放状态
|
||||
isPlaying = false;
|
||||
animator.enabled = true;
|
||||
float clampedTime = Mathf.Clamp01(normalizedTime);
|
||||
animator.Play(currentAnim, 0, clampedTime); // 设置动画到指定时间
|
||||
animator.Update(0f); // 强制立即更新
|
||||
animator.enabled = false; // 暂停动画
|
||||
Debug.Log($"设置动画 {currentAnim} 进度: {clampedTime:F2}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重置动画到初始状态
|
||||
/// </summary>
|
||||
// 重置动画
|
||||
public void ResetAnimation()
|
||||
{
|
||||
if (animator == null) return;
|
||||
if (!gameObject.activeSelf) return;
|
||||
|
||||
string animToReset = !string.IsNullOrEmpty(defaultAnimName) ? defaultAnimName : "";
|
||||
if (string.IsNullOrEmpty(animToReset)) return;
|
||||
|
||||
currentAnim = animToReset; // 确保currentAnim已设置
|
||||
animator.enabled = true;
|
||||
animator.Play(currentAnim, 0, 0f); // 重置到开始
|
||||
animator.Update(0f); // 强制立即更新
|
||||
animator.enabled = false; // 暂停动画
|
||||
isPlaying = false; // 标记动画暂停
|
||||
Debug.Log($"重置动画: {currentAnim}");
|
||||
if (animator != null)
|
||||
{
|
||||
animator.Play("Base Layer.AnimationName", 0, 0f); // 替换为实际动画名称
|
||||
animator.speed = 1f; // 恢复正常播放速度
|
||||
Debug.Log($"模型 {gameObject.name} 重置动画");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前动画的标准化时间(0到1)
|
||||
/// </summary>
|
||||
/// <returns>当前动画进度,若无动画则返回0</returns>
|
||||
public float GetAnimationProgress()
|
||||
// 检查动画是否正在播放
|
||||
public bool IsPlayingAnimation()
|
||||
{
|
||||
if (animator == null || !animator.enabled || string.IsNullOrEmpty(currentAnim) || !gameObject.activeSelf)
|
||||
if (animator != null)
|
||||
{
|
||||
if (Time.time - lastWarningTime >= warningInterval)
|
||||
{
|
||||
Debug.LogWarning($"无法获取动画进度: animator={animator}, enabled={animator?.enabled}, currentAnim={currentAnim}, active={gameObject.activeSelf}");
|
||||
lastWarningTime = Time.time;
|
||||
}
|
||||
return 0f;
|
||||
}
|
||||
|
||||
if (!AnimatorHasState(currentAnim))
|
||||
{
|
||||
if (Time.time - lastWarningTime >= warningInterval)
|
||||
{
|
||||
Debug.LogWarning($"Animator上不存在状态: {currentAnim}");
|
||||
lastWarningTime = Time.time;
|
||||
}
|
||||
return 0f;
|
||||
}
|
||||
|
||||
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
|
||||
if (stateInfo.IsName(currentAnim))
|
||||
{
|
||||
float progress = Mathf.Clamp01(stateInfo.normalizedTime % 1f);
|
||||
// 仅当进度变化超过0.01时记录日志
|
||||
if (Mathf.Abs(progress - lastLoggedProgress) > 0.01f)
|
||||
{
|
||||
Debug.Log($"获取动画 {currentAnim} 进度: {progress:F2}");
|
||||
lastLoggedProgress = progress;
|
||||
}
|
||||
return progress;
|
||||
}
|
||||
if (Time.time - lastWarningTime >= warningInterval)
|
||||
{
|
||||
Debug.LogWarning($"动画状态不匹配: currentAnim={currentAnim}, state={stateInfo.fullPathHash}");
|
||||
lastWarningTime = Time.time;
|
||||
}
|
||||
return 0f;
|
||||
}
|
||||
|
||||
// 检查指定的动画状态是否存在于Animator中
|
||||
private bool AnimatorHasState(string stateName)
|
||||
{
|
||||
if (stateHashes.TryGetValue(stateName, out int hash))
|
||||
{
|
||||
for (int i = 0; i < animator.layerCount; i++)
|
||||
{
|
||||
if (animator.HasState(i, hash)) return true;
|
||||
}
|
||||
return stateInfo.normalizedTime < 1.0f && animator.speed > 0f;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取动画播放状态
|
||||
public bool IsPlayingAnimation()
|
||||
// 获取当前动画进度
|
||||
public float GetAnimationProgress()
|
||||
{
|
||||
return isPlaying;
|
||||
if (animator != null)
|
||||
{
|
||||
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
|
||||
return Mathf.Clamp01(stateInfo.normalizedTime);
|
||||
}
|
||||
return 0f;
|
||||
}
|
||||
|
||||
// 动画结束时调用(需在Animator中设置)
|
||||
public void OnAnimationEnd()
|
||||
{
|
||||
OnAnimationFinished?.Invoke();
|
||||
Debug.Log($"模型 {gameObject.name} 动画播放完成");
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ using System.Net;
|
|||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
|
|
@ -28,6 +29,10 @@ public class TouchClient : MonoBehaviour
|
|||
private bool isDraggingSlider = false; // 标记是否正在拖动Slider
|
||||
private float lastSentProgress = 0f; // 记录最后发送的进度
|
||||
|
||||
[Header("Text Panel Toggle Sprites")]
|
||||
public Sprite showSprite; // 显示状态的Sprite
|
||||
public Sprite hideSprite; // 隐藏状态的Sprite
|
||||
|
||||
// 脚本启动时调用
|
||||
void Start()
|
||||
{
|
||||
|
|
@ -207,6 +212,41 @@ public class TouchClient : MonoBehaviour
|
|||
Debug.Log("Slider拖动结束");
|
||||
}
|
||||
|
||||
// 文字面板Toggle状态改变时调用
|
||||
public void OnTextPanelToggleChanged(Toggle toggle)
|
||||
{
|
||||
if (toggle == null) return;
|
||||
|
||||
bool isTextPanelVisible = toggle.isOn;
|
||||
Image toggleImage = toggle.graphic as Image; // 使用Toggle的graphic字段
|
||||
TextMeshProUGUI toggleText = toggle.GetComponentInChildren<TextMeshProUGUI>();
|
||||
|
||||
if (toggleImage != null)
|
||||
{
|
||||
toggleImage.sprite = isTextPanelVisible ? showSprite : hideSprite;
|
||||
Debug.Log($"Toggle sprite 切换: {currentPage}, isOn={isTextPanelVisible}, sprite={(isTextPanelVisible ? showSprite : hideSprite).name}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"Toggle {toggle.name} 未找到graphic Image组件");
|
||||
}
|
||||
|
||||
if (toggleText != null)
|
||||
{
|
||||
toggleText.text = isTextPanelVisible ? "显示文字" : "隐藏文字";
|
||||
Debug.Log($"Toggle 文本更新: {currentPage}, text={toggleText.text}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"Toggle {toggle.name} 未找到TextMeshProUGUI组件");
|
||||
}
|
||||
|
||||
// 发送显隐消息到显示端
|
||||
string message = isTextPanelVisible ? "TextPanel:Show" : "TextPanel:Hide";
|
||||
SendMessageToServer(message);
|
||||
Debug.Log($"文字面板Toggle切换: {message}");
|
||||
}
|
||||
|
||||
// 获取当前页面的Slider组件
|
||||
private Slider GetCurrentPageSlider()
|
||||
{
|
||||
|
|
@ -232,6 +272,31 @@ public class TouchClient : MonoBehaviour
|
|||
return null;
|
||||
}
|
||||
|
||||
// 获取当前页面的TextPanelToggle组件
|
||||
private Toggle GetCurrentPageTextPanelToggle()
|
||||
{
|
||||
if (background == null || currentPage == "首页") return null;
|
||||
|
||||
Transform pageTransform = background.Find(currentPage);
|
||||
if (pageTransform != null)
|
||||
{
|
||||
Toggle toggle = pageTransform.GetComponentInChildren<Toggle>();
|
||||
if (toggle != null)
|
||||
{
|
||||
if (!toggle.interactable)
|
||||
{
|
||||
toggle.interactable = true; // 确保Toggle可交互
|
||||
Debug.Log($"启用TextPanelToggle交互: {currentPage}");
|
||||
}
|
||||
return toggle;
|
||||
}
|
||||
Debug.LogWarning($"未在页面 {currentPage} 找到TextPanelToggle");
|
||||
return null;
|
||||
}
|
||||
Debug.LogWarning($"未找到页面 {currentPage}");
|
||||
return null;
|
||||
}
|
||||
|
||||
// 切换激活的UI页面
|
||||
private void ShowPage(string pageName)
|
||||
{
|
||||
|
|
@ -264,7 +329,46 @@ public class TouchClient : MonoBehaviour
|
|||
Debug.Log($"初始化Slider: {pageName}, 值: {slider.value}");
|
||||
}
|
||||
|
||||
Debug.Log($"切换到页面: {pageName}, Slider {(slider != null ? "找到" : "未找到")}");
|
||||
// 初始化当前页面的TextPanelToggle
|
||||
Toggle toggle = GetCurrentPageTextPanelToggle();
|
||||
if (toggle != null)
|
||||
{
|
||||
// 临时禁用OnValueChanged以防止初始化触发
|
||||
var onValueChanged = toggle.onValueChanged;
|
||||
toggle.onValueChanged = new Toggle.ToggleEvent();
|
||||
toggle.isOn = true; // 默认显示文字面板
|
||||
toggle.interactable = true; // 确保可交互
|
||||
// 更新Sprite和文本
|
||||
Image toggleImage = toggle.graphic as Image; // 使用Toggle的graphic字段
|
||||
TextMeshProUGUI toggleText = toggle.GetComponentInChildren<TextMeshProUGUI>();
|
||||
if (toggleImage != null)
|
||||
{
|
||||
toggleImage.sprite = showSprite;
|
||||
Debug.Log($"初始化Toggle sprite: {pageName}, sprite={showSprite.name}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"Toggle {toggle.name} 未找到graphic Image组件");
|
||||
}
|
||||
if (toggleText != null)
|
||||
{
|
||||
toggleText.text = "显示文字";
|
||||
Debug.Log($"初始化Toggle 文本: {pageName}, text={toggleText.text}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"Toggle {toggle.name} 未找到TextMeshProUGUI组件");
|
||||
}
|
||||
// 恢复OnValueChanged并绑定
|
||||
toggle.onValueChanged = onValueChanged;
|
||||
toggle.onValueChanged.RemoveAllListeners();
|
||||
toggle.onValueChanged.AddListener((value) => OnTextPanelToggleChanged(toggle));
|
||||
// 发送初始显隐状态
|
||||
SendMessageToServer("TextPanel:Show");
|
||||
Debug.Log($"初始化TextPanelToggle: {pageName}, isOn: {toggle.isOn}");
|
||||
}
|
||||
|
||||
Debug.Log($"切换到页面: {pageName}, Slider {(slider != null ? "找到" : "未找到")}, TextPanelToggle {(toggle != null ? "找到" : "未找到")}");
|
||||
}
|
||||
|
||||
// 在主线程中更新Slider进度
|
||||
|
|
|
|||
|
|
@ -12,10 +12,10 @@ EditorUserSettings:
|
|||
value: 54035756510d5a0c095f0d7414760b4446154b782e7b7063752a1b62e7b5363b
|
||||
flags: 0
|
||||
RecentlyUsedSceneGuid-2:
|
||||
value: 5303510050530a0a0e58087140210b44474f1a78742973637a2a4560b5b3656d
|
||||
value: 5a5757560101590a5d0c0e24427b5d44434e4c7a7b7a23677f2b4565b7b5353a
|
||||
flags: 0
|
||||
RecentlyUsedSceneGuid-3:
|
||||
value: 5a5757560101590a5d0c0e24427b5d44434e4c7a7b7a23677f2b4565b7b5353a
|
||||
value: 5303510050530a0a0e58087140210b44474f1a78742973637a2a4560b5b3656d
|
||||
flags: 0
|
||||
vcSharedLogLevel:
|
||||
value: 0d5e400f0650
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ MonoBehaviour:
|
|||
m_MinSize: {x: 300, y: 200}
|
||||
m_MaxSize: {x: 24288, y: 16192}
|
||||
vertical: 0
|
||||
controlID: 70
|
||||
controlID: 17
|
||||
--- !u!114 &5
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
|
|
@ -138,7 +138,7 @@ MonoBehaviour:
|
|||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 890.4
|
||||
width: 854.4
|
||||
height: 722.8
|
||||
m_MinSize: {x: 201, y: 221}
|
||||
m_MaxSize: {x: 4001, y: 4021}
|
||||
|
|
@ -167,14 +167,14 @@ MonoBehaviour:
|
|||
- {fileID: 10}
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 890.4
|
||||
x: 854.4
|
||||
y: 0
|
||||
width: 242.40002
|
||||
width: 278.40002
|
||||
height: 722.8
|
||||
m_MinSize: {x: 100, y: 200}
|
||||
m_MaxSize: {x: 8096, y: 16192}
|
||||
vertical: 1
|
||||
controlID: 38
|
||||
controlID: 69
|
||||
--- !u!114 &8
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
|
|
@ -218,7 +218,7 @@ MonoBehaviour:
|
|||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 242.40002
|
||||
width: 278.40002
|
||||
height: 400.8
|
||||
m_MinSize: {x: 202, y: 221}
|
||||
m_MaxSize: {x: 4002, y: 4021}
|
||||
|
|
@ -244,7 +244,7 @@ MonoBehaviour:
|
|||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 400.8
|
||||
width: 242.40002
|
||||
width: 278.40002
|
||||
height: 322
|
||||
m_MinSize: {x: 232, y: 271}
|
||||
m_MaxSize: {x: 10002, y: 10021}
|
||||
|
|
@ -284,7 +284,7 @@ MonoBehaviour:
|
|||
m_OverlaysVisible: 1
|
||||
m_LockTracker:
|
||||
m_IsLocked: 0
|
||||
m_LastSelectedObjectID: 656666
|
||||
m_LastSelectedObjectID: 540690
|
||||
--- !u!114 &12
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
|
|
@ -307,8 +307,8 @@ MonoBehaviour:
|
|||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 73.6
|
||||
width: 1186.2
|
||||
height: 989.80005
|
||||
width: 853.4
|
||||
height: 701.8
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
m_OverlayCanvas:
|
||||
m_LastAppliedPresetName: Default
|
||||
|
|
@ -403,9 +403,9 @@ MonoBehaviour:
|
|||
e32: 0
|
||||
e33: 1
|
||||
m_PreviewAnimator: {fileID: 0}
|
||||
m_AnimatorController: {fileID: 9100000, guid: da2d18bdd63eddf4db4344988663132b, type: 2}
|
||||
m_AnimatorController: {fileID: 9100000, guid: c06c13b013fc9334096e1edcfb15e759, type: 2}
|
||||
m_BreadCrumbs:
|
||||
- m_Target: {fileID: -5493858010228640296, guid: da2d18bdd63eddf4db4344988663132b, type: 2}
|
||||
- m_Target: {fileID: -2230655706508628860, guid: c06c13b013fc9334096e1edcfb15e759, type: 2}
|
||||
m_ScrollPosition: {x: 0, y: 0}
|
||||
stateMachineGraph: {fileID: 0}
|
||||
stateMachineGraphGUI: {fileID: 0}
|
||||
|
|
@ -480,9 +480,9 @@ MonoBehaviour:
|
|||
m_Tooltip:
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 890.4
|
||||
x: 854.4
|
||||
y: 474.4
|
||||
width: 240.40002
|
||||
width: 276.40002
|
||||
height: 301
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
m_OverlayCanvas:
|
||||
|
|
@ -515,7 +515,7 @@ MonoBehaviour:
|
|||
scrollPos: {x: 0, y: 0}
|
||||
m_SelectedIDs: 7c780000
|
||||
m_LastClickedID: 30844
|
||||
m_ExpandedIDs: 00000000745d0000765d0000785d00007a5d00007c5d00007e5d0000805d0000
|
||||
m_ExpandedIDs: 000000005cac01005eac010060ac010062ac010064ac010066ac010068ac01006aac01006cac01006eac010070ac0100
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
|
|
@ -540,10 +540,10 @@ MonoBehaviour:
|
|||
m_Icon: {fileID: 0}
|
||||
m_ResourceFile:
|
||||
m_AssetTreeState:
|
||||
scrollPos: {x: 0, y: 0}
|
||||
scrollPos: {x: 0, y: 465}
|
||||
m_SelectedIDs:
|
||||
m_LastClickedID: 0
|
||||
m_ExpandedIDs: ffffffff00000000745d0000765d0000785d00007a5d00007c5d00007e5d0000805d0000
|
||||
m_ExpandedIDs: ffffffff000000005cac01005eac010060ac010062ac010064ac010066ac010068ac01006aac01006cac01006eac010070ac0100beac0100
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
|
|
@ -621,7 +621,7 @@ MonoBehaviour:
|
|||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 73.6
|
||||
width: 889.4
|
||||
width: 853.4
|
||||
height: 701.8
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
m_OverlayCanvas:
|
||||
|
|
@ -864,14 +864,14 @@ MonoBehaviour:
|
|||
m_OverrideSceneCullingMask: 6917529027641081856
|
||||
m_SceneIsLit: 1
|
||||
m_SceneLighting: 1
|
||||
m_2DMode: 0
|
||||
m_2DMode: 1
|
||||
m_isRotationLocked: 0
|
||||
m_PlayAudio: 0
|
||||
m_AudioPlay: 0
|
||||
m_Position:
|
||||
m_Target: {x: 1470.8665, y: 599.2432, z: -36.813965}
|
||||
m_Target: {x: 941.18176, y: 582.5733, z: 9.363111}
|
||||
speed: 2
|
||||
m_Value: {x: 1470.8665, y: 599.2432, z: -36.813965}
|
||||
m_Value: {x: 917.83325, y: 594.0318, z: 8.957989}
|
||||
m_RenderMode: 0
|
||||
m_CameraMode:
|
||||
drawMode: 0
|
||||
|
|
@ -900,17 +900,17 @@ MonoBehaviour:
|
|||
m_Size: {x: 0, y: 0}
|
||||
yGrid:
|
||||
m_Fade:
|
||||
m_Target: 1
|
||||
m_Target: 0
|
||||
speed: 2
|
||||
m_Value: 1
|
||||
m_Value: 0
|
||||
m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4}
|
||||
m_Pivot: {x: 0, y: 0, z: 0}
|
||||
m_Size: {x: 1, y: 1}
|
||||
zGrid:
|
||||
m_Fade:
|
||||
m_Target: 0
|
||||
m_Target: 1
|
||||
speed: 2
|
||||
m_Value: 0
|
||||
m_Value: 1
|
||||
m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4}
|
||||
m_Pivot: {x: 0, y: 0, z: 0}
|
||||
m_Size: {x: 1, y: 1}
|
||||
|
|
@ -918,17 +918,17 @@ MonoBehaviour:
|
|||
m_GridAxis: 1
|
||||
m_gridOpacity: 0.5
|
||||
m_Rotation:
|
||||
m_Target: {x: 0.015004154, y: 0.020719247, z: -0.00030632256, w: 0.9996792}
|
||||
m_Target: {x: 0, y: 0, z: 0, w: 1}
|
||||
speed: 2
|
||||
m_Value: {x: 0.015004057, y: 0.020719113, z: -0.00030632058, w: 0.9996728}
|
||||
m_Value: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_Size:
|
||||
m_Target: 987.1142
|
||||
m_Target: 859.76056
|
||||
speed: 2
|
||||
m_Value: 987.1142
|
||||
m_Value: 900.2728
|
||||
m_Ortho:
|
||||
m_Target: 0
|
||||
m_Target: 1
|
||||
speed: 2
|
||||
m_Value: 0
|
||||
m_Value: 1
|
||||
m_CameraSettings:
|
||||
m_Speed: 0.7662
|
||||
m_SpeedNormalized: 0.38
|
||||
|
|
@ -969,9 +969,9 @@ MonoBehaviour:
|
|||
m_Tooltip:
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 890.4
|
||||
x: 854.4
|
||||
y: 73.6
|
||||
width: 240.40002
|
||||
width: 276.40002
|
||||
height: 379.8
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
m_OverlayCanvas:
|
||||
|
|
@ -980,10 +980,10 @@ MonoBehaviour:
|
|||
m_OverlaysVisible: 1
|
||||
m_SceneHierarchy:
|
||||
m_TreeViewState:
|
||||
scrollPos: {x: 0, y: 0}
|
||||
scrollPos: {x: 0, y: 5.200012}
|
||||
m_SelectedIDs:
|
||||
m_LastClickedID: 0
|
||||
m_ExpandedIDs: 9255feffe255feff2857feff7c5afeffcc5afeff165cfeff021ffffff420ffff4821ffff8a22ffff5624ffffc427ffff1428ffff5a29ffffa42cfffff42cffff3a2effffb031ffff0432ffff4e33ffff86f6ffffc2f7ffff12f8ffff54f9ffff08fbffff1271030070c9030022f60700804e080046040a001a070a00ae070a00b6070a00f8070a00
|
||||
m_ExpandedIDs: 4228ffff08fbffff205900004c59000050590000605900006e590000865900008a59000096590000f2ad0100f6ad010030ae010040ae010014af0100b2af0100b6af0100ecaf010000b001002ab001004cb1010060b1010094b10100
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
|
|
@ -1029,7 +1029,7 @@ MonoBehaviour:
|
|||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 73.6
|
||||
width: 889.4
|
||||
width: 853.4
|
||||
height: 701.8
|
||||
m_ViewDataDictionary: {fileID: 0}
|
||||
m_OverlayCanvas:
|
||||
|
|
@ -1044,7 +1044,7 @@ MonoBehaviour:
|
|||
m_ShowGizmos: 0
|
||||
m_TargetDisplay: 0
|
||||
m_ClearColor: {r: 0, g: 0, b: 0, a: 0}
|
||||
m_TargetSize: {x: 3328, y: 1352}
|
||||
m_TargetSize: {x: 1920, y: 1080}
|
||||
m_TextureFilterMode: 0
|
||||
m_TextureHideFlags: 61
|
||||
m_RenderIMGUI: 1
|
||||
|
|
@ -1053,16 +1053,16 @@ MonoBehaviour:
|
|||
m_VSyncEnabled: 0
|
||||
m_Gizmos: 0
|
||||
m_Stats: 0
|
||||
m_SelectedSizes: 08000000000000000000000012000000000000000000000000000000000000000000000000000000
|
||||
m_SelectedSizes: 03000000000000000000000012000000000000000000000000000000000000000000000000000000
|
||||
m_ZoomArea:
|
||||
m_HRangeLocked: 0
|
||||
m_VRangeLocked: 0
|
||||
hZoomLockedByDefault: 0
|
||||
vZoomLockedByDefault: 0
|
||||
m_HBaseRangeMin: -1331.2001
|
||||
m_HBaseRangeMax: 1331.2001
|
||||
m_VBaseRangeMin: -540.8
|
||||
m_VBaseRangeMax: 540.8
|
||||
m_HBaseRangeMin: -768
|
||||
m_HBaseRangeMax: 768
|
||||
m_VBaseRangeMin: -432
|
||||
m_VBaseRangeMax: 432
|
||||
m_HAllowExceedBaseRangeMin: 1
|
||||
m_HAllowExceedBaseRangeMax: 1
|
||||
m_VAllowExceedBaseRangeMin: 1
|
||||
|
|
@ -1071,7 +1071,7 @@ MonoBehaviour:
|
|||
m_HSlider: 0
|
||||
m_VSlider: 0
|
||||
m_IgnoreScrollWheelUntilClicked: 0
|
||||
m_EnableMouseInput: 0
|
||||
m_EnableMouseInput: 1
|
||||
m_EnableSliderZoomHorizontal: 0
|
||||
m_EnableSliderZoomVertical: 0
|
||||
m_UniformScale: 1
|
||||
|
|
@ -1080,23 +1080,23 @@ MonoBehaviour:
|
|||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 21
|
||||
width: 889.4
|
||||
width: 853.4
|
||||
height: 680.8
|
||||
m_Scale: {x: 0.33405948, y: 0.33405948}
|
||||
m_Translation: {x: 444.7, y: 340.4}
|
||||
m_Scale: {x: 0.555599, y: 0.555599}
|
||||
m_Translation: {x: 426.7, y: 340.4}
|
||||
m_MarginLeft: 0
|
||||
m_MarginRight: 0
|
||||
m_MarginTop: 0
|
||||
m_MarginBottom: 0
|
||||
m_LastShownAreaInsideMargins:
|
||||
serializedVersion: 2
|
||||
x: -1331.2001
|
||||
y: -1018.9802
|
||||
width: 2662.4001
|
||||
height: 2037.9604
|
||||
x: -768
|
||||
y: -612.6721
|
||||
width: 1536
|
||||
height: 1225.3442
|
||||
m_MinimalGUI: 1
|
||||
m_defaultScale: 0.33405948
|
||||
m_LastWindowPixelSize: {x: 1111.75, y: 877.25}
|
||||
m_defaultScale: 0.555599
|
||||
m_LastWindowPixelSize: {x: 1066.75, y: 877.25}
|
||||
m_ClearInEditMode: 1
|
||||
m_NoCameraWarning: 1
|
||||
m_LowResolutionForAspectRatios: 00000000000000000000
|
||||
|
|
|
|||
Loading…
Reference in New Issue