gameplay refine

1. 优化 ResolutionAdapter 的分辨率适配问题
2. 调整 SpriteCache 的资源路径拼接
3. 引入 StoryDirector 做各玩法的胶水
4. 导入和改名资源便于代码查询路径
This commit is contained in:
SepComet 2026-04-20 15:26:36 +08:00
parent cc5d8edec4
commit 0f928f6167
56 changed files with 1218 additions and 621 deletions

2
.gitignore vendored
View File

@ -98,4 +98,4 @@ crashlytics-build.properties
/Android /Android
/bin /bin
/.omc /.omc
/.omx

View File

@ -3,12 +3,9 @@
# int string DialogUIMode int # int string DialogUIMode int
# 对话编号 策划备注 对话标识 对话形式 章节编号 # 对话编号 策划备注 对话标识 对话形式 章节编号
1001 第一章介绍 Ch1_Time01 Mask 1.001 1001 第一章介绍 Ch1_Time01 Mask 1.001
1002 第一章主流程 Ch1_Dialog_LiJie01 BottomBox 1.002 1002 第一章主流程 Ch1_LiJie BottomBox 1.002
1003 第一章玩法开始前闲聊 Ch1_Dialog_Foreman01 BottomBox 1.003 1003 Ch1_Narrator01 BottomBox 1.003
1004 Ch1_Dialog_LiJie02 BottomBox 1.004 1004 Ch1_Dialog_LiJie03 BottomBox 1.004
1005 Ch1_Dialog_Foreman02 BottomBox 1.005
1006 Ch1_Narrator01 BottomBox 1.006
1007 Ch1_Dialog_LiJie03 BottomBox 1.007
1008 Ch1_Dialog_Player01 BottomBox 1.008 1008 Ch1_Dialog_Player01 BottomBox 1.008
1009 Ch1_Dialog_LiJie04 BottomBox 1.009 1009 Ch1_Dialog_LiJie04 BottomBox 1.009
1010 Ch1_Dialog_LiJie05 BottomBox 1.01 1010 Ch1_Dialog_LiJie05 BottomBox 1.01

View File

@ -4,51 +4,51 @@
# 对话行编号 策划备注 说话人Id 表情 显示人名 说话朝向 说话内容 演出效果 章节Id 对话Id # 对话行编号 策划备注 说话人Id 表情 显示人名 说话朝向 说话内容 演出效果 章节Id 对话Id
100100001 Id规则为 Time None 时间 0 元祐七年,北宋汴京。 None 1.00100001 1001.00001 100100001 Id规则为 Time None 时间 0 元祐七年,北宋汴京。 None 1.00100001 1001.00001
100200001 第1位数为章节Id LiJie None 李诫 0 工头呢,工头呢,这是发生的什么事! None 1.00200001 1002.00001 100200001 第1位数为章节Id LiJie None 李诫 0 工头呢,工头呢,这是发生的什么事! None 1.00200001 1002.00001
100300001 第2-4位数为对话Id GongTou None 工头 0 李官人啊,这...,我也不知...,啊! None 1.00300001 1003.00001 100200002 第2-4位数为对话Id GongTou None 工头 1 李官人啊,这...,我也不知...,啊! None 1.00200002 1002.00002
100300002 第5-9位数为对话行Id GongTou None 工头 0 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00300002 1003.00002 100200003 第5-9位数为对话行Id GongTou None 工头 1 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00200003 1002.00003
100400001 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00400001 1004.00001 100200004 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00200004 1002.00004
100400002 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00400002 1004.00002 100200005 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00200005 1002.00005
100500001 GongTou None 工头 0 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00500001 1005.00001 100200006 GongTou None 工头 1 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00200006 1002.00006
100500002 GongTou None 工头 0 我一定将这小人找出来...。 None 1.00500002 1005.00002 100200007 GongTou None 工头 1 我一定将这小人找出来...。 None 1.00200007 1002.00007
100600001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00600001 1006.00001 100300001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00300001 1003.00001
100700001 LiJie None 李诫 0 你便是新任的画图令史? None 1.00700001 1007.00001 100300002 LiJie None 李诫 1 你便是新任的画图令史? None 1.00300002 1003.00002
100700002 LiJie None 李诫 0 来得正好。 None 1.00700002 1007.00002 100300003 LiJie None 李诫 1 来得正好。 None 1.00300003 1003.00003
100800001 Player None 玩家 0 属下正是,见过李主簿。 None 1.00800001 1008.00001 100300004 Player None 玩家 0 属下正是,见过李主簿。 None 1.00300004 1003.00004
100900001 LiJie None 李诫 0 方才工地塌架,你也有所耳闻。 None 1.00900001 1009.00001 100300005 LiJie None 李诫 1 方才工地塌架,你也有所耳闻。 None 1.00300005 1003.00005
100900002 LiJie None 李诫 0 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00900002 1009.00002 100300006 LiJie None 李诫 1 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00300006 1003.00006
100900003 LiJie None 李诫 0 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00900003 1009.00003 100300007 LiJie None 李诫 1 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00300007 1003.00007
101000001 LiJie None 李诫 0 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.01000001 1010.00001 100300008 LiJie None 李诫 1 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.00300008 1003.00008
101000002 LiJie None 李诫 0 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.01000002 1010.00002 100300009 LiJie None 李诫 1 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.00300009 1003.00009
101100001 LiJie None 李诫 0 无规矩,则屋不立;无准绳,则工不正。 None 1.01100001 1011.00001 100300010 LiJie None 李诫 1 无规矩,则屋不立;无准绳,则工不正。 None 1.0030001 1003.0001
101100002 LiJie None 李诫 0 你也要牢记。 None 1.01100002 1011.00002 100300011 LiJie None 李诫 1 你也要牢记。 None 1.00300011 1003.00011
101200001 Player None 玩家 0 是,李主簿。 None 1.01200001 1012.00001 100300012 Player None 玩家 0 是,李主簿。 None 1.00300012 1003.00012
101300001 LiJie None 李诫 0 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.01300001 1013.00001 100300013 LiJie None 李诫 1 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.00300013 1003.00013
101400001 LiJie None 李诫 0 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.01400001 1014.00001 100300014 LiJie None 李诫 1 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.00300014 1003.00014
101500001 LiJie None 李诫 0 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.01500001 1015.00001 100300015 LiJie None 李诫 1 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.00300015 1003.00015
101600001 Player None 玩家 0 属下遵命。 None 1.01600001 1016.00001 100300016 Player None 玩家 0 属下遵命。 None 1.00300016 1003.00016
101700001 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.01700001 1017.00001 100300017 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.00300017 1003.00017
101800001 LiJie None 李诫 0 这里是库房,存放着营造时用到的所有工具。 None 1.01800001 1018.00001 100400001 LiJie None 李诫 1 这里是库房,存放着营造时用到的所有工具。 None 1.00400001 1004.00001
101900001 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.01900001 1019.00001 100400002 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.00400002 1004.00002
102000001 LiJie None 李诫 0 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.02000001 1020.00001 100400003 LiJie None 李诫 1 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.00400003 1004.00003
102100001 LiJie None 李诫 0 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.02100001 1021.00001 100400004 LiJie None 李诫 1 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.00400004 1004.00004
102200001 LiJie None 李诫 0 此乃方斗,也叫墨斗,配绳墨使用。 None 1.02200001 1022.00001 100400005 LiJie None 李诫 1 此乃方斗,也叫墨斗,配绳墨使用。 None 1.00400005 1004.00005
102200002 LiJie None 李诫 0 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.02200002 1022.00002 100400006 LiJie None 李诫 1 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.00400006 1004.00006
102300001 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.02300001 1023.00001 100400007 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.00400007 1004.00007
102400001 LiJie None 李诫 0 营造之事,“直” 为要。 None 1.02400001 1024.00001 100400008 LiJie None 李诫 1 营造之事,“直” 为要。 None 1.00400008 1004.00008
102400002 LiJie None 李诫 0 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.02400002 1024.00002 100400009 LiJie None 李诫 1 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.00400009 1004.00009
102500001 Player None 玩家 0 那这是何物? None 1.02500001 1025.00001 100400010 Player None 玩家 0 那这是何物? None 1.0040001 1004.0001
102600001 LiJie None 李诫 0 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.02600001 1026.00001 100400011 LiJie None 李诫 1 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.00400011 1004.00011
102700001 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.02700001 1027.00001 100400012 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.00400012 1004.00012
102800001 LiJie None 李诫 0 汴京地势多洼,营建房宇先以水准定基址 None 1.02800001 1028.00001 100400013 LiJie None 李诫 1 汴京地势多洼,营建房宇先以水准定基址 None 1.00400013 1004.00013
102800002 LiJie None 李诫 0 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.02800002 1028.00002 100400014 LiJie None 李诫 1 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.00400014 1004.00014
102900001 LiJie None 李诫 0 水之性平,这水准便是借水定平。 None 1.02900001 1029.00001 100400015 LiJie None 李诫 1 水之性平,这水准便是借水定平。 None 1.00400015 1004.00015
103000001 LiJie None 李诫 0 除了这些器具,库房更藏有 “料例” 册籍, None 1.03000001 1030.00001 100400016 LiJie None 李诫 1 除了这些器具,库房更藏有 “料例” 册籍, None 1.00400016 1004.00016
103000002 LiJie None 李诫 0 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.03000002 1030.00002 100400017 LiJie None 李诫 1 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.00400017 1004.00017
103100001 LiJie None 李诫 0 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.03100001 1031.00001 100400018 LiJie None 李诫 1 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.00400018 1004.00018
103100002 LiJie None 李诫 0 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.03100002 1031.00002 100400019 LiJie None 李诫 1 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.00400019 1004.00019
103200001 LiJie None 李诫 0 今日先熟其形、知其用。 None 1.03200001 1032.00001 100400020 LiJie None 李诫 1 今日先熟其形、知其用。 None 1.0040002 1004.0002
103200002 LiJie None 李诫 0 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.03200002 1032.00002 100400021 LiJie None 李诫 1 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.00400021 1004.00021
103300001 Player None 玩家 0 是,李主簿。 None 1.03300001 1033.00001 100400022 Player None 玩家 0 是,李主簿。 None 1.00400022 1004.00022
103400001 LiJie None 李诫 0 这工地是谁负责! None 1.03400001 1034.00001 103400001 LiJie None 李诫 0 这工地是谁负责! None 1.03400001 1034.00001
103500001 GongTou None 工头 0 李主簿,您怎么又来了… None 1.03500001 1035.00001 103500001 GongTou None 工头 0 李主簿,您怎么又来了… None 1.03500001 1035.00001
103600001 LiJie None 李诫 0 我不来,怎知你们又在如何糊弄? None 1.03600001 1036.00001 103600001 LiJie None 李诫 0 我不来,怎知你们又在如何糊弄? None 1.03600001 1036.00001

