修复阵容选择错误,漫画优化入版

This commit is contained in:
wuwenbo 2026-02-06 11:53:39 +08:00
parent c6807f9c66
commit d51decf278
27 changed files with 418 additions and 160 deletions

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 57b04f146ddf77843924267fcd16eaa2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 111 KiB

View File

@ -49,7 +49,7 @@ TextureImporter:
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteBorder: {x: 22, y: 27, z: 23, w: 10}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
@ -113,7 +113,7 @@ TextureImporter:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
internalID: 1537655665
vertices: []
indices:
edges: []

View File

@ -49,7 +49,7 @@ TextureImporter:
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteBorder: {x: 15, y: 27, z: 14, w: 12}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
@ -113,7 +113,7 @@ TextureImporter:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
internalID: 1537655665
vertices: []
indices:
edges: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0136da95bc8dc6e4685117f7b4534cd5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

Before

Width:  |  Height:  |  Size: 222 KiB

After

Width:  |  Height:  |  Size: 222 KiB

View File

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

View File

@ -11,8 +11,7 @@ GameObject:
- component: {fileID: 5373109379469138764}
- component: {fileID: 6628894463907592692}
- component: {fileID: 8963444919063376082}
- component: {fileID: 8349575403021724993}
- component: {fileID: 730475271947272469}
- component: {fileID: 350787869583800504}
m_Layer: 5
m_Name: ComicPrefab
m_TagString: Untagged
@ -32,13 +31,15 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 207765072299737831}
- {fileID: 7335393337175211941}
- {fileID: 345591228483174105}
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_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 100, y: 100}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6628894463907592692
CanvasRenderer:
@ -60,28 +61,7 @@ CanvasGroup:
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!95 &8349575403021724993
Animator:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3182132052964016837}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 0}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &730475271947272469
--- !u!114 &350787869583800504
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@ -90,11 +70,13 @@ MonoBehaviour:
m_GameObject: {fileID: 3182132052964016837}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0ad50f81b1d25c441943c37a89ba23f6, type: 3}
m_Script: {fileID: 11500000, guid: 711cd23e8e104ae09aca6c89f6fe47d6, type: 3}
m_Name:
m_EditorClassIdentifier:
_Animator: {fileID: 8349575403021724993}
_ActionOnDisable: 0
BackgroundImage: {fileID: 7938237650619630029}
BlackImage: {fileID: 7556741696326604669}
ItemRoot: {fileID: 7335393337175211941}
Rect: {fileID: 5373109379469138764}
--- !u!1 &3709315929854167268
GameObject:
m_ObjectHideFlags: 0
@ -128,5 +110,155 @@ RectTransform:
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: 100, y: 100}
m_SizeDelta: {x: 2032, y: 1058}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &4957658669206768623
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 207765072299737831}
- component: {fileID: 3380595546347684989}
- component: {fileID: 7938237650619630029}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &207765072299737831
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4957658669206768623}
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: 5373109379469138764}
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 &3380595546347684989
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4957658669206768623}
m_CullTransparentMesh: 1
--- !u!114 &7938237650619630029
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4957658669206768623}
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: 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: a9f76a0d53e18b948871f480160f00ff, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 2
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &6308305724587199874
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 345591228483174105}
- component: {fileID: 2337139055906819908}
- component: {fileID: 7556741696326604669}
m_Layer: 5
m_Name: Black
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &345591228483174105
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6308305724587199874}
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: 5373109379469138764}
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 &2337139055906819908
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6308305724587199874}
m_CullTransparentMesh: 1
--- !u!114 &7556741696326604669
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6308305724587199874}
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, g: 0, b: 0, 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: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 2
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1

View File

@ -131,6 +131,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: ba22e7c585d24b1ca28411c6bc586c75, type: 3}
m_Name:
m_EditorClassIdentifier:
ItemRect: {fileID: 6794621625215314122}
TextMono: {fileID: 6120816179420134599}
DialogImage: {fileID: 912733227192476783}
ItemImage: {fileID: 0}
@ -282,9 +283,9 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 1
NoExport: 0
FontBan: 1
Ban: 0
NoExport: 1
FontBan: 0
ID: 1108
FontID: 2
TextCfg:

View File

