@@ -20,7 +20,9 @@ namespace Ichni.RhythmGame
|
||||
{
|
||||
switch (elementToSelect)
|
||||
{
|
||||
case NoteBase note when EditorManager.instance.songInformation.songTime > note.exactJudgeTime:
|
||||
case NoteBase note when elementToSelect is not Hold && EditorManager.instance.songInformation.songTime > note.exactJudgeTime:
|
||||
return;
|
||||
case Hold hold when EditorManager.instance.songInformation.songTime > hold.holdEndTime:
|
||||
return;
|
||||
case PathNode pathNode1 when !pathNode1.isShowingSphere:
|
||||
return;
|
||||
|
||||
@@ -33,13 +33,13 @@ namespace Ichni.RhythmGame
|
||||
|
||||
return EffectState.Error;
|
||||
}
|
||||
|
||||
|
||||
public override void UpdateEffect(float triggerTime)
|
||||
{
|
||||
EffectState state = CheckEffectState(triggerTime);
|
||||
float songTime = EditorManager.instance.songInformation.songTime;
|
||||
triggerTime -= generateTime;
|
||||
|
||||
|
||||
if (state == EffectState.Before && nowEffectState != EffectState.Before)
|
||||
{
|
||||
nowEffectState = EffectState.Before;
|
||||
@@ -52,31 +52,33 @@ namespace Ichni.RhythmGame
|
||||
{
|
||||
PreExecute();
|
||||
}
|
||||
|
||||
|
||||
nowEffectState = EffectState.Middle;
|
||||
effectProgressPercent = (songTime - triggerTime) / effectTime;
|
||||
Execute();
|
||||
}
|
||||
else if (state == EffectState.After && nowEffectState != EffectState.After)
|
||||
{
|
||||
if (nowEffectState != EffectState.Middle)
|
||||
PreExecute();
|
||||
nowEffectState = EffectState.After;
|
||||
effectProgressPercent = 1;
|
||||
Adjust();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
namespace Beatmap
|
||||
{
|
||||
public abstract class NoteGenerateEffect_BM : NoteEffectBase_BM
|
||||
{
|
||||
public float generateTime;
|
||||
|
||||
|
||||
public NoteGenerateEffect_BM()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public NoteGenerateEffect_BM(float effectTime, float generateTime) : base(effectTime)
|
||||
{
|
||||
this.generateTime = generateTime;
|
||||
|
||||
@@ -157,7 +157,7 @@ namespace Ichni.RhythmGame
|
||||
|
||||
public partial class Hold
|
||||
{
|
||||
protected override void Update()
|
||||
public override void Update()
|
||||
{
|
||||
if (Keyboard.current.hKey.wasPressedThisFrame)
|
||||
{
|
||||
@@ -168,44 +168,67 @@ namespace Ichni.RhythmGame
|
||||
}
|
||||
|
||||
|
||||
|
||||
float songTime = EditorManager.instance.songInformation.songTime;
|
||||
|
||||
// 边界检查
|
||||
if (holdEndTime < exactJudgeTime)
|
||||
{
|
||||
LogWindow.Log("Hold end time is earlier than exact judge time.", Color.red);
|
||||
return;
|
||||
}
|
||||
|
||||
float songTime = EditorManager.instance.songInformation.songTime;
|
||||
|
||||
// 1. 重置逻辑:当时间回退到判定时间之前
|
||||
if (isFirstJudged && songTime < exactJudgeTime)
|
||||
{
|
||||
isFirstJudged = false;
|
||||
isHolding = false;
|
||||
isFinalJudged = false;
|
||||
holdingTime = 0;
|
||||
noteAudioSubmodule.PlayHoldStartAudio();
|
||||
// 移除音频播放 - 重置时不应该播放任何音频
|
||||
}
|
||||
|
||||
// 2. 状态恢复:当时间从结束状态回退到hold区间内
|
||||
if (isFinalJudged && songTime >= exactJudgeTime && songTime <= holdEndTime)
|
||||
{
|
||||
isFirstJudged = true;
|
||||
isHolding = true;
|
||||
isFinalJudged = false;
|
||||
holdingTime = songTime - exactJudgeTime; // 修复:更新holdingTime
|
||||
}
|
||||
|
||||
// 3. 处理hold过程中的逻辑
|
||||
if (isHolding)
|
||||
{
|
||||
holdingTime = songTime - exactJudgeTime;
|
||||
if (songTime > holdEndTime)
|
||||
|
||||
// 检查hold是否结束
|
||||
if (songTime >= holdEndTime && !isFinalJudged)
|
||||
{
|
||||
isHolding = false;
|
||||
isFinalJudged = true;
|
||||
//noteAudioSubmodule?.PlayNoteJudgeAudios(EditorManager.instance.currentJudgeType);//有待商榷
|
||||
// 可以考虑在这里播放hold结束的音频
|
||||
// noteAudioSubmodule?.PlayHoldEndAudio();
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 第一次判定:进入判定区间
|
||||
if (!isFirstJudged && songTime >= exactJudgeTime)
|
||||
{
|
||||
isFirstJudged = true;
|
||||
if (!isHolding && songTime < holdEndTime)
|
||||
|
||||
// 检查是否可以开始hold
|
||||
if (songTime <= holdEndTime)
|
||||
{
|
||||
// 播放开始判定的音频
|
||||
noteAudioSubmodule?.PlayNoteJudgeAudios(EditorManager.instance.currentJudgeType);
|
||||
// 如果需要,在这里播放hold开始音频
|
||||
// noteAudioSubmodule.PlayHoldStartAudio();
|
||||
|
||||
isHolding = true;
|
||||
holdingTime = songTime - exactJudgeTime;
|
||||
}
|
||||
}
|
||||
|
||||
if (noteJudgeSubmodule != null && !EditorManager.instance.cameraManager.isSceneCameraActive)
|
||||
{
|
||||
foreach (NoteJudgeUnit unit in noteJudgeSubmodule.judgeUnitList.Where(unit => unit.isShowingJudge))
|
||||
|
||||
@@ -36,9 +36,9 @@ namespace Ichni.RhythmGame
|
||||
public override void AfterInitialize()
|
||||
{
|
||||
base.AfterInitialize();
|
||||
|
||||
|
||||
float beyondTime = 0f;
|
||||
|
||||
|
||||
foreach (EffectBase effectBase in noteVisual.effectSubmodule.effectCollection["Generate"])
|
||||
{
|
||||
if (effectBase is NoteGenerateEffect ge)
|
||||
@@ -59,7 +59,7 @@ namespace Ichni.RhythmGame
|
||||
finishEffects.AddRange(noteVisual.effectSubmodule.effectCollection["Good"]);
|
||||
finishEffects.AddRange(noteVisual.effectSubmodule.effectCollection["Bad"]);
|
||||
finishEffects.AddRange(noteVisual.effectSubmodule.effectCollection["Miss"]);
|
||||
|
||||
|
||||
foreach (EffectBase effectBase in finishEffects)
|
||||
{
|
||||
finishTime = Mathf.Max(finishTime, effectBase.effectTime);
|
||||
@@ -68,7 +68,12 @@ namespace Ichni.RhythmGame
|
||||
if (exactJudgeTime - beyondTime - 0.5f > -EditorManager.instance.songInformation.delay)
|
||||
{
|
||||
gameObject.SetActive(false);
|
||||
EditorManager.instance.noteManager.RegisterNote(this, exactJudgeTime - beyondTime - 0.5f, exactJudgeTime + finishTime + 1.5f);
|
||||
if (this is Hold hold)
|
||||
{
|
||||
EditorManager.instance.noteManager.RegisterNote(hold, hold.exactJudgeTime - beyondTime - 0.5f, hold.holdEndTime + finishTime + 1.5f);
|
||||
|
||||
}
|
||||
else EditorManager.instance.noteManager.RegisterNote(this, exactJudgeTime - beyondTime - 0.5f, exactJudgeTime + finishTime + 1.5f);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -115,8 +120,8 @@ namespace Ichni.RhythmGame
|
||||
|
||||
foreach (SampleWindow i in SampleWindow.instances.Where(i => i.gameElement)) i.OnceSpawnNote();
|
||||
}
|
||||
|
||||
protected virtual void Update()
|
||||
|
||||
public virtual void Update()
|
||||
{
|
||||
var editor = EditorManager.instance;
|
||||
var cameraManager = editor.cameraManager;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Lean.Pool;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.InputSystem;
|
||||
@@ -19,28 +18,47 @@ namespace Ichni.Editor
|
||||
[Tooltip("指定网格所在的平面:0 = XZ (y=0), 1 = XY (z=0), 2 = YZ (x=0)")]
|
||||
public int gridPlane = 0;
|
||||
|
||||
[Tooltip("网格基础缩放值,单位 1")] public float baseScale = 1f;
|
||||
[Tooltip("网格基础缩放值,单位 1")]
|
||||
public float baseScale = 1f;
|
||||
|
||||
[Tooltip("调整缩放的影响因子,建议值 1~5")] public float scaleMultiplier = 1f;
|
||||
[Tooltip("调整缩放的影响因子,建议值 1~5")]
|
||||
public float scaleMultiplier = 1f;
|
||||
|
||||
[Tooltip("距离因子,用于计算对数缩放(例如距离大于该值时切换到下一级单位)")]
|
||||
public float distanceFactor = 10f;
|
||||
|
||||
[Tooltip("位置文本更新频率(秒)")]
|
||||
public float textUpdateFrequency = 0.1f;
|
||||
|
||||
[FormerlySerializedAs("showPositionText")]
|
||||
public bool canShowPositionText;
|
||||
|
||||
public bool isShowingPositionText;
|
||||
public Transform textContainer;
|
||||
public GameObject positionTextPrefab;
|
||||
|
||||
// 内部缓存材质
|
||||
private Material gridMaterial;
|
||||
public Dictionary<GameObject, Vector3> positionTexts = new Dictionary<GameObject, Vector3>();
|
||||
|
||||
// 对象池相关
|
||||
private Queue<GameObject> textPool = new Queue<GameObject>();
|
||||
private const int POOL_SIZE = 50;
|
||||
|
||||
// 性能优化缓存
|
||||
private float lastTextUpdateTime = 0f;
|
||||
private Vector3 lastCameraPosition;
|
||||
private float lastGridScale;
|
||||
private Plane gridPlaneCache;
|
||||
private Vector2 screenCenter;
|
||||
|
||||
public float logScale;
|
||||
public float gridScale; // 1, 4, 16, 64...
|
||||
|
||||
[FormerlySerializedAs("showPositionText")] public bool canShowPositionText;
|
||||
public bool isShowingPositionText;
|
||||
public Transform textContainer;
|
||||
public GameObject positionTextPrefab;
|
||||
public Dictionary<GameObject, Vector3> positionTexts;
|
||||
|
||||
void Start()
|
||||
{
|
||||
positionTexts = new Dictionary<GameObject, Vector3>();
|
||||
|
||||
InitializeTextPool();
|
||||
|
||||
sceneCamera = EditorManager.instance.cameraManager.sceneCamera.sceneCamera;
|
||||
// 实例化材质,避免修改共享材质
|
||||
@@ -52,6 +70,12 @@ namespace Ichni.Editor
|
||||
float screenWidth = Screen.width;
|
||||
float lineWidth = lineWidthOf3840 * (screenWidth / 3840f);
|
||||
gridMaterial.SetFloat("_LineWidth", lineWidth);
|
||||
|
||||
// 预计算屏幕中心
|
||||
screenCenter = new Vector2(Screen.width / 2f, Screen.height / 2f);
|
||||
|
||||
// 预计算网格平面
|
||||
UpdateGridPlaneCache();
|
||||
}
|
||||
|
||||
void Update()
|
||||
@@ -84,84 +108,266 @@ namespace Ichni.Editor
|
||||
|
||||
if (canShowPositionText && isShowingPositionText)
|
||||
{
|
||||
GetPoints();
|
||||
// 添加更新频率控制
|
||||
bool shouldUpdate = Time.time - lastTextUpdateTime >= textUpdateFrequency ||
|
||||
Vector3.Distance(sceneCamera.transform.position, lastCameraPosition) > gridScale * 0.5f ||
|
||||
Mathf.Abs(gridScale - lastGridScale) > 0.1f;
|
||||
|
||||
foreach (KeyValuePair<GameObject, Vector3> positionText in positionTexts)
|
||||
if (shouldUpdate)
|
||||
{
|
||||
positionText.Key.transform.position = positionText.Value + new Vector3(gridScale / 6, 0, gridScale / 12);
|
||||
float scaleFactor = gridScale * 1.5f;
|
||||
positionText.Key.transform.localScale = new Vector3(scaleFactor, scaleFactor, scaleFactor);
|
||||
Vector3 direction = EditorManager.instance.cameraManager.currentCamera.transform.position - positionText.Key.transform.position;
|
||||
positionText.Key.transform.forward = -direction.normalized;
|
||||
GetPoints();
|
||||
lastTextUpdateTime = Time.time;
|
||||
lastCameraPosition = sceneCamera.transform.position;
|
||||
lastGridScale = gridScale;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 只更新文本朝向(性能较轻)
|
||||
UpdateTextOrientations();
|
||||
}
|
||||
}
|
||||
else if (isShowingPositionText && !canShowPositionText)
|
||||
{
|
||||
ClearAllTexts();
|
||||
isShowingPositionText = false;
|
||||
}
|
||||
}
|
||||
|
||||
#region 文本显示优化
|
||||
|
||||
private void InitializeTextPool()
|
||||
{
|
||||
for (int i = 0; i < POOL_SIZE; i++)
|
||||
{
|
||||
GameObject textObj = Instantiate(positionTextPrefab, textContainer);
|
||||
textObj.transform.localScale = Vector3.zero; // 重置缩放
|
||||
textPool.Enqueue(textObj);
|
||||
}
|
||||
}
|
||||
|
||||
private GameObject GetTextFromPool()
|
||||
{
|
||||
if (textPool.Count > 0)
|
||||
{
|
||||
GameObject textObj = textPool.Dequeue();
|
||||
textObj.transform.localScale = Vector3.one; // 重置缩放
|
||||
return textObj;
|
||||
}
|
||||
|
||||
// 如果池子空了,动态创建一个(应该很少发生)
|
||||
GameObject newTextObj = Instantiate(positionTextPrefab, textContainer);
|
||||
return newTextObj;
|
||||
}
|
||||
|
||||
private void ReturnTextToPool(GameObject textObj)
|
||||
{
|
||||
textObj.transform.localScale = Vector3.zero; // 重置缩放;
|
||||
textPool.Enqueue(textObj);
|
||||
}
|
||||
|
||||
private void UpdateTextOrientations()
|
||||
{
|
||||
foreach (var textObj in positionTexts.Keys)
|
||||
{
|
||||
if (textObj != null && textObj.activeInHierarchy)
|
||||
{
|
||||
Vector3 direction = sceneCamera.transform.position - textObj.transform.position;
|
||||
textObj.transform.forward = -direction.normalized;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ClearAllTexts()
|
||||
{
|
||||
foreach (var textObj in positionTexts.Keys)
|
||||
{
|
||||
if (textObj != null)
|
||||
{
|
||||
ReturnTextToPool(textObj);
|
||||
}
|
||||
}
|
||||
positionTexts.Clear();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 网格点计算优化
|
||||
|
||||
void GetPoints()
|
||||
{
|
||||
Ray sceneCameraRay = sceneCamera.ScreenPointToRay(new Vector2(Screen.width / 2f, Screen.height / 2f));
|
||||
if (Physics.Raycast(sceneCameraRay, out RaycastHit sceneCameraHit, float.MaxValue, LayerMask.GetMask("Grid")))
|
||||
// 使用平面射线检测替代 Physics.Raycast(性能更好)
|
||||
Ray sceneCameraRay = sceneCamera.ScreenPointToRay(screenCenter);
|
||||
|
||||
if (gridPlaneCache.Raycast(sceneCameraRay, out float enter))
|
||||
{
|
||||
if (sceneCameraHit.collider.gameObject == gameObject)
|
||||
Vector3 point = sceneCameraRay.GetPoint(enter);
|
||||
|
||||
// 添加距离检查,太远就不显示文本
|
||||
float distanceToCamera = Vector3.Distance(sceneCamera.transform.position, point);
|
||||
if (distanceToCamera > 50f)
|
||||
{
|
||||
Vector3 point = sceneCameraHit.point;
|
||||
ClearAllTexts();
|
||||
return;
|
||||
}
|
||||
|
||||
float radius = gridScale * 16f;
|
||||
float step = gridScale * 4f;
|
||||
float radius = gridScale * 16f;
|
||||
float step = gridScale * 4f;
|
||||
|
||||
float minX = point.x - radius;
|
||||
float maxX = point.x + radius;
|
||||
float minZ = point.z - radius;
|
||||
float maxZ = point.z + radius;
|
||||
// 计算可见区域边界
|
||||
Vector2Int minMaxX = CalculateBounds(point.x, radius, step);
|
||||
Vector2Int minMaxZ = CalculateBounds(point.z, radius, step);
|
||||
|
||||
// 对于 X 与 Z 方向,根据网格间距取整,确保从整点开始
|
||||
minX = Mathf.Floor(minX / step) * step;
|
||||
maxX = Mathf.Ceil(maxX / step) * step;
|
||||
minZ = Mathf.Floor(minZ / step) * step;
|
||||
maxZ = Mathf.Ceil(maxZ / step) * step;
|
||||
// 使用 HashSet 来跟踪需要显示的位置(避免重复计算)
|
||||
HashSet<Vector3> requiredPositions = new HashSet<Vector3>();
|
||||
|
||||
List<Vector3> newPositions = new List<Vector3>();
|
||||
|
||||
// 添加距离检测逻辑
|
||||
bool withinDistance = Vector3.Distance(sceneCamera.transform.position, point) <= 50f;
|
||||
|
||||
for (float x = minX; x <= maxX; x += step)
|
||||
for (int x = minMaxX.x; x <= minMaxX.y; x++)
|
||||
{
|
||||
for (int z = minMaxZ.x; z <= minMaxZ.y; z++)
|
||||
{
|
||||
for (float z = minZ; z <= maxZ; z += step)
|
||||
{
|
||||
Vector3 position = new Vector3(x, 0, z);
|
||||
|
||||
if (withinDistance && !positionTexts.ContainsValue(position))
|
||||
{
|
||||
GameObject posText = LeanPool.Spawn(positionTextPrefab);
|
||||
posText.transform.position = position + new Vector3(gridScale / 8, 0, gridScale / 16);
|
||||
posText.transform.forward = -transform.up;
|
||||
posText.GetComponent<TMP_Text>().text = $"({Mathf.RoundToInt(position.x)}, {Mathf.RoundToInt(position.z)})";
|
||||
posText.transform.SetParent(textContainer);
|
||||
positionTexts.Add(posText, position);
|
||||
}
|
||||
|
||||
newPositions.Add(new Vector3(x, 0, z));
|
||||
}
|
||||
Vector3 position = new Vector3(x * step, 0, z * step);
|
||||
requiredPositions.Add(position);
|
||||
}
|
||||
}
|
||||
|
||||
List<GameObject> toRemove = new List<GameObject>();
|
||||
// 清除不在新范围内的Text
|
||||
foreach (KeyValuePair<GameObject, Vector3> positionText in positionTexts)
|
||||
{
|
||||
if (!newPositions.Contains(positionText.Value))
|
||||
{
|
||||
LeanPool.Despawn(positionText.Key);
|
||||
toRemove.Add(positionText.Key);
|
||||
}
|
||||
}
|
||||
UpdateTextDisplay(requiredPositions);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (GameObject text in toRemove)
|
||||
{
|
||||
positionTexts.Remove(text);
|
||||
}
|
||||
// 辅助方法:计算边界(避免重复的数学运算)
|
||||
private Vector2Int CalculateBounds(float center, float radius, float step)
|
||||
{
|
||||
int min = Mathf.FloorToInt((center - radius) / step);
|
||||
int max = Mathf.CeilToInt((center + radius) / step);
|
||||
return new Vector2Int(min, max);
|
||||
}
|
||||
|
||||
// 更新网格平面缓存
|
||||
private void UpdateGridPlaneCache()
|
||||
{
|
||||
gridPlaneCache = gridPlane switch
|
||||
{
|
||||
0 => new Plane(Vector3.up, transform.position), // XZ
|
||||
1 => new Plane(Vector3.forward, transform.position), // XY
|
||||
2 => new Plane(Vector3.right, transform.position), // YZ
|
||||
_ => new Plane(Vector3.up, transform.position)
|
||||
};
|
||||
}
|
||||
|
||||
private void UpdateTextDisplay(HashSet<Vector3> requiredPositions)
|
||||
{
|
||||
// 第一步:移除不再需要的位置文本
|
||||
List<GameObject> toRemove = new List<GameObject>();
|
||||
foreach (var kvp in positionTexts)
|
||||
{
|
||||
if (!requiredPositions.Contains(kvp.Value))
|
||||
{
|
||||
toRemove.Add(kvp.Key);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (GameObject textObj in toRemove)
|
||||
{
|
||||
positionTexts.Remove(textObj);
|
||||
ReturnTextToPool(textObj);
|
||||
}
|
||||
|
||||
// 第二步:添加新位置文本
|
||||
foreach (Vector3 position in requiredPositions)
|
||||
{
|
||||
if (!ContainsPosition(position))
|
||||
{
|
||||
GameObject textObj = GetTextFromPool();
|
||||
SetupTextObject(textObj, position);
|
||||
positionTexts[textObj] = position;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool ContainsPosition(Vector3 position)
|
||||
{
|
||||
foreach (var pos in positionTexts.Values)
|
||||
{
|
||||
if (Vector3.Distance(pos, position) < 0.1f)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void SetupTextObject(GameObject textObj, Vector3 position)
|
||||
{
|
||||
textObj.transform.position = position + new Vector3(gridScale / 6, 0, gridScale / 12);
|
||||
|
||||
float scaleFactor = gridScale * 1.5f;
|
||||
textObj.transform.localScale = new Vector3(scaleFactor, scaleFactor, scaleFactor);
|
||||
|
||||
// 设置文本内容
|
||||
TMP_Text tmpText = textObj.GetComponent<TMP_Text>();
|
||||
if (tmpText != null)
|
||||
{
|
||||
tmpText.text = $"({Mathf.RoundToInt(position.x)}, {Mathf.RoundToInt(position.z)})";
|
||||
}
|
||||
|
||||
// 初始朝向
|
||||
Vector3 direction = sceneCamera.transform.position - textObj.transform.position;
|
||||
textObj.transform.forward = -direction.normalized;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 公共方法
|
||||
|
||||
public void ShowPositionText()
|
||||
{
|
||||
canShowPositionText = true;
|
||||
isShowingPositionText = true;
|
||||
lastTextUpdateTime = 0; // 强制下一次更新
|
||||
}
|
||||
|
||||
public void HidePositionText()
|
||||
{
|
||||
canShowPositionText = false;
|
||||
ClearAllTexts();
|
||||
}
|
||||
|
||||
public void SetGridPlane(int planeIndex)
|
||||
{
|
||||
if (planeIndex >= 0 && planeIndex <= 2)
|
||||
{
|
||||
gridPlane = planeIndex;
|
||||
gridMaterial.SetFloat("_Plane", gridPlane);
|
||||
UpdateGridPlaneCache();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
void OnDestroy()
|
||||
{
|
||||
// 清理资源
|
||||
if (gridMaterial != null)
|
||||
{
|
||||
if (Application.isEditor)
|
||||
DestroyImmediate(gridMaterial);
|
||||
else
|
||||
Destroy(gridMaterial);
|
||||
}
|
||||
|
||||
ClearAllTexts();
|
||||
|
||||
// 清理对象池
|
||||
foreach (var textObj in textPool)
|
||||
{
|
||||
if (textObj != null)
|
||||
{
|
||||
if (Application.isEditor)
|
||||
DestroyImmediate(textObj);
|
||||
else
|
||||
Destroy(textObj);
|
||||
}
|
||||
}
|
||||
textPool.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user