View File

@ -3,6 +3,7 @@
# int string string bool bool # int string string bool bool
# 界面编号 策划备注 资源名称 界面组名称 是否允许多个界面实例 是否暂停被其覆盖的界面 # 界面编号 策划备注 资源名称 界面组名称 是否允许多个界面实例 是否暂停被其覆盖的界面
1 弹出框 DialogForm Dialog True False 1 弹出框 DialogForm Dialog True False
2 BgForm Default False False
100 主菜单 MenuForm Default False True 100 主菜单 MenuForm Default False True
101 设置 SettingForm Default False True 101 设置 SettingForm Default False True
102 关于 AboutForm Default False True 102 关于 AboutForm Default False True

View File

@ -122,354 +122,7 @@ NavMeshSettings:
debug: debug:
m_Flags: 0 m_Flags: 0
m_NavMeshData: {fileID: 0} m_NavMeshData: {fileID: 0}
--- !u!1 &203844586
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 203844589}
- component: {fileID: 203844588}
- component: {fileID: 203844587}
m_Layer: 0
m_Name: Directional Light
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &203844587
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 203844586}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Version: 3
m_UsePipelineSettings: 1
m_AdditionalLightsShadowResolutionTier: 2
m_LightLayerMask: 1
m_RenderingLayers: 1
m_CustomShadowLayers: 0
m_ShadowLayerMask: 1
m_ShadowRenderingLayers: 1
m_LightCookieSize: {x: 1, y: 1}
m_LightCookieOffset: {x: 0, y: 0}
m_SoftShadowQuality: 1
--- !u!108 &203844588
Light:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 203844586}
m_Enabled: 1
serializedVersion: 10
m_Type: 1
m_Shape: 0
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
m_Intensity: 1
m_Range: 10
m_SpotAngle: 30
m_InnerSpotAngle: 21.80208
m_CookieSize: 10
m_Shadows:
m_Type: 2
m_Resolution: -1
m_CustomResolution: -1
m_Strength: 1
m_Bias: 0.05
m_NormalBias: 0.4
m_NearPlane: 0.2
m_CullingMatrixOverride:
e00: 1
e01: 0
e02: 0
e03: 0
e10: 0
e11: 1
e12: 0
e13: 0
e20: 0
e21: 0
e22: 1
e23: 0
e30: 0
e31: 0
e32: 0
e33: 1
m_UseCullingMatrixOverride: 0
m_Cookie: {fileID: 0}
m_DrawHalo: 0
m_Flare: {fileID: 0}
m_RenderMode: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingLayerMask: 1
m_Lightmapping: 4
m_LightShadowCasterMode: 0
m_AreaSize: {x: 1, y: 1}
m_BounceIntensity: 1
m_ColorTemperature: 6570
m_UseColorTemperature: 0
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
m_UseBoundingSphereOverride: 0
m_UseViewFrustumForShadowCasterCull: 1
m_ShadowRadius: 0
m_ShadowAngle: 0
--- !u!4 &203844589
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 203844586}
serializedVersion: 2
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
m_LocalPosition: {x: 0, y: 3, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
--- !u!1 &223482651
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 223482652}
- component: {fileID: 223482654}
- component: {fileID: 223482653}
m_Layer: 5
m_Name: Bg
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &223482652
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 223482651}
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: 2070240951}
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!114 &223482653
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 223482651}
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: d339ce9c4958967469068a30e0753b30, 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!222 &223482654
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 223482651}
m_CullTransparentMesh: 1
--- !u!1 &1160234425
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1160234427}
- component: {fileID: 1160234426}
m_Layer: 0
m_Name: Global Volume
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1160234426
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1160234425}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IsGlobal: 1
priority: 0
blendDistance: 0
weight: 1
sharedProfile: {fileID: 11400000, guid: 352998f9edeef2348a887c5a2e7dc5d1, type: 2}
--- !u!4 &1160234427
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1160234425}
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!1 &2070240947
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2070240951}
- component: {fileID: 2070240950}
- component: {fileID: 2070240949}
- component: {fileID: 2070240948}
m_Layer: 5
m_Name: Canvas
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &2070240948
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2070240947}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreReversedGraphics: 1
m_BlockingObjects: 0
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
--- !u!114 &2070240949
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2070240947}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_UiScaleMode: 1
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 2048, y: 1152}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 0
--- !u!223 &2070240950
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2070240947}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 0
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 0
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 0
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: -10000
m_TargetDisplay: 0
--- !u!224 &2070240951
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2070240947}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0, y: 0, z: 0}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 223482652}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 0}
--- !u!1660057539 &9223372036854775807 --- !u!1660057539 &9223372036854775807
SceneRoots: SceneRoots:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_Roots: m_Roots: []
- {fileID: 203844589}
- {fileID: 1160234427}
- {fileID: 2070240951}