@ -11,7 +11,6 @@ GameObject:
- component: {fileID: 4725712235010191364}
- component: {fileID: 4097411215510795621}
- component: {fileID: 8544824163673796939}
- component: {fileID: 3467318451902954361}
- component: {fileID: 3755449130442514423}
m_Layer: 5
m_Name: ImagePrefab
@ -77,20 +76,6 @@ MonoBehaviour:
m_FillOrigin: 2
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &3467318451902954361
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3341112840418233464}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 86710e43de46f6f4bac7c8e50813a599, type: 3}
m_Name:
m_EditorClassIdentifier:
m_AspectMode: 1
m_AspectRatio: 1.45
--- !u!114 &3755449130442514423
MonoBehaviour:
m_ObjectHideFlags: 0
@ -103,6 +88,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: ba22e7c585d24b1ca28411c6bc586c75, type: 3}
m_Name:
m_EditorClassIdentifier:
ItemRect: {fileID: 4725712235010191364}
TextMono: {fileID: 0}
DialogImage: {fileID: 0}
ItemImage: {fileID: 8544824163673796939}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 72fa1e2c3d6ffc847915a062aaa00247
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 630433afd1476d541a28790966c75e67
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 98a8f247c867d4f42bc8a50205ebfb39
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 9e231b55dfcffdb4ea89743a8612ebcd
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -37,6 +37,7 @@ namespace TH1_Logic.Comic
public int TargetId;
public ComicActionType ActionType;
public float Duration;
public string Desc;
[MemoryPackIgnore]
public int Index;
@ -399,21 +400,21 @@ namespace TH1_Logic.Comic
{
_pos.x = 0;
_pos.y = -data.Mono.Rect.rect.height;
item.Mono.ItemRect.anchoredPosition = _pos;
data.Mono.Rect.anchoredPosition = _pos;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = 0;
_pos.y = 0;
item.Mono.ItemRect.anchoredPosition = _pos;
data.Mono.Rect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = 0;
_pos.y = -data.Mono.Rect.rect.height * (1 - ratio);
item.Mono.ItemRect.anchoredPosition = _pos;
data.Mono.Rect.anchoredPosition = _pos;
}
}
@ -428,21 +429,21 @@ namespace TH1_Logic.Comic
{
_pos.x = 0;
_pos.y = 0;
item.Mono.ItemRect.anchoredPosition = _pos;
data.Mono.Rect.anchoredPosition = _pos;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = 0;
_pos.y = data.Mono.Rect.rect.height;
item.Mono.ItemRect.anchoredPosition = _pos;
data.Mono.Rect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = 0;
_pos.y = data.Mono.Rect.rect.height * ratio;
item.Mono.ItemRect.anchoredPosition = _pos;
data.Mono.Rect.anchoredPosition = _pos;
}
}
}

View File

@ -6,6 +6,7 @@
*/
using System.Collections.Generic;
using Logic.CrashSight;
using UnityEngine;
@ -34,6 +35,7 @@ namespace TH1_Logic.Comic
private int _actionIndex = 0;
private int _comicMaxIndex = 0;
private ComicState _state = ComicState.None;
private Dictionary<int, int> _actionHandle = new Dictionary<int, int>();
public GameObject ComicRoot => _comicRoot;
public ComicSheet ComicSheet => _comicSheet;
@ -131,7 +133,9 @@ namespace TH1_Logic.Comic
_comicMaxIndex = index;
_actionIndex = 0;
_progress = 0;
_state = ComicState.Prepared;
Update(0f);
}
public void PreviewComicData(ComicData data, GameObject comicRoot)
@ -222,28 +226,47 @@ namespace TH1_Logic.Comic
public void Update(float deltaTime = 0.016f)
{
if (_state != ComicState.Playing) return;
if (deltaTime != 0 && _state != ComicState.Playing) return;
_actionHandle.Clear();
_progress += deltaTime * _speed;
_duration = 0;
foreach (var data in _comicSheet.ComicDatas)
{
foreach (var action in data.Actions)
{
var logic = ComicActionLogicFactory.GetActionLogic(action.ActionType);
var item = data.GetSubItemById(action.TargetId);
if (action.Index < _actionIndex)logic.SetEndState(data, item, action);
var maxDuration = 0f;
if (action.Index == _actionIndex)
{
var ratio = Mathf.Min(1, _progress / _duration);
logic.SetUpdateAction(data, item, action, ratio);
if(action.Duration > maxDuration) maxDuration = action.Duration;
}
_duration = maxDuration;
if (_progress >= _duration) _state = ComicState.Pausing;
foreach (var action in data.Actions) UpdateAction(data, action);
}
foreach (var data in _comicSheet.ComicDatas)
{
UpdateAction(data, data.FadeInAction);
}
for (int i = _comicSheet.ComicDatas.Count - 1; i >= 0; i--)
{
UpdateAction(_comicSheet.ComicDatas[i], _comicSheet.ComicDatas[i].FadeOutAction);
}
if (_progress >= _duration) _state = ComicState.Pausing;
}
if (action.Index > _actionIndex)logic.SetStartState(data, item, action);
}
private void UpdateAction(ComicData data, ComicAction action)
{
var logic = ComicActionLogicFactory.GetActionLogic(action.ActionType);
var item = data.GetSubItemById(action.TargetId);
if (action.Index == _actionIndex)
{
var ratio = Mathf.Min(1, _progress / action.Duration);
logic.SetUpdateAction(data, item, action, ratio);
if (action.TargetId >= 0) _actionHandle[action.TargetId] = action.Index;
if (action.Duration > _duration) _duration = action.Duration;
}
if (_actionHandle.TryGetValue(action.TargetId, out var value)) return;
if (action.Index < _actionIndex)
{
logic.SetEndState(data, item, action);
}
if (action.Index > _actionIndex)
{
logic.SetStartState(data, item, action);
}
}
@ -265,13 +288,13 @@ namespace TH1_Logic.Comic
public void ClearComicData(ComicData data)
{
if(data.Mono) Object.DestroyImmediate(data.Mono.gameObject);
foreach (var kv in data.ComicItems)
foreach (var item in data.SubItems)
{
if (kv.Value) Object.DestroyImmediate(kv.Value.gameObject);
if (item.Mono) Object.DestroyImmediate(item.Mono.gameObject);
item.Mono = null;
}
data.Mono = null;
data.ComicItems.Clear();
}
}
}