View File

@ -17,6 +17,8 @@ public partial class GameEntry : MonoBehaviour
public static CombineComponent Combine { get; private set; } public static CombineComponent Combine { get; private set; }
public static DialogComponent Dialog { get; private set; } public static DialogComponent Dialog { get; private set; }
public static AIChatComponent AIChat { get; private set; } public static AIChatComponent AIChat { get; private set; }
public static StoryDirectorComponent StoryDirector { get; private set; }
public static SpriteCacheComponent SpriteCache { get; private set; }
private static void InitCustomComponents() private static void InitCustomComponents()
{ {
@ -24,5 +26,7 @@ public partial class GameEntry : MonoBehaviour
Combine = UnityGameFramework.Runtime.GameEntry.GetComponent<CombineComponent>(); Combine = UnityGameFramework.Runtime.GameEntry.GetComponent<CombineComponent>();
Dialog = UnityGameFramework.Runtime.GameEntry.GetComponent<DialogComponent>(); Dialog = UnityGameFramework.Runtime.GameEntry.GetComponent<DialogComponent>();
AIChat = UnityGameFramework.Runtime.GameEntry.GetComponent<AIChatComponent>(); AIChat = UnityGameFramework.Runtime.GameEntry.GetComponent<AIChatComponent>();
StoryDirector = UnityGameFramework.Runtime.GameEntry.GetComponent<StoryDirectorComponent>();
SpriteCache = UnityGameFramework.Runtime.GameEntry.GetComponent<SpriteCacheComponent>();
} }
} }

View File

@ -377,6 +377,7 @@ namespace CustomComponent
GameEntry.Event.Fire(this, CombineGuideMessageEventArgs.Create(_completeHint)); GameEntry.Event.Fire(this, CombineGuideMessageEventArgs.Create(_completeHint));
} }
GameEntry.Event.Fire(this, CombineCompletedEventArgs.Create());
_onPuzzleCompleted.Invoke(); _onPuzzleCompleted.Invoke();
} }

View File

@ -338,11 +338,20 @@ namespace CustomComponent
private void EndDialogInternal() private void EndDialogInternal()
{ {
int chapterId = _formContext != null ? _formContext.ChapterId : _currentChapterId;
int dialogId = _formContext != null ? _formContext.DialogId : 0;
int lineId = _formContext != null ? _formContext.CurrentLineId : 0;
_isPlaying = false; _isPlaying = false;
_currentLineIndex = -1; _currentLineIndex = -1;
_formController.OnDialogEnded(_formContext); _formController.OnDialogEnded(_formContext);
_formController.CloseUI(); _formController.CloseUI();
if (dialogId > 0)
{
GameEntry.Event.Fire(this, DialogCompletedEventArgs.Create(chapterId, dialogId, lineId));
}
} }
private void ApplyLineToContext(DRDialogLine lineRow, int lineIndex, int totalLines) private void ApplyLineToContext(DRDialogLine lineRow, int lineIndex, int totalLines)

View File