View File

@ -86,8 +86,6 @@ namespace TH1_Logic.Comic
public List<ComicAction> Actions;
[MemoryPackIgnore]
public ComicMono Mono;
[MemoryPackIgnore]
public Dictionary<uint, ComicItemMono> ComicItems = new Dictionary<uint, ComicItemMono>();
[MemoryPackIgnore] public ComicAction FadeInAction;
[MemoryPackIgnore] public ComicAction FadeOutAction;
@ -213,6 +211,7 @@ namespace TH1_Logic.Comic
public float Height;
public string ImageName;
public string Content;
public string Desc;
[MemoryPackIgnore]
public ComicItemMono Mono;
@ -252,7 +251,11 @@ namespace TH1_Logic.Comic
{
var dialogImage = ComicManager.Instance.GetImage(ImageName);
if (dialogImage) Mono.DialogImage.sprite = dialogImage;
#if UNITY_EDITOR
Mono.TextMono.text = MultilingualManager.Instance.GetMultilingualText(uint.Parse(Content), MultilingualType.ZH);
#else
MultilingualManager.Instance.SetUIText(Mono.TextMono, Content);
#endif
var pos = new UnityEngine.Vector2(PositionX, PositionY);
Mono.ItemRect.anchoredPosition = pos;
}

View File

@ -154,7 +154,7 @@ namespace TH1_Logic.Comic
string folderPath = Path.Combine(Application.dataPath, "Resources", "Comic");
if (!Directory.Exists(folderPath)) Directory.CreateDirectory(folderPath);
string filePath = Path.Combine(folderPath, $"IamgeMap.bytes");
string filePath = Path.Combine(folderPath, $"ImageMap.bytes");
byte[] bytes = MemoryPackSerializer.Serialize(_imageMap);
File.WriteAllBytes(filePath, bytes);

View File

@ -314,7 +314,7 @@ namespace TH1_Logic.Core
AudioManager.Instance.StopMusic();
AudioManager.Instance.InGameAudioInit(this,MapData);
MapData = new MapData(MapConfig, NetMode.Single);
MapData = new MapData(MapConfig, NetMode.Multi);
MapData.Net.Mode = NetMode.Multi;
MapData.Net.RefreshPlayerNet(MapData);

View File

@ -35,12 +35,16 @@ namespace Logic.Editor
private List<string> _comicList;
private string _selectedName;
private List<string> _itemIdList;
private List<string> _itemDescList;
private bool _isPlaying = false;
private GameObject _root;
private ComicSubItem _selectedComic;
private string _newName = "comic";
private Dictionary<ComicData, bool> _dataFoldouts = new Dictionary<ComicData, bool>();
private Dictionary<ComicSubItem, bool> _itemFoldouts = new Dictionary<ComicSubItem, bool>();
private Dictionary<ComicAction, bool> _actionFoldouts = new Dictionary<ComicAction, bool>();
[MenuItem("Tools/漫画编辑器")]
@ -83,12 +87,17 @@ namespace Logic.Editor
{
Refresh();
ComicManager.Instance.Refresh();
if(_isPlaying) ComicManager.Instance.ComicControl.Update();
if (_isPlaying)
{
ComicManager.Instance.ComicControl.Update();
EditorUtility.SetDirty(_root.gameObject);
SceneView.RepaintAll();
}
if (_redBoxStyle == null)
{
_redBoxStyle = InspectorUtils.GetHelpBoxStyle();
InspectorUtils.AddBorder(_redBoxStyle, new Color(0.5f, 0.4f, 0.4f, 0.6f));
InspectorUtils.AddBorder(_redBoxStyle, new Color(0.7f, 0.2f, 0.2f, 0.6f));
}
if (_whiteBoxStyle == null)
{
@ -120,7 +129,7 @@ namespace Logic.Editor
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.BeginHorizontal(_redBoxStyle);
if (_isPlaying)
{
var actionIndex = ComicManager.Instance.ComicControl.ActionIndex;
@ -140,67 +149,62 @@ namespace Logic.Editor
var index = GetIndexInComicList(_selectedName);
index = EditorGUILayout.Popup(index, _comicList.ToArray(), GUILayout.Width(300));
if (_comicList.Count != 0) _selectedName = _comicList[index];
var comicSheet = ComicManager.Instance.Asset.GetComicSheetByName(_selectedName);
if (comicSheet != null && InspectorUtils.InspectorButtonWithTextWidth($"删除此漫画 {comicSheet.Name}"))
ComicManager.Instance.Asset.ComicSheets.Remove(comicSheet);
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
var comicSheet = ComicManager.Instance.Asset.GetComicSheetByName(_selectedName);
if (comicSheet != null)
{
EditorGUILayout.BeginHorizontal();
if (InspectorUtils.InspectorButtonWithTextWidth($"删除漫画 {comicSheet.Name}"))
ComicManager.Instance.Asset.ComicSheets.Remove(comicSheet);
if (InspectorUtils.InspectorButtonWithTextWidth($"添加一页"))
comicSheet.AddComicData();
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (_isPlaying) InspectorUtils.InspectorTextWidthRich($"播放中, 请勿操作 GameObject");
else InspectorUtils.InspectorTextWidthRich($"编辑中, 可以操作 GameObject");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (InspectorUtils.InspectorButtonWithTextWidth($"播放"))
{
// 从后往前删除,避免索引变化
for (int i = _root.transform.childCount - 1; i >= 0; i--)
{
DestroyImmediate(_root.transform.GetChild(i).gameObject);
}
ComicManager.Instance.InitComic(comicSheet.Name, _root);
_isPlaying = true;
}
if (_isPlaying && InspectorUtils.InspectorButtonWithTextWidth($"模拟点击"))
{
ComicManager.Instance.Next();
}
if (_isPlaying && InspectorUtils.InspectorButtonWithTextWidth($"停止播放"))
{
_isPlaying = false;
ComicManager.Instance.ComicControl.Clear();
}
EditorGUILayout.EndHorizontal();
if (!_isPlaying)
{
int deleteIndex = -1;
int upIndex = -1;
int downIndex = -1;
for (int i = 0; i < comicSheet.ComicDatas.Count; i++)
{
OnGUIComicData(comicSheet.ComicDatas[i], i, out bool delete, out bool up, out bool down);
if (up) upIndex = i;
if (down) downIndex = i;
if (delete) deleteIndex = i;
EditorGUILayout.Space();
}
if (deleteIndex >= 0) comicSheet.ComicDatas.RemoveAt(deleteIndex);
else if (upIndex >= 0) comicSheet.MoveComicData(comicSheet.ComicDatas[upIndex], -1);
else if (downIndex >= 0) comicSheet.MoveComicData(comicSheet.ComicDatas[downIndex], 1);
}
}
OnGUIComicSheet(comicSheet);
EditorGUILayout.EndScrollView();
}
private void OnGUIComicSheet(ComicSheet comicSheet)
{
if (comicSheet == null) return;
EditorGUILayout.BeginHorizontal();
if (InspectorUtils.InspectorButtonWithTextWidth($"添加一页")) comicSheet.AddComicData();
if (InspectorUtils.InspectorButtonWithTextWidth($"播放"))
{
// 从后往前删除,避免索引变化
for (int i = _root.transform.childCount - 1; i >= 0; i--)
{
DestroyImmediate(_root.transform.GetChild(i).gameObject);
}
ComicManager.Instance.InitComic(comicSheet.Name, _root);
_isPlaying = true;
}
if (_isPlaying && InspectorUtils.InspectorButtonWithTextWidth($"模拟点击"))
{
ComicManager.Instance.Next();
}
if (_isPlaying && InspectorUtils.InspectorButtonWithTextWidth($"停止播放"))
{
_isPlaying = false;
ComicManager.Instance.ComicControl.Clear();
}
EditorGUILayout.EndHorizontal();
if (!_isPlaying)
{
int deleteIndex = -1;
int upIndex = -1;
int downIndex = -1;
for (int i = 0; i < comicSheet.ComicDatas.Count; i++)
{
OnGUIComicData(comicSheet.ComicDatas[i], i, out bool delete, out bool up, out bool down);
if (up) upIndex = i;
if (down) downIndex = i;
if (delete) deleteIndex = i;
EditorGUILayout.Space();
}
if (deleteIndex >= 0) comicSheet.ComicDatas.RemoveAt(deleteIndex);
else if (upIndex >= 0) comicSheet.MoveComicData(comicSheet.ComicDatas[upIndex], -1);
else if (downIndex >= 0) comicSheet.MoveComicData(comicSheet.ComicDatas[downIndex], 1);
}
}
private void OnGUIComicData(ComicData data, int id, out bool isDelete, out bool up, out bool down)
{
up = false;
@ -209,12 +213,19 @@ namespace Logic.Editor
EditorGUILayout.BeginVertical(_whiteBoxStyle, GUILayout.Width(500));
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"第 {id + 1} 页");
_dataFoldouts.TryAdd(data, false);
_dataFoldouts[data] = EditorGUILayout.Foldout(_dataFoldouts[data], $"第 {id + 1} 页");
if (InspectorUtils.InspectorButtonWithTextWidth($"↑")) up = true;
if (InspectorUtils.InspectorButtonWithTextWidth($"↓")) down = true;
if (InspectorUtils.InspectorButtonWithTextWidth($"x")) isDelete = true;
EditorGUILayout.EndHorizontal();
if (!_dataFoldouts[data])
{
EditorGUILayout.EndVertical();
return;
}
EditorGUILayout.BeginHorizontal();
if (InspectorUtils.InspectorButtonWithTextWidth($"预览并编辑此页"))
{
@ -242,7 +253,6 @@ namespace Logic.Editor
// Items
EditorGUILayout.BeginVertical(_whiteBoxStyle);
var deleteIndex = -1;
for (int i = 0; i < data.SubItems.Count; i++)
{
@ -251,8 +261,6 @@ namespace Logic.Editor
EditorGUILayout.Space();
}
if (deleteIndex >= 0) data.RemoveSubItem(data.SubItems[deleteIndex]);
EditorGUILayout.EndVertical();
EditorGUILayout.Space();
@ -260,19 +268,22 @@ namespace Logic.Editor
EditorGUILayout.BeginHorizontal();
if (InspectorUtils.InspectorButtonWithTextWidth($"添加Action")) data.AddAction();
EditorGUILayout.EndHorizontal();
_itemIdList ??= new List<string>();
_itemIdList.Clear();
foreach (var item in data.SubItems) _itemIdList.Add($"{item.Id}");
EditorGUILayout.BeginVertical(_whiteBoxStyle);
_itemDescList ??= new List<string>();
_itemDescList.Clear();
foreach (var item in data.SubItems)
{
var str = string.IsNullOrEmpty(item.Desc) ? $"Item ID : {item.Id}" : item.Desc;
_itemDescList.Add(str);
}
deleteIndex = -1;
for (int i = 0; i < data.Actions.Count; i++)
{
OnGUIComicAction(data.Actions[i], i, out bool delete);
OnGUIComicAction(data, data.Actions[i], i, out bool delete);
if (delete) deleteIndex = i;
EditorGUILayout.Space();
}
if (deleteIndex >= 0) data.RemoveAction(data.Actions[deleteIndex]);
EditorGUILayout.EndVertical();
EditorGUILayout.EndVertical();
EditorGUILayout.Space();
@ -280,11 +291,34 @@ namespace Logic.Editor
private void OnGUIComicItem(ComicSubItem item, out bool isDelete)
{
if (_selectedComic == item) EditorGUILayout.BeginVertical(_redBoxStyle);
else EditorGUILayout.BeginVertical(_whiteBoxStyle);
isDelete = false;
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"Item ID : {item.Id}");
_itemFoldouts.TryAdd(item, false);
var str = string.IsNullOrEmpty(item.Desc) ? $"Item ID : {item.Id}" : item.Desc;
_itemFoldouts[item] = EditorGUILayout.Foldout(_itemFoldouts[item], str);
if (item.Mono && InspectorUtils.InspectorButtonWithTextWidth($"选中"))
{
_selectedComic = item;
Selection.activeGameObject = item.Mono.gameObject;
EditorGUIUtility.PingObject(item.Mono.gameObject); // 在 Hierarchy 中闪烁高亮
SceneView.FrameLastActiveSceneView(); // Scene 视图聚焦
}
if (InspectorUtils.InspectorButtonWithTextWidth($"x")) isDelete = true;
EditorGUILayout.EndHorizontal();
if (!_itemFoldouts[item])
{
EditorGUILayout.EndVertical();
return;
}
EditorGUILayout.BeginHorizontal();
item.Desc = EditorGUILayout.TextField($"描述", item.Desc, GUILayout.Width(300));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich("类型:");
@ -315,21 +349,46 @@ namespace Logic.Editor
item.Content = EditorGUILayout.TextField(item.Content, GUILayout.Width(300));
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.EndVertical();
}
private void OnGUIComicAction(ComicAction action, int id, out bool isDelete)
private void OnGUIComicAction(ComicData data, ComicAction action, int id, out bool isDelete)
{
var item = data.GetSubItemById(action.TargetId);
if (item != null && _selectedComic == item) EditorGUILayout.BeginVertical(_redBoxStyle);
else EditorGUILayout.BeginVertical(_whiteBoxStyle);
isDelete = false;
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"Action ID : {id + 1}");
_actionFoldouts.TryAdd(action, false);
var str = string.IsNullOrEmpty(action.Desc) ? $"Action ID {id + 1}" : action.Desc;
_actionFoldouts[action] = EditorGUILayout.Foldout(_actionFoldouts[action], str);
if (item != null && item.Mono && InspectorUtils.InspectorButtonWithTextWidth($"选中"))
{
_selectedComic = item;
Selection.activeGameObject = item.Mono.gameObject;
EditorGUIUtility.PingObject(item.Mono.gameObject); // 在 Hierarchy 中闪烁高亮
SceneView.FrameLastActiveSceneView(); // Scene 视图聚焦
}
if (InspectorUtils.InspectorButtonWithTextWidth($"x")) isDelete = true;
EditorGUILayout.EndHorizontal();
if (!_actionFoldouts[action])
{
EditorGUILayout.EndVertical();
return;
}
EditorGUILayout.BeginHorizontal();
action.Desc = EditorGUILayout.TextField($"描述", action.Desc, GUILayout.Width(300));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"目标 Item");
var index = GetIndexInStrList(action.TargetId.ToString(), _itemIdList);
index = EditorGUILayout.Popup(index, _itemIdList.ToArray(), GUILayout.Width(300));
if (_itemIdList.Count != 0) action.TargetId = int.Parse(_itemIdList[index]);
var itemDesc = string.IsNullOrEmpty(item?.Desc) ? $"Item ID : {item?.Id}" : item.Desc;
var index = GetIndexInStrList(itemDesc, _itemDescList);
index = EditorGUILayout.Popup(index, _itemDescList.ToArray(), GUILayout.Width(300));
if (index < data.SubItems.Count) action.TargetId = data.SubItems[index].Id;
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
@ -341,6 +400,8 @@ namespace Logic.Editor
InspectorUtils.InspectorTextWidthRich($"时长:");
action.Duration = EditorGUILayout.FloatField(action.Duration, GUILayout.Width(200));
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
private int GetIndexInStrList(string str, List<string> list)

View File

@ -41,6 +41,12 @@ namespace Logic.Multilingual
return _multilingualData.GetMultilingualStr(id, _currentType);
}
public string GetMultilingualText(uint id, MultilingualType type)
{
RefreshMultilingualData();
return _multilingualData.GetMultilingualStr(id, type);
}
public string GetMultilingualTextSafe(string idString)
{
if (string.IsNullOrEmpty(idString))