@ -16,6 +16,7 @@ namespace GeometryTD.CustomComponent
[SerializeField] private Vector2 _referenceResolution = new Vector2(2560f, 1600f); [SerializeField] private Vector2 _referenceResolution = new Vector2(2560f, 1600f);
[SerializeField] private bool _adaptUiCanvasToViewport = true; [SerializeField] private bool _adaptUiCanvasToViewport = true;
[SerializeField] private bool _enableBlackMask = true; [SerializeField] private bool _enableBlackMask = true;
[SerializeField] private bool _autoCollectSceneCanvases = true;
[SerializeField] private List<Transform> _uiRoots = new List<Transform>(); [SerializeField] private List<Transform> _uiRoots = new List<Transform>();
private readonly List<Canvas> _canvasBuffer = new List<Canvas>(32); private readonly List<Canvas> _canvasBuffer = new List<Canvas>(32);
@ -29,6 +30,7 @@ namespace GeometryTD.CustomComponent
private bool _canvasCacheDirty = true; private bool _canvasCacheDirty = true;
private bool _uiEventSubscribed; private bool _uiEventSubscribed;
private bool _sceneEventSubscribed;
private bool _missingRootWarned; private bool _missingRootWarned;
private Canvas _maskCanvas; private Canvas _maskCanvas;
@ -163,18 +165,6 @@ namespace GeometryTD.CustomComponent
return; return;
} }
if (_uiRoots == null || _uiRoots.Count == 0)
{
if (!_missingRootWarned)
{
_missingRootWarned = true;
Log.Warning(
"ResolutionAdapterComponent missing injected roots. Assign UI/HPBar root transforms in scene.");
}
return;
}
if (_canvasCacheDirty) if (_canvasCacheDirty)
{ {
RebuildCanvasCache(); RebuildCanvasCache();
@ -200,12 +190,52 @@ namespace GeometryTD.CustomComponent
_trackedCanvases.Clear(); _trackedCanvases.Clear();
_trackedCanvasSet.Clear(); _trackedCanvasSet.Clear();
bool hasValidRoot = false;
if (_uiRoots != null)
{
foreach (var root in _uiRoots) foreach (var root in _uiRoots)
{ {
if (root == null)
{
continue;
}
hasValidRoot = true;
CollectCanvases(root); CollectCanvases(root);
} }
} }
if (_autoCollectSceneCanvases || !hasValidRoot)
{
Canvas[] canvases = Resources.FindObjectsOfTypeAll<Canvas>();
foreach (Canvas canvas in canvases)
{
if (canvas == null || canvas == _maskCanvas || canvas.renderMode == RenderMode.WorldSpace)
{
continue;
}
GameObject gameObject = canvas.gameObject;
if (!gameObject.scene.IsValid() || !gameObject.scene.isLoaded)
{
continue;
}
if (_trackedCanvasSet.Add(canvas))
{
_trackedCanvases.Add(canvas);
}
}
}
if (!hasValidRoot && !_autoCollectSceneCanvases && !_missingRootWarned)
{
_missingRootWarned = true;
Log.Warning(
"ResolutionAdapterComponent missing injected roots. Assign UI/HPBar root transforms in scene or enable auto collection.");
}
}
private void CollectCanvases(Transform root) private void CollectCanvases(Transform root)
{ {
if (root == null) if (root == null)
@ -270,34 +300,59 @@ namespace GeometryTD.CustomComponent
private void TryEnsureUiEventSubscribed() private void TryEnsureUiEventSubscribed()
{ {
if (_uiEventSubscribed || GameEntry.Event == null) if (GameEntry.Event == null)
{ {
return; return;
} }
if (!_uiEventSubscribed)
{
GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged); GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged);
GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged); GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged);
_uiEventSubscribed = true; _uiEventSubscribed = true;
_canvasCacheDirty = true; _canvasCacheDirty = true;
} }
if (!_sceneEventSubscribed)
{
GameEntry.Event.Subscribe(LoadSceneSuccessEventArgs.EventId, OnSceneChanged);
_sceneEventSubscribed = true;
_canvasCacheDirty = true;
}
}
private void UnsubscribeUiEvents() private void UnsubscribeUiEvents()
{ {
if (!_uiEventSubscribed || GameEntry.Event == null) if (GameEntry.Event == null)
{ {
return; return;
} }
if (_uiEventSubscribed)
{
GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged); GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged);
GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged); GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged);
_uiEventSubscribed = false; _uiEventSubscribed = false;
} }
if (_sceneEventSubscribed)
{
GameEntry.Event.Unsubscribe(LoadSceneSuccessEventArgs.EventId, OnSceneChanged);
_sceneEventSubscribed = false;
}
}
private void OnUIFormChanged(object sender, GameEventArgs e) private void OnUIFormChanged(object sender, GameEventArgs e)
{ {
_canvasCacheDirty = true; _canvasCacheDirty = true;
} }
private void OnSceneChanged(object sender, GameEventArgs e)
{
_canvasCacheDirty = true;
_missingRootWarned = false;
}
private void UpdateMaskLayout() private void UpdateMaskLayout()
{ {
if (!_enableBlackMask) if (!_enableBlackMask)

View File

@ -33,7 +33,7 @@ namespace CustomComponent
{ {
_resource.LoadAsset _resource.LoadAsset
( (
AssetUtility.GetUIDialogAsset(assetName), AssetUtility.GetUISpriteAsset(assetName),
Constant.AssetPriority.UIFormAsset, Constant.AssetPriority.UIFormAsset,
new LoadAssetCallbacks( new LoadAssetCallbacks(
(resourcePath, asset, duration, userData) => (resourcePath, asset, duration, userData) =>

View File

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

View File

@ -0,0 +1,22 @@
using UnityEngine;
namespace CustomComponent
{
[CreateAssetMenu(menuName = "Story/Directive/Change Background", fileName = "Directive_ChangeBackground")]
public sealed class StoryChangeBackgroundDirectiveAsset : StoryDirectiveAsset
{
[SerializeField] private string _backgroundAssetName = string.Empty;
public override string ActionName => "ChangeBackground";
public override void Execute(StoryDirectorComponent director)
{
if (director == null)
{
return;
}
director.ExecuteChangeBackground(_backgroundAssetName);
}
}
}

View File

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

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using UI;
namespace CustomComponent
{
[Serializable]
public sealed class StoryCombineConfig
{
public bool AutoStart = true;
public List<CombineSlotContext> Slots = new List<CombineSlotContext>();
public List<CombinePartContext> Parts = new List<CombinePartContext>();
}
}

View File

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

View File

@ -0,0 +1,39 @@
using UnityEngine;
namespace CustomComponent
{
public abstract class StoryDirectiveAsset : ScriptableObject
{
[SerializeField] private bool _enabled = true;
[SerializeField] private StoryTriggerType _triggerType = StoryTriggerType.DialogCompleted;
[SerializeField] [Tooltip("DialogCompleted 时为对话 Id<=0 表示该触发类型下的任意 Id。")]
private int _triggerId = 0;
public bool IsEnabled => _enabled;
public StoryTriggerType TriggerType => _triggerType;
public int TriggerId => _triggerId;
public virtual string ActionName => GetType().Name;
public bool IsMatch(StoryTriggerType triggerType, int triggerId)
{
if (!_enabled || _triggerType != triggerType)
{
return false;
}
if (triggerType == StoryTriggerType.DialogCompleted && _triggerId > 0 && _triggerId != triggerId)
{
return false;
}
return true;
}
public abstract void Execute(StoryDirectorComponent director);
}
}

View File

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

View File

@ -0,0 +1,22 @@
using UnityEngine;
namespace CustomComponent
{
[CreateAssetMenu(menuName = "Story/Directive/End Chapter", fileName = "Directive_EndChapter")]
public sealed class StoryEndChapterDirectiveAsset : StoryDirectiveAsset
{
[SerializeField] [Tooltip("<=0 则使用当前章节。")] private int _chapterId = 0;
public override string ActionName => "EndChapter";
public override void Execute(StoryDirectorComponent director)
{
if (director == null)
{
return;
}
director.ExecuteEndChapter(_chapterId);
}
}
}

View File

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

View File

@ -0,0 +1,25 @@
using UnityEngine;
namespace CustomComponent
{
[CreateAssetMenu(menuName = "Story/Directive/Start Combine", fileName = "Directive_StartCombine")]
public sealed class StoryStartCombineDirectiveAsset : StoryDirectiveAsset
{
[SerializeField] private bool _useDefaultConfig = true;
[SerializeField] private StoryCombineConfig _combineConfig = new StoryCombineConfig();
public override string ActionName => "StartCombine";
public override void Execute(StoryDirectorComponent director)
{
if (director == null)
{
return;
}
StoryCombineConfig config = _useDefaultConfig ? null : _combineConfig;
director.ExecuteStartCombine(config);
}
}
}

View File

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

View File

@ -0,0 +1,22 @@
using UnityEngine;
namespace CustomComponent
{
[CreateAssetMenu(menuName = "Story/Directive/Start Dialog", fileName = "Directive_StartDialog")]
public sealed class StoryStartDialogDirectiveAsset : StoryDirectiveAsset
{
[SerializeField] private int _dialogId = 0;
public override string ActionName => "StartDialog";
public override void Execute(StoryDirectorComponent director)
{
if (director == null)
{
return;
}
director.ExecuteStartDialog(_dialogId);
}
}
}

View File

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

View File

@ -0,0 +1,8 @@
namespace CustomComponent
{
public enum StoryTriggerType
{
DialogCompleted = 0,
CombineCompleted = 1
}
}

View File

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

View File

@ -0,0 +1,358 @@
using System.Collections.Generic;
using Definition.Enum;
using Event;
using UI;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace CustomComponent
{
[DisallowMultipleComponent]
public class StoryDirectorComponent : GameFrameworkComponent
{
[SerializeField] [Tooltip("按顺序执行。每个元素是一个 StoryDirectiveAsset 资产引用。")]
private List<StoryDirectiveAsset> _directives = new List<StoryDirectiveAsset>();
[SerializeField] private bool _allowRepeatTrigger = false;
[SerializeField] private bool _verboseLog = true;
[SerializeField] private string _backgroundAssetNamePrefix = string.Empty;
private readonly HashSet<string> _consumedDirectiveTokens = new HashSet<string>();
private BgFormController _bgFormController;
private int _bgRequestVersion;
private bool _isExecuting;
private void Start()
{
GameEntry.Event.Subscribe(DialogCompletedEventArgs.EventId, OnDialogCompleted);
GameEntry.Event.Subscribe(CombineCompletedEventArgs.EventId, OnCombineCompleted);
}
private void OnDestroy()
{
GameEntry.Event.Unsubscribe(DialogCompletedEventArgs.EventId, OnDialogCompleted);
GameEntry.Event.Unsubscribe(CombineCompletedEventArgs.EventId, OnCombineCompleted);
_bgFormController?.CloseUI();
_bgFormController = null;
}
public void ResetConsumedDirectives()
{
_consumedDirectiveTokens.Clear();
}
private void OnDialogCompleted(object sender, GameFramework.Event.GameEventArgs e)
{
if (!(e is DialogCompletedEventArgs args))
{
return;
}
ExecuteDirectives(StoryTriggerType.DialogCompleted, args.DialogId);
}
private void OnCombineCompleted(object sender, GameFramework.Event.GameEventArgs e)
{
if (!(e is CombineCompletedEventArgs))
{
return;
}
ExecuteDirectives(StoryTriggerType.CombineCompleted, 0);
}
private void ExecuteDirectives(StoryTriggerType triggerType, int triggerId)
{
if (_isExecuting)
{
return;
}
_isExecuting = true;
try
{
for (int i = 0; i < _directives.Count; i++)
{
StoryDirectiveAsset directive = _directives[i];
if (directive == null || !directive.IsMatch(triggerType, triggerId))
{
continue;
}
string directiveToken = BuildDirectiveToken(directive, i);
if (!_allowRepeatTrigger && _consumedDirectiveTokens.Contains(directiveToken))
{
continue;
}
ExecuteDirective(directive, triggerType, triggerId);
if (!_allowRepeatTrigger)
{
_consumedDirectiveTokens.Add(directiveToken);
}
}
}
finally
{
_isExecuting = false;
}
}
private static string BuildDirectiveToken(StoryDirectiveAsset directive, int directiveIndex)
{
return $"{directive.GetInstanceID()}:{directiveIndex}";
}
private void ExecuteDirective(StoryDirectiveAsset directive, StoryTriggerType triggerType, int triggerId)
{
directive.Execute(this);
if (_verboseLog)
{
Log.Info("StoryDirector executed action '{0}' by trigger '{1}' ({2}).",
directive.ActionName, triggerType.ToString(), triggerId.ToString());
}
}
public void ExecuteStartDialog(int dialogId)
{
if (dialogId <= 0)
{
Log.Warning("StoryDirector start dialog skipped. dialogId must be positive.");
return;
}
if (GameEntry.Dialog == null)
{
Log.Warning("StoryDirector start dialog failed. Dialog component is missing.");
return;
}
GameEntry.Dialog.StartDialog(dialogId);
}
public void ExecuteStartCombine(StoryCombineConfig config)
{
if (GameEntry.Combine == null)
{
Log.Warning("StoryDirector start combine failed. Combine component is missing.");
return;
}
CombineFormContext context = BuildCombineFormContext(config);
int? formSerialId = GameEntry.Combine.StartLevel(context);
if (!formSerialId.HasValue)
{
Log.Warning("StoryDirector start combine failed. Open combine UI failed.");
return;
}
}
public void ExecuteChangeBackground(string backgroundAssetName)
{
string assetName = string.IsNullOrWhiteSpace(backgroundAssetName)
? string.Empty
: backgroundAssetName.Trim();
if (string.IsNullOrEmpty(assetName))
{
Log.Warning("StoryDirector change background skipped. assetName is empty.");
return;
}
if (GameEntry.SpriteCache == null)
{
Log.Warning("StoryDirector change background failed. SpriteCache component is missing.");
return;
}
int requestVersion = ++_bgRequestVersion;
GameEntry.SpriteCache.GetSprite(_backgroundAssetNamePrefix + assetName,
sprite => { OnBackgroundLoaded(requestVersion, assetName, sprite); });
}
private void OnBackgroundLoaded(int requestVersion, string assetName, Sprite sprite)
{
if (requestVersion != _bgRequestVersion)
{
return;
}
if (sprite == null)
{
Log.Warning("StoryDirector change background failed. Loaded sprite is null for '{0}'.", assetName);
return;
}
if (_bgFormController == null)
{
_bgFormController = new BgFormController();
}
_bgFormController.OpenUI(new BgFormContext
{
Sprite = sprite
});
}
public void ExecuteEndChapter(int chapterId)
{
int finalChapterId = chapterId > 0
? chapterId
: (GameEntry.Dialog != null ? GameEntry.Dialog.CurrentChapterId : 0);
GameEntry.Event.Fire(this, StoryChapterEndedEventArgs.Create(finalChapterId));
}
private static CombineFormContext BuildCombineFormContext(StoryCombineConfig config)
{
if (config != null && config.Slots != null && config.Slots.Count > 0)
{
return new CombineFormContext
{
Slots = CloneSlots(config.Slots),
Parts = CloneParts(config.Parts),
AutoStart = config.AutoStart
};
}
return BuildDefaultCombineContext();
}
private static List<CombineSlotContext> CloneSlots(List<CombineSlotContext> source)
{
var result = new List<CombineSlotContext>();
if (source == null)
{
return result;
}
for (int i = 0; i < source.Count; i++)
{
CombineSlotContext slot = source[i];
if (slot == null)
{
continue;
}
result.Add(new CombineSlotContext
{
RequiredPartType = slot.RequiredPartType,
BuildOrder = slot.BuildOrder,
RequireStrictOrder = slot.RequireStrictOrder,
AnchoredPosition = slot.AnchoredPosition,
SizeDelta = slot.SizeDelta,
MechanicsExplanation = slot.MechanicsExplanation,
MismatchHint = slot.MismatchHint
});
}
return result;
}
private static List<CombinePartContext> CloneParts(List<CombinePartContext> source)
{
var result = new List<CombinePartContext>();
if (source == null)
{
return result;
}
for (int i = 0; i < source.Count; i++)
{
CombinePartContext part = source[i];
if (part == null)
{
continue;
}
result.Add(new CombinePartContext
{
PartType = part.PartType,
PartDisplayName = part.PartDisplayName,
MechanicsExplanation = part.MechanicsExplanation,
LockAfterPlaced = part.LockAfterPlaced
});
}
return result;
}
private static CombineFormContext BuildDefaultCombineContext()
{
List<CombineSlotContext> slots = new List<CombineSlotContext>
{
new CombineSlotContext
{
RequiredPartType = CombinePartType.Dou,
BuildOrder = 0,
RequireStrictOrder = true,
AnchoredPosition = new Vector2(-320f, -160f),
SizeDelta = new Vector2(120f, 120f),
MechanicsExplanation = "Dou transfers upper load and works as the base node."
},
new CombineSlotContext
{
RequiredPartType = CombinePartType.Sheng,
BuildOrder = 1,
RequireStrictOrder = true,
AnchoredPosition = new Vector2(-320f, -20f),
SizeDelta = new Vector2(120f, 120f),
MechanicsExplanation = "Sheng raises layer height to form the bracket hierarchy."
},
new CombineSlotContext
{
RequiredPartType = CombinePartType.Gong,
BuildOrder = 2,
RequireStrictOrder = true,
AnchoredPosition = new Vector2(-320f, 120f),
SizeDelta = new Vector2(120f, 120f),
MechanicsExplanation = "Gong spreads force laterally through overhang."
},
new CombineSlotContext
{
RequiredPartType = CombinePartType.Qiao,
BuildOrder = 3,
RequireStrictOrder = true,
AnchoredPosition = new Vector2(-160f, 120f),
SizeDelta = new Vector2(120f, 120f),
MechanicsExplanation = "Qiao continues force transfer to the outer side."
},
new CombineSlotContext
{
RequiredPartType = CombinePartType.Ang,
BuildOrder = 4,
RequireStrictOrder = true,
AnchoredPosition = new Vector2(0f, 120f),
SizeDelta = new Vector2(120f, 120f),
MechanicsExplanation = "Ang uses leverage to redirect eave load inward."
}
};
List<CombinePartContext> parts = new List<CombinePartContext>
{
new CombinePartContext
{ PartType = CombinePartType.Dou, PartDisplayName = "Dou", LockAfterPlaced = true },
new CombinePartContext
{ PartType = CombinePartType.Sheng, PartDisplayName = "Sheng", LockAfterPlaced = true },
new CombinePartContext
{ PartType = CombinePartType.Gong, PartDisplayName = "Gong", LockAfterPlaced = true },
new CombinePartContext
{ PartType = CombinePartType.Qiao, PartDisplayName = "Qiao", LockAfterPlaced = true },
new CombinePartContext
{ PartType = CombinePartType.Ang, PartDisplayName = "Ang", LockAfterPlaced = true }
};
return new CombineFormContext
{
Slots = slots,
Parts = parts,
AutoStart = true
};
}
}
}

View File

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

View File

@ -0,0 +1,42 @@
using GameFramework;
using GameFramework.Event;
namespace Event
{
public class DialogCompletedEventArgs : GameEventArgs
{
public static readonly int EventId = typeof(DialogCompletedEventArgs).GetHashCode();
public override int Id => EventId;
public int ChapterId { get; private set; }
public int DialogId { get; private set; }
public int LastLineId { get; private set; }
public DialogCompletedEventArgs()
{
ChapterId = 0;
DialogId = 0;
LastLineId = 0;
}
public static DialogCompletedEventArgs Create(int chapterId, int dialogId, int lastLineId)
{
var args = ReferencePool.Acquire<DialogCompletedEventArgs>();
args.ChapterId = chapterId;
args.DialogId = dialogId;
args.LastLineId = lastLineId;
return args;
}
public override void Clear()
{
ChapterId = 0;
DialogId = 0;
LastLineId = 0;
}
}
}

View File

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

View File

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

View File

@ -0,0 +1,31 @@
using GameFramework;
using GameFramework.Event;
namespace Event
{
public class StoryChapterEndedEventArgs : GameEventArgs
{
public static readonly int EventId = typeof(StoryChapterEndedEventArgs).GetHashCode();
public override int Id => EventId;
public int ChapterId { get; private set; }
public StoryChapterEndedEventArgs()
{
ChapterId = 0;
}
public static StoryChapterEndedEventArgs Create(int chapterId)
{
var args = ReferencePool.Acquire<StoryChapterEndedEventArgs>();
args.ChapterId = chapterId;
return args;
}
public override void Clear()
{
ChapterId = 0;
}
}
}

View File

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

View File

@ -66,9 +66,9 @@ namespace CustomUtility
return Utility.Text.Format("Assets/GameMain/UI/UISounds/{0}.wav", assetName); return Utility.Text.Format("Assets/GameMain/UI/UISounds/{0}.wav", assetName);
} }
public static string GetUIDialogAsset(string assetName) public static string GetUISpriteAsset(string assetName)
{ {
return Utility.Text.Format("Assets/GameMain/UI/Dialogs/{0}.prefab", assetName); return Utility.Text.Format("Assets/GameMain/UI/{0}", assetName);
} }
} }
} }

View File

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

View File

@ -0,0 +1,18 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2d4b16a5d76140a1b952ad48774dd89a, type: 3}
m_Name: BG1001
m_EditorClassIdentifier:
_enabled: 1
_triggerType: 0
_triggerId: 1001
_backgroundAssetName: BG_1.jpg

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fbe72cf66cec3ad4e9fb3167b291ce4f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,18 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8e4367863f5042e1b5b0b3b3b7f62f5e, type: 3}
m_Name: Dialog1001
m_EditorClassIdentifier:
_enabled: 1
_triggerType: 0
_triggerId: 1001
_dialogId: 1002

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a6031366dd068b84b9797525616de223
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -525,8 +525,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1} m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 250, y: -40} m_AnchoredPosition: {x: 200, y: -40}
m_SizeDelta: {x: 500, y: 80} m_SizeDelta: {x: 400, y: 80}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &4514918814497795030 --- !u!1 &4514918814497795030
GameObject: GameObject:
@ -835,10 +835,10 @@ MonoBehaviour:
m_faceColor: m_faceColor:
serializedVersion: 2 serializedVersion: 2
rgba: 4294967295 rgba: 4294967295
m_fontSize: 80 m_fontSize: 72
m_fontSizeBase: 80 m_fontSizeBase: 80
m_fontWeight: 400 m_fontWeight: 400
m_enableAutoSizing: 0 m_enableAutoSizing: 1
m_fontSizeMin: 18 m_fontSizeMin: 18
m_fontSizeMax: 72 m_fontSizeMax: 72
m_fontStyle: 1 m_fontStyle: 1
@ -987,5 +987,5 @@ RectTransform:
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 280} m_AnchoredPosition: {x: 0, y: 280}
m_SizeDelta: {x: 0, y: 380} m_SizeDelta: {x: -200, y: 380}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}

View File

Before

Width:  |  Height:  |  Size: 2.1 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

View File

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.6 MiB

View File

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

View File

@ -0,0 +1,149 @@
fileFormatVersion: 2
guid: 77968dfed7b61334db617d490bb05477
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: brush_white_0
rect:
serializedVersion: 2
x: 0
y: 7
width: 600
height: 160
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: eaadb4ab1e82b3a47970d20bef28d0c0
internalID: -423439662
vertices: []
indices:
edges: []
weights: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable:
brush_white_0: -423439662
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@ -122,6 +122,52 @@ NavMeshSettings:
debug: debug:
m_Flags: 0 m_Flags: 0
m_NavMeshData: {fileID: 0} m_NavMeshData: {fileID: 0}
--- !u!1 &51490593
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 51490594}
- component: {fileID: 51490595}
m_Layer: 0
m_Name: SpriteCache
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &51490594
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 51490593}
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 &51490595
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 51490593}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 42b4751aefa33c545a86f146a48536ee, type: 3}
m_Name:
m_EditorClassIdentifier:
_pixelsPerUnit: 100
_defaultPivot: {x: 0.5, y: 0.5}
--- !u!1 &119167775 --- !u!1 &119167775
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -156,6 +202,8 @@ Transform:
- {fileID: 434859534} - {fileID: 434859534}
- {fileID: 1064285105} - {fileID: 1064285105}
- {fileID: 1402371486} - {fileID: 1402371486}
- {fileID: 2000155822}
- {fileID: 51490594}
m_Father: {fileID: 1852670053} m_Father: {fileID: 1852670053}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &120093239 --- !u!1 &120093239
@ -248,143 +296,6 @@ MonoBehaviour:
m_PointerBehavior: 0 m_PointerBehavior: 0
m_CursorLockBehavior: 0 m_CursorLockBehavior: 0
m_ScrollDeltaPerTick: 6 m_ScrollDeltaPerTick: 6
--- !u!1 &188380256
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 188380260}
- component: {fileID: 188380259}
- component: {fileID: 188380258}
- component: {fileID: 188380257}
m_Layer: 0
m_Name: Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &188380257
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 188380256}
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: -1
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 &188380258
AudioListener:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 188380256}
m_Enabled: 1
--- !u!20 &188380259
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 188380256}
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: 100
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 &188380260
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 188380256}
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!4 &192213471 stripped --- !u!4 &192213471 stripped
Transform: Transform:
m_CorrespondingSourceObject: {fileID: 430602, guid: adb3eb1c35fcff14f89fba7b05c9d71c, m_CorrespondingSourceObject: {fileID: 430602, guid: adb3eb1c35fcff14f89fba7b05c9d71c,
@ -1184,6 +1095,7 @@ MonoBehaviour:
_referenceResolution: {x: 2048, y: 1152} _referenceResolution: {x: 2048, y: 1152}
_adaptUiCanvasToViewport: 1 _adaptUiCanvasToViewport: 1
_enableBlackMask: 1 _enableBlackMask: 1
_autoCollectSceneCanvases: 1
_uiRoots: _uiRoots:
- {fileID: 934951765} - {fileID: 934951765}
--- !u!1 &1852670052 --- !u!1 &1852670052
@ -1263,10 +1175,59 @@ Transform:
m_Children: [] m_Children: []
m_Father: {fileID: 119167776} m_Father: {fileID: 119167776}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2000155821
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2000155822}
- component: {fileID: 2000155823}
m_Layer: 0
m_Name: StroyDirector
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2000155822
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2000155821}
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 &2000155823
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2000155821}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d899fa8b1598c1846bc3a03d11c83d04, type: 3}
m_Name:
m_EditorClassIdentifier:
_directives:
- {fileID: 11400000, guid: fbe72cf66cec3ad4e9fb3167b291ce4f, type: 2}
- {fileID: 11400000, guid: a6031366dd068b84b9797525616de223, type: 2}
_allowRepeatTrigger: 0
_verboseLog: 1
_backgroundAssetNamePrefix: UISprites/Background/
--- !u!1660057539 &9223372036854775807 --- !u!1660057539 &9223372036854775807
SceneRoots: SceneRoots:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_Roots: m_Roots:
- {fileID: 1852670053} - {fileID: 1852670053}
- {fileID: 120093242} - {fileID: 120093242}
- {fileID: 188380260}

View File

@ -3,12 +3,9 @@
# int string DialogUIMode int # int string DialogUIMode int
# 对话编号 策划备注 对话标识 对话形式 章节编号 # 对话编号 策划备注 对话标识 对话形式 章节编号
1001 第一章介绍 Ch1_Time01 Mask 1.001 1001 第一章介绍 Ch1_Time01 Mask 1.001
1002 第一章主流程 Ch1_Dialog_LiJie01 BottomBox 1.002 1002 第一章主流程 Ch1_LiJie BottomBox 1.002
1003 第一章玩法开始前闲聊 Ch1_Dialog_Foreman01 BottomBox 1.003 1003 Ch1_Narrator01 BottomBox 1.003
1004 Ch1_Dialog_LiJie02 BottomBox 1.004 1004 Ch1_Dialog_LiJie03 BottomBox 1.004
1005 Ch1_Dialog_Foreman02 BottomBox 1.005
1006 Ch1_Narrator01 BottomBox 1.006
1007 Ch1_Dialog_LiJie03 BottomBox 1.007
1008 Ch1_Dialog_Player01 BottomBox 1.008 1008 Ch1_Dialog_Player01 BottomBox 1.008
1009 Ch1_Dialog_LiJie04 BottomBox 1.009 1009 Ch1_Dialog_LiJie04 BottomBox 1.009
1010 Ch1_Dialog_LiJie05 BottomBox 1.01 1010 Ch1_Dialog_LiJie05 BottomBox 1.01

Binary file not shown.

View File

@ -4,51 +4,51 @@
# 对话行编号 策划备注 说话人Id 表情 显示人名 说话朝向 说话内容 演出效果 章节Id 对话Id # 对话行编号 策划备注 说话人Id 表情 显示人名 说话朝向 说话内容 演出效果 章节Id 对话Id
100100001 Id规则为 Time None 时间 0 元祐七年,北宋汴京。 None 1.00100001 1001.00001 100100001 Id规则为 Time None 时间 0 元祐七年,北宋汴京。 None 1.00100001 1001.00001
100200001 第1位数为章节Id LiJie None 李诫 0 工头呢,工头呢,这是发生的什么事! None 1.00200001 1002.00001 100200001 第1位数为章节Id LiJie None 李诫 0 工头呢,工头呢,这是发生的什么事! None 1.00200001 1002.00001
100300001 第2-4位数为对话Id GongTou None 工头 0 李官人啊,这...,我也不知...,啊! None 1.00300001 1003.00001 100200002 第2-4位数为对话Id GongTou None 工头 1 李官人啊,这...,我也不知...,啊! None 1.00200002 1002.00002
100300002 第5-9位数为对话行Id GongTou None 工头 0 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00300002 1003.00002 100200003 第5-9位数为对话行Id GongTou None 工头 1 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00200003 1002.00003
100400001 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00400001 1004.00001 100200004 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00200004 1002.00004
100400002 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00400002 1004.00002 100200005 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00200005 1002.00005
100500001 GongTou None 工头 0 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00500001 1005.00001 100200006 GongTou None 工头 1 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00200006 1002.00006
100500002 GongTou None 工头 0 我一定将这小人找出来...。 None 1.00500002 1005.00002 100200007 GongTou None 工头 1 我一定将这小人找出来...。 None 1.00200007 1002.00007
100600001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00600001 1006.00001 100300001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00300001 1003.00001
100700001 LiJie None 李诫 0 你便是新任的画图令史? None 1.00700001 1007.00001 100300002 LiJie None 李诫 1 你便是新任的画图令史? None 1.00300002 1003.00002
100700002 LiJie None 李诫 0 来得正好。 None 1.00700002 1007.00002 100300003 LiJie None 李诫 1 来得正好。 None 1.00300003 1003.00003
100800001 Player None 玩家 0 属下正是,见过李主簿。 None 1.00800001 1008.00001 100300004 Player None 玩家 0 属下正是,见过李主簿。 None 1.00300004 1003.00004
100900001 LiJie None 李诫 0 方才工地塌架,你也有所耳闻。 None 1.00900001 1009.00001 100300005 LiJie None 李诫 1 方才工地塌架,你也有所耳闻。 None 1.00300005 1003.00005
100900002 LiJie None 李诫 0 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00900002 1009.00002 100300006 LiJie None 李诫 1 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00300006 1003.00006
100900003 LiJie None 李诫 0 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00900003 1009.00003 100300007 LiJie None 李诫 1 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00300007 1003.00007
101000001 LiJie None 李诫 0 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.01000001 1010.00001 100300008 LiJie None 李诫 1 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.00300008 1003.00008
101000002 LiJie None 李诫 0 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.01000002 1010.00002 100300009 LiJie None 李诫 1 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.00300009 1003.00009
101100001 LiJie None 李诫 0 无规矩,则屋不立;无准绳,则工不正。 None 1.01100001 1011.00001 100300010 LiJie None 李诫 1 无规矩,则屋不立;无准绳,则工不正。 None 1.0030001 1003.0001
101100002 LiJie None 李诫 0 你也要牢记。 None 1.01100002 1011.00002 100300011 LiJie None 李诫 1 你也要牢记。 None 1.00300011 1003.00011
101200001 Player None 玩家 0 是,李主簿。 None 1.01200001 1012.00001 100300012 Player None 玩家 0 是,李主簿。 None 1.00300012 1003.00012
101300001 LiJie None 李诫 0 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.01300001 1013.00001 100300013 LiJie None 李诫 1 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.00300013 1003.00013
101400001 LiJie None 李诫 0 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.01400001 1014.00001 100300014 LiJie None 李诫 1 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.00300014 1003.00014
101500001 LiJie None 李诫 0 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.01500001 1015.00001 100300015 LiJie None 李诫 1 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.00300015 1003.00015
101600001 Player None 玩家 0 属下遵命。 None 1.01600001 1016.00001 100300016 Player None 玩家 0 属下遵命。 None 1.00300016 1003.00016
101700001 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.01700001 1017.00001 100300017 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.00300017 1003.00017
101800001 LiJie None 李诫 0 这里是库房,存放着营造时用到的所有工具。 None 1.01800001 1018.00001 100400001 LiJie None 李诫 1 这里是库房,存放着营造时用到的所有工具。 None 1.00400001 1004.00001
101900001 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.01900001 1019.00001 100400002 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.00400002 1004.00002
102000001 LiJie None 李诫 0 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.02000001 1020.00001 100400003 LiJie None 李诫 1 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.00400003 1004.00003
102100001 LiJie None 李诫 0 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.02100001 1021.00001 100400004 LiJie None 李诫 1 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.00400004 1004.00004
102200001 LiJie None 李诫 0 此乃方斗,也叫墨斗,配绳墨使用。 None 1.02200001 1022.00001 100400005 LiJie None 李诫 1 此乃方斗,也叫墨斗,配绳墨使用。 None 1.00400005 1004.00005
102200002 LiJie None 李诫 0 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.02200002 1022.00002 100400006 LiJie None 李诫 1 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.00400006 1004.00006
102300001 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.02300001 1023.00001 100400007 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.00400007 1004.00007
102400001 LiJie None 李诫 0 营造之事,“直” 为要。 None 1.02400001 1024.00001 100400008 LiJie None 李诫 1 营造之事,“直” 为要。 None 1.00400008 1004.00008
102400002 LiJie None 李诫 0 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.02400002 1024.00002 100400009 LiJie None 李诫 1 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.00400009 1004.00009
102500001 Player None 玩家 0 那这是何物? None 1.02500001 1025.00001 100400010 Player None 玩家 0 那这是何物? None 1.0040001 1004.0001
102600001 LiJie None 李诫 0 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.02600001 1026.00001 100400011 LiJie None 李诫 1 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.00400011 1004.00011
102700001 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.02700001 1027.00001 100400012 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.00400012 1004.00012
102800001 LiJie None 李诫 0 汴京地势多洼,营建房宇先以水准定基址 None 1.02800001 1028.00001 100400013 LiJie None 李诫 1 汴京地势多洼,营建房宇先以水准定基址 None 1.00400013 1004.00013
102800002 LiJie None 李诫 0 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.02800002 1028.00002 100400014 LiJie None 李诫 1 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.00400014 1004.00014
102900001 LiJie None 李诫 0 水之性平,这水准便是借水定平。 None 1.02900001 1029.00001 100400015 LiJie None 李诫 1 水之性平,这水准便是借水定平。 None 1.00400015 1004.00015
103000001 LiJie None 李诫 0 除了这些器具,库房更藏有 “料例” 册籍, None 1.03000001 1030.00001 100400016 LiJie None 李诫 1 除了这些器具,库房更藏有 “料例” 册籍, None 1.00400016 1004.00016
103000002 LiJie None 李诫 0 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.03000002 1030.00002 100400017 LiJie None 李诫 1 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.00400017 1004.00017
103100001 LiJie None 李诫 0 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.03100001 1031.00001 100400018 LiJie None 李诫 1 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.00400018 1004.00018
103100002 LiJie None 李诫 0 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.03100002 1031.00002 100400019 LiJie None 李诫 1 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.00400019 1004.00019
103200001 LiJie None 李诫 0 今日先熟其形、知其用。 None 1.03200001 1032.00001 100400020 LiJie None 李诫 1 今日先熟其形、知其用。 None 1.0040002 1004.0002
103200002 LiJie None 李诫 0 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.03200002 1032.00002 100400021 LiJie None 李诫 1 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.00400021 1004.00021
103300001 Player None 玩家 0 是,李主簿。 None 1.03300001 1033.00001 100400022 Player None 玩家 0 是,李主簿。 None 1.00400022 1004.00022
103400001 LiJie None 李诫 0 这工地是谁负责! None 1.03400001 1034.00001 103400001 LiJie None 李诫 0 这工地是谁负责! None 1.03400001 1034.00001
103500001 GongTou None 工头 0 李主簿,您怎么又来了… None 1.03500001 1035.00001 103500001 GongTou None 工头 0 李主簿,您怎么又来了… None 1.03500001 1035.00001
103600001 LiJie None 李诫 0 我不来,怎知你们又在如何糊弄? None 1.03600001 1036.00001 103600001 LiJie None 李诫 0 我不来,怎知你们又在如何糊弄? None 1.03600001 1036.00001

Binary file not shown.

View File

@ -3,6 +3,7 @@
# int string string bool bool # int string string bool bool
# 界面编号 策划备注 资源名称 界面组名称 是否允许多个界面实例 是否暂停被其覆盖的界面 # 界面编号 策划备注 资源名称 界面组名称 是否允许多个界面实例 是否暂停被其覆盖的界面
1 弹出框 DialogForm Dialog True False 1 弹出框 DialogForm Dialog True False
2 BgForm Default False False
100 主菜单 MenuForm Default False True 100 主菜单 MenuForm Default False True
101 设置 SettingForm Default False True 101 设置 SettingForm Default False True
102 关于 AboutForm Default False True 102 关于 AboutForm Default False True

Binary file not shown.