diff --git a/.gitignore b/.gitignore index 9cf5924..34c084a 100644 --- a/.gitignore +++ b/.gitignore @@ -98,4 +98,4 @@ crashlytics-build.properties /Android /bin /.omc - +/.omx diff --git a/Assets/GameMain/DataTables/Dialog.txt b/Assets/GameMain/DataTables/Dialog.txt index c86a3be..cf1711f 100644 --- a/Assets/GameMain/DataTables/Dialog.txt +++ b/Assets/GameMain/DataTables/Dialog.txt @@ -3,12 +3,9 @@ # int string DialogUIMode int # 对话编号 策划备注 对话标识 对话形式 章节编号 1001 第一章介绍 Ch1_Time01 Mask 1.001 - 1002 第一章主流程 Ch1_Dialog_LiJie01 BottomBox 1.002 - 1003 第一章玩法开始前闲聊 Ch1_Dialog_Foreman01 BottomBox 1.003 - 1004 Ch1_Dialog_LiJie02 BottomBox 1.004 - 1005 Ch1_Dialog_Foreman02 BottomBox 1.005 - 1006 Ch1_Narrator01 BottomBox 1.006 - 1007 Ch1_Dialog_LiJie03 BottomBox 1.007 + 1002 第一章主流程 Ch1_LiJie BottomBox 1.002 + 1003 Ch1_Narrator01 BottomBox 1.003 + 1004 Ch1_Dialog_LiJie03 BottomBox 1.004 1008 Ch1_Dialog_Player01 BottomBox 1.008 1009 Ch1_Dialog_LiJie04 BottomBox 1.009 1010 Ch1_Dialog_LiJie05 BottomBox 1.01 diff --git a/Assets/GameMain/DataTables/DialogLine.txt b/Assets/GameMain/DataTables/DialogLine.txt index 75ddc0e..6715b90 100644 --- a/Assets/GameMain/DataTables/DialogLine.txt +++ b/Assets/GameMain/DataTables/DialogLine.txt @@ -4,51 +4,51 @@ # 对话行编号 策划备注 说话人Id 表情 显示人名 说话朝向 说话内容 演出效果 章节Id 对话Id 100100001 Id规则为 Time None 时间 0 元祐七年,北宋汴京。 None 1.00100001 1001.00001 100200001 第1位数为章节Id LiJie None 李诫 0 工头呢,工头呢,这是发生的什么事! None 1.00200001 1002.00001 - 100300001 第2-4位数为对话Id GongTou None 工头 0 李官人啊,这...,我也不知...,啊! None 1.00300001 1003.00001 - 100300002 第5-9位数为对话行Id GongTou None 工头 0 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00300002 1003.00002 - 100400001 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00400001 1004.00001 - 100400002 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00400002 1004.00002 - 100500001 GongTou None 工头 0 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00500001 1005.00001 - 100500002 GongTou None 工头 0 我一定将这小人找出来...。 None 1.00500002 1005.00002 - 100600001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00600001 1006.00001 - 100700001 LiJie None 李诫 0 你便是新任的画图令史? None 1.00700001 1007.00001 - 100700002 LiJie None 李诫 0 来得正好。 None 1.00700002 1007.00002 - 100800001 Player None 玩家 0 属下正是,见过李主簿。 None 1.00800001 1008.00001 - 100900001 LiJie None 李诫 0 方才工地塌架,你也有所耳闻。 None 1.00900001 1009.00001 - 100900002 LiJie None 李诫 0 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00900002 1009.00002 - 100900003 LiJie None 李诫 0 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00900003 1009.00003 - 101000001 LiJie None 李诫 0 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.01000001 1010.00001 - 101000002 LiJie None 李诫 0 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.01000002 1010.00002 - 101100001 LiJie None 李诫 0 无规矩,则屋不立;无准绳,则工不正。 None 1.01100001 1011.00001 - 101100002 LiJie None 李诫 0 你也要牢记。 None 1.01100002 1011.00002 - 101200001 Player None 玩家 0 是,李主簿。 None 1.01200001 1012.00001 - 101300001 LiJie None 李诫 0 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.01300001 1013.00001 - 101400001 LiJie None 李诫 0 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.01400001 1014.00001 - 101500001 LiJie None 李诫 0 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.01500001 1015.00001 - 101600001 Player None 玩家 0 属下遵命。 None 1.01600001 1016.00001 - 101700001 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.01700001 1017.00001 - 101800001 LiJie None 李诫 0 这里是库房,存放着营造时用到的所有工具。 None 1.01800001 1018.00001 - 101900001 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.01900001 1019.00001 - 102000001 LiJie None 李诫 0 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.02000001 1020.00001 - 102100001 LiJie None 李诫 0 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.02100001 1021.00001 - 102200001 LiJie None 李诫 0 此乃方斗,也叫墨斗,配绳墨使用。 None 1.02200001 1022.00001 - 102200002 LiJie None 李诫 0 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.02200002 1022.00002 - 102300001 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.02300001 1023.00001 - 102400001 LiJie None 李诫 0 营造之事,“直” 为要。 None 1.02400001 1024.00001 - 102400002 LiJie None 李诫 0 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.02400002 1024.00002 - 102500001 Player None 玩家 0 那这是何物? None 1.02500001 1025.00001 - 102600001 LiJie None 李诫 0 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.02600001 1026.00001 - 102700001 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.02700001 1027.00001 - 102800001 LiJie None 李诫 0 汴京地势多洼,营建房宇先以水准定基址 None 1.02800001 1028.00001 - 102800002 LiJie None 李诫 0 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.02800002 1028.00002 - 102900001 LiJie None 李诫 0 水之性平,这水准便是借水定平。 None 1.02900001 1029.00001 - 103000001 LiJie None 李诫 0 除了这些器具,库房更藏有 “料例” 册籍, None 1.03000001 1030.00001 - 103000002 LiJie None 李诫 0 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.03000002 1030.00002 - 103100001 LiJie None 李诫 0 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.03100001 1031.00001 - 103100002 LiJie None 李诫 0 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.03100002 1031.00002 - 103200001 LiJie None 李诫 0 今日先熟其形、知其用。 None 1.03200001 1032.00001 - 103200002 LiJie None 李诫 0 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.03200002 1032.00002 - 103300001 Player None 玩家 0 是,李主簿。 None 1.03300001 1033.00001 + 100200002 第2-4位数为对话Id GongTou None 工头 1 李官人啊,这...,我也不知...,啊! None 1.00200002 1002.00002 + 100200003 第5-9位数为对话行Id GongTou None 工头 1 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00200003 1002.00003 + 100200004 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00200004 1002.00004 + 100200005 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00200005 1002.00005 + 100200006 GongTou None 工头 1 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00200006 1002.00006 + 100200007 GongTou None 工头 1 我一定将这小人找出来...。 None 1.00200007 1002.00007 + 100300001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00300001 1003.00001 + 100300002 LiJie None 李诫 1 你便是新任的画图令史? None 1.00300002 1003.00002 + 100300003 LiJie None 李诫 1 来得正好。 None 1.00300003 1003.00003 + 100300004 Player None 玩家 0 属下正是,见过李主簿。 None 1.00300004 1003.00004 + 100300005 LiJie None 李诫 1 方才工地塌架,你也有所耳闻。 None 1.00300005 1003.00005 + 100300006 LiJie None 李诫 1 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00300006 1003.00006 + 100300007 LiJie None 李诫 1 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00300007 1003.00007 + 100300008 LiJie None 李诫 1 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.00300008 1003.00008 + 100300009 LiJie None 李诫 1 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.00300009 1003.00009 + 100300010 LiJie None 李诫 1 无规矩,则屋不立;无准绳,则工不正。 None 1.0030001 1003.0001 + 100300011 LiJie None 李诫 1 你也要牢记。 None 1.00300011 1003.00011 + 100300012 Player None 玩家 0 是,李主簿。 None 1.00300012 1003.00012 + 100300013 LiJie None 李诫 1 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.00300013 1003.00013 + 100300014 LiJie None 李诫 1 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.00300014 1003.00014 + 100300015 LiJie None 李诫 1 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.00300015 1003.00015 + 100300016 Player None 玩家 0 属下遵命。 None 1.00300016 1003.00016 + 100300017 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.00300017 1003.00017 + 100400001 LiJie None 李诫 1 这里是库房,存放着营造时用到的所有工具。 None 1.00400001 1004.00001 + 100400002 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.00400002 1004.00002 + 100400003 LiJie None 李诫 1 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.00400003 1004.00003 + 100400004 LiJie None 李诫 1 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.00400004 1004.00004 + 100400005 LiJie None 李诫 1 此乃方斗,也叫墨斗,配绳墨使用。 None 1.00400005 1004.00005 + 100400006 LiJie None 李诫 1 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.00400006 1004.00006 + 100400007 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.00400007 1004.00007 + 100400008 LiJie None 李诫 1 营造之事,“直” 为要。 None 1.00400008 1004.00008 + 100400009 LiJie None 李诫 1 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.00400009 1004.00009 + 100400010 Player None 玩家 0 那这是何物? None 1.0040001 1004.0001 + 100400011 LiJie None 李诫 1 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.00400011 1004.00011 + 100400012 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.00400012 1004.00012 + 100400013 LiJie None 李诫 1 汴京地势多洼,营建房宇先以水准定基址 None 1.00400013 1004.00013 + 100400014 LiJie None 李诫 1 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.00400014 1004.00014 + 100400015 LiJie None 李诫 1 水之性平,这水准便是借水定平。 None 1.00400015 1004.00015 + 100400016 LiJie None 李诫 1 除了这些器具,库房更藏有 “料例” 册籍, None 1.00400016 1004.00016 + 100400017 LiJie None 李诫 1 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.00400017 1004.00017 + 100400018 LiJie None 李诫 1 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.00400018 1004.00018 + 100400019 LiJie None 李诫 1 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.00400019 1004.00019 + 100400020 LiJie None 李诫 1 今日先熟其形、知其用。 None 1.0040002 1004.0002 + 100400021 LiJie None 李诫 1 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.00400021 1004.00021 + 100400022 Player None 玩家 0 是,李主簿。 None 1.00400022 1004.00022 103400001 LiJie None 李诫 0 这工地是谁负责! None 1.03400001 1034.00001 103500001 GongTou None 工头 0 李主簿,您怎么又来了… None 1.03500001 1035.00001 103600001 LiJie None 李诫 0 我不来,怎知你们又在如何糊弄? None 1.03600001 1036.00001 diff --git a/Assets/GameMain/DataTables/UIForm.txt b/Assets/GameMain/DataTables/UIForm.txt index 979e2e1..bd91774 100644 --- a/Assets/GameMain/DataTables/UIForm.txt +++ b/Assets/GameMain/DataTables/UIForm.txt @@ -3,6 +3,7 @@ # int string string bool bool # 界面编号 策划备注 资源名称 界面组名称 是否允许多个界面实例 是否暂停被其覆盖的界面 1 弹出框 DialogForm Dialog True False + 2 BgForm Default False False 100 主菜单 MenuForm Default False True 101 设置 SettingForm Default False True 102 关于 AboutForm Default False True diff --git a/Assets/GameMain/Scenes/Main.unity b/Assets/GameMain/Scenes/Main.unity index 1eaa51b..4cf8800 100644 --- a/Assets/GameMain/Scenes/Main.unity +++ b/Assets/GameMain/Scenes/Main.unity @@ -122,354 +122,7 @@ NavMeshSettings: debug: m_Flags: 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 SceneRoots: m_ObjectHideFlags: 0 - m_Roots: - - {fileID: 203844589} - - {fileID: 1160234427} - - {fileID: 2070240951} + m_Roots: [] diff --git a/Assets/GameMain/Scripts/Base/GameEntry.Custom.cs b/Assets/GameMain/Scripts/Base/GameEntry.Custom.cs index 7e906d0..80d2bee 100644 --- a/Assets/GameMain/Scripts/Base/GameEntry.Custom.cs +++ b/Assets/GameMain/Scripts/Base/GameEntry.Custom.cs @@ -17,6 +17,8 @@ public partial class GameEntry : MonoBehaviour public static CombineComponent Combine { get; private set; } public static DialogComponent Dialog { 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() { @@ -24,5 +26,7 @@ public partial class GameEntry : MonoBehaviour Combine = UnityGameFramework.Runtime.GameEntry.GetComponent(); Dialog = UnityGameFramework.Runtime.GameEntry.GetComponent(); AIChat = UnityGameFramework.Runtime.GameEntry.GetComponent(); + StoryDirector = UnityGameFramework.Runtime.GameEntry.GetComponent(); + SpriteCache = UnityGameFramework.Runtime.GameEntry.GetComponent(); } } diff --git a/Assets/GameMain/Scripts/CustomComponent/CombineComponent.cs b/Assets/GameMain/Scripts/CustomComponent/CombineComponent.cs index b4c880d..51e3e03 100644 --- a/Assets/GameMain/Scripts/CustomComponent/CombineComponent.cs +++ b/Assets/GameMain/Scripts/CustomComponent/CombineComponent.cs @@ -377,6 +377,7 @@ namespace CustomComponent GameEntry.Event.Fire(this, CombineGuideMessageEventArgs.Create(_completeHint)); } + GameEntry.Event.Fire(this, CombineCompletedEventArgs.Create()); _onPuzzleCompleted.Invoke(); } diff --git a/Assets/GameMain/Scripts/CustomComponent/DialogComponent.cs b/Assets/GameMain/Scripts/CustomComponent/DialogComponent.cs index ecf7f34..0b1ffec 100644 --- a/Assets/GameMain/Scripts/CustomComponent/DialogComponent.cs +++ b/Assets/GameMain/Scripts/CustomComponent/DialogComponent.cs @@ -338,11 +338,20 @@ namespace CustomComponent 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; _currentLineIndex = -1; _formController.OnDialogEnded(_formContext); _formController.CloseUI(); + + if (dialogId > 0) + { + GameEntry.Event.Fire(this, DialogCompletedEventArgs.Create(chapterId, dialogId, lineId)); + } } private void ApplyLineToContext(DRDialogLine lineRow, int lineIndex, int totalLines) diff --git a/Assets/GameMain/Scripts/CustomComponent/ResolutionAdapterComponent.cs b/Assets/GameMain/Scripts/CustomComponent/ResolutionAdapterComponent.cs index 3a39863..6c544ff 100644 --- a/Assets/GameMain/Scripts/CustomComponent/ResolutionAdapterComponent.cs +++ b/Assets/GameMain/Scripts/CustomComponent/ResolutionAdapterComponent.cs @@ -16,6 +16,7 @@ namespace GeometryTD.CustomComponent [SerializeField] private Vector2 _referenceResolution = new Vector2(2560f, 1600f); [SerializeField] private bool _adaptUiCanvasToViewport = true; [SerializeField] private bool _enableBlackMask = true; + [SerializeField] private bool _autoCollectSceneCanvases = true; [SerializeField] private List _uiRoots = new List(); private readonly List _canvasBuffer = new List(32); @@ -29,6 +30,7 @@ namespace GeometryTD.CustomComponent private bool _canvasCacheDirty = true; private bool _uiEventSubscribed; + private bool _sceneEventSubscribed; private bool _missingRootWarned; private Canvas _maskCanvas; @@ -163,18 +165,6 @@ namespace GeometryTD.CustomComponent 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) { RebuildCanvasCache(); @@ -200,9 +190,49 @@ namespace GeometryTD.CustomComponent _trackedCanvases.Clear(); _trackedCanvasSet.Clear(); - foreach (var root in _uiRoots) + bool hasValidRoot = false; + if (_uiRoots != null) { - CollectCanvases(root); + foreach (var root in _uiRoots) + { + if (root == null) + { + continue; + } + + hasValidRoot = true; + CollectCanvases(root); + } + } + + if (_autoCollectSceneCanvases || !hasValidRoot) + { + Canvas[] canvases = Resources.FindObjectsOfTypeAll(); + 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."); } } @@ -270,27 +300,46 @@ namespace GeometryTD.CustomComponent private void TryEnsureUiEventSubscribed() { - if (_uiEventSubscribed || GameEntry.Event == null) + if (GameEntry.Event == null) { return; } - GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged); - GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged); - _uiEventSubscribed = true; - _canvasCacheDirty = true; + if (!_uiEventSubscribed) + { + GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged); + GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged); + _uiEventSubscribed = true; + _canvasCacheDirty = true; + } + + if (!_sceneEventSubscribed) + { + GameEntry.Event.Subscribe(LoadSceneSuccessEventArgs.EventId, OnSceneChanged); + _sceneEventSubscribed = true; + _canvasCacheDirty = true; + } } private void UnsubscribeUiEvents() { - if (!_uiEventSubscribed || GameEntry.Event == null) + if (GameEntry.Event == null) { return; } - GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged); - GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged); - _uiEventSubscribed = false; + if (_uiEventSubscribed) + { + GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged); + GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged); + _uiEventSubscribed = false; + } + + if (_sceneEventSubscribed) + { + GameEntry.Event.Unsubscribe(LoadSceneSuccessEventArgs.EventId, OnSceneChanged); + _sceneEventSubscribed = false; + } } private void OnUIFormChanged(object sender, GameEventArgs e) @@ -298,6 +347,12 @@ namespace GeometryTD.CustomComponent _canvasCacheDirty = true; } + private void OnSceneChanged(object sender, GameEventArgs e) + { + _canvasCacheDirty = true; + _missingRootWarned = false; + } + private void UpdateMaskLayout() { if (!_enableBlackMask) @@ -442,4 +497,4 @@ namespace GeometryTD.CustomComponent maskRect.sizeDelta = new Vector2(0f, height); } } -} \ No newline at end of file +} diff --git a/Assets/GameMain/Scripts/CustomComponent/SpriteCacheComponent.cs b/Assets/GameMain/Scripts/CustomComponent/SpriteCacheComponent.cs index a9af45e..de622bd 100644 --- a/Assets/GameMain/Scripts/CustomComponent/SpriteCacheComponent.cs +++ b/Assets/GameMain/Scripts/CustomComponent/SpriteCacheComponent.cs @@ -33,7 +33,7 @@ namespace CustomComponent { _resource.LoadAsset ( - AssetUtility.GetUIDialogAsset(assetName), + AssetUtility.GetUISpriteAsset(assetName), Constant.AssetPriority.UIFormAsset, new LoadAssetCallbacks( (resourcePath, asset, duration, userData) => diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective.meta b/Assets/GameMain/Scripts/CustomComponent/StoryDirective.meta new file mode 100644 index 0000000..719f788 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 99c1d60910f24e37ba0cbd8109e63bd7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryChangeBackgroundDirectiveAsset.cs b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryChangeBackgroundDirectiveAsset.cs new file mode 100644 index 0000000..2a568c3 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryChangeBackgroundDirectiveAsset.cs @@ -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); + } + } +} diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryChangeBackgroundDirectiveAsset.cs.meta b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryChangeBackgroundDirectiveAsset.cs.meta new file mode 100644 index 0000000..aa6eb80 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryChangeBackgroundDirectiveAsset.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2d4b16a5d76140a1b952ad48774dd89a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryCombineConfig.cs b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryCombineConfig.cs new file mode 100644 index 0000000..916a7f6 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryCombineConfig.cs @@ -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 Slots = new List(); + public List Parts = new List(); + } +} diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryCombineConfig.cs.meta b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryCombineConfig.cs.meta new file mode 100644 index 0000000..bc095c8 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryCombineConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4c53bd314c194677b10a2e7fa754fdbb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryDirectiveAsset.cs b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryDirectiveAsset.cs new file mode 100644 index 0000000..6c73e98 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryDirectiveAsset.cs @@ -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); + } +} diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryDirectiveAsset.cs.meta b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryDirectiveAsset.cs.meta new file mode 100644 index 0000000..6da5cb5 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryDirectiveAsset.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2deed2f965a04cbab1c18d2e9b5d5845 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryEndChapterDirectiveAsset.cs b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryEndChapterDirectiveAsset.cs new file mode 100644 index 0000000..12fa4f4 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryEndChapterDirectiveAsset.cs @@ -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); + } + } +} diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryEndChapterDirectiveAsset.cs.meta b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryEndChapterDirectiveAsset.cs.meta new file mode 100644 index 0000000..b2503d1 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryEndChapterDirectiveAsset.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b63fb6eb96e4d3193dd26b443f856c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartCombineDirectiveAsset.cs b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartCombineDirectiveAsset.cs new file mode 100644 index 0000000..8e4c9bd --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartCombineDirectiveAsset.cs @@ -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); + } + } +} diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartCombineDirectiveAsset.cs.meta b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartCombineDirectiveAsset.cs.meta new file mode 100644 index 0000000..36ff5fd --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartCombineDirectiveAsset.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 19a1150cd0fb4b648ad8232de4e38baa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartDialogDirectiveAsset.cs b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartDialogDirectiveAsset.cs new file mode 100644 index 0000000..12fab8f --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartDialogDirectiveAsset.cs @@ -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); + } + } +} diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartDialogDirectiveAsset.cs.meta b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartDialogDirectiveAsset.cs.meta new file mode 100644 index 0000000..329b85b --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryStartDialogDirectiveAsset.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8e4367863f5042e1b5b0b3b3b7f62f5e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryTriggerType.cs b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryTriggerType.cs new file mode 100644 index 0000000..1d194b4 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryTriggerType.cs @@ -0,0 +1,8 @@ +namespace CustomComponent +{ + public enum StoryTriggerType + { + DialogCompleted = 0, + CombineCompleted = 1 + } +} diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryTriggerType.cs.meta b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryTriggerType.cs.meta new file mode 100644 index 0000000..52f854f --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirective/StoryTriggerType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b9d79013962410681f2f29343902599 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirectorComponent.cs b/Assets/GameMain/Scripts/CustomComponent/StoryDirectorComponent.cs new file mode 100644 index 0000000..c3b132f --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirectorComponent.cs @@ -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 _directives = new List(); + + [SerializeField] private bool _allowRepeatTrigger = false; + + [SerializeField] private bool _verboseLog = true; + + [SerializeField] private string _backgroundAssetNamePrefix = string.Empty; + + private readonly HashSet _consumedDirectiveTokens = new HashSet(); + + 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 CloneSlots(List source) + { + var result = new List(); + 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 CloneParts(List source) + { + var result = new List(); + 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 slots = new List + { + 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 parts = new List + { + 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 + }; + } + } +} \ No newline at end of file diff --git a/Assets/GameMain/Scripts/CustomComponent/StoryDirectorComponent.cs.meta b/Assets/GameMain/Scripts/CustomComponent/StoryDirectorComponent.cs.meta new file mode 100644 index 0000000..c7a4f69 --- /dev/null +++ b/Assets/GameMain/Scripts/CustomComponent/StoryDirectorComponent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d899fa8b1598c1846bc3a03d11c83d04 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Event/Dialog/DialogCompletedEventArgs.cs b/Assets/GameMain/Scripts/Event/Dialog/DialogCompletedEventArgs.cs new file mode 100644 index 0000000..dfbba11 --- /dev/null +++ b/Assets/GameMain/Scripts/Event/Dialog/DialogCompletedEventArgs.cs @@ -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(); + + args.ChapterId = chapterId; + args.DialogId = dialogId; + args.LastLineId = lastLineId; + return args; + } + + public override void Clear() + { + ChapterId = 0; + DialogId = 0; + LastLineId = 0; + } + } +} diff --git a/Assets/GameMain/Scripts/Event/Dialog/DialogCompletedEventArgs.cs.meta b/Assets/GameMain/Scripts/Event/Dialog/DialogCompletedEventArgs.cs.meta new file mode 100644 index 0000000..91bf4d5 --- /dev/null +++ b/Assets/GameMain/Scripts/Event/Dialog/DialogCompletedEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff3fd581bec19164c8c5b03222e0ccec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Event/Story.meta b/Assets/GameMain/Scripts/Event/Story.meta new file mode 100644 index 0000000..2af2750 --- /dev/null +++ b/Assets/GameMain/Scripts/Event/Story.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0cc1868d04d452c4ea1b26b3bb3faf41 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Event/Story/StoryChapterEndedEventArgs.cs b/Assets/GameMain/Scripts/Event/Story/StoryChapterEndedEventArgs.cs new file mode 100644 index 0000000..290471e --- /dev/null +++ b/Assets/GameMain/Scripts/Event/Story/StoryChapterEndedEventArgs.cs @@ -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(); + args.ChapterId = chapterId; + return args; + } + + public override void Clear() + { + ChapterId = 0; + } + } +} diff --git a/Assets/GameMain/Scripts/Event/Story/StoryChapterEndedEventArgs.cs.meta b/Assets/GameMain/Scripts/Event/Story/StoryChapterEndedEventArgs.cs.meta new file mode 100644 index 0000000..7fda9d7 --- /dev/null +++ b/Assets/GameMain/Scripts/Event/Story/StoryChapterEndedEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 04884ea6e03d99345b9e4a9c60ccf913 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Utility/AssetUtility.cs b/Assets/GameMain/Scripts/Utility/AssetUtility.cs index f41d109..a840c5a 100644 --- a/Assets/GameMain/Scripts/Utility/AssetUtility.cs +++ b/Assets/GameMain/Scripts/Utility/AssetUtility.cs @@ -66,9 +66,9 @@ namespace CustomUtility 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); } } } diff --git a/Assets/GameMain/StoryDirector.meta b/Assets/GameMain/StoryDirector.meta new file mode 100644 index 0000000..2b3596a --- /dev/null +++ b/Assets/GameMain/StoryDirector.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f3d9a754557829043909b803afc50822 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/StoryDirector/BG1001.asset b/Assets/GameMain/StoryDirector/BG1001.asset new file mode 100644 index 0000000..c75941d --- /dev/null +++ b/Assets/GameMain/StoryDirector/BG1001.asset @@ -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 diff --git a/Assets/GameMain/StoryDirector/BG1001.asset.meta b/Assets/GameMain/StoryDirector/BG1001.asset.meta new file mode 100644 index 0000000..e85e5d2 --- /dev/null +++ b/Assets/GameMain/StoryDirector/BG1001.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fbe72cf66cec3ad4e9fb3167b291ce4f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/StoryDirector/Dialog1001.asset b/Assets/GameMain/StoryDirector/Dialog1001.asset new file mode 100644 index 0000000..6842ffd --- /dev/null +++ b/Assets/GameMain/StoryDirector/Dialog1001.asset @@ -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 diff --git a/Assets/GameMain/StoryDirector/Dialog1001.asset.meta b/Assets/GameMain/StoryDirector/Dialog1001.asset.meta new file mode 100644 index 0000000..3d518dd --- /dev/null +++ b/Assets/GameMain/StoryDirector/Dialog1001.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a6031366dd068b84b9797525616de223 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/UI/UIForms/BottomBoxDialogForm.prefab b/Assets/GameMain/UI/UIForms/BottomBoxDialogForm.prefab index 7a4b8eb..c0b415a 100644 --- a/Assets/GameMain/UI/UIForms/BottomBoxDialogForm.prefab +++ b/Assets/GameMain/UI/UIForms/BottomBoxDialogForm.prefab @@ -525,8 +525,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 250, y: -40} - m_SizeDelta: {x: 500, y: 80} + m_AnchoredPosition: {x: 200, y: -40} + m_SizeDelta: {x: 400, y: 80} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &4514918814497795030 GameObject: @@ -835,10 +835,10 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 80 + m_fontSize: 72 m_fontSizeBase: 80 m_fontWeight: 400 - m_enableAutoSizing: 0 + m_enableAutoSizing: 1 m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 1 @@ -987,5 +987,5 @@ RectTransform: m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0} 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} diff --git a/Assets/GameMain/UI/UISprites/Background/background_1.jpg b/Assets/GameMain/UI/UISprites/Background/BG_1.jpg similarity index 100% rename from Assets/GameMain/UI/UISprites/Background/background_1.jpg rename to Assets/GameMain/UI/UISprites/Background/BG_1.jpg diff --git a/Assets/GameMain/UI/UISprites/Background/background_1.jpg.meta b/Assets/GameMain/UI/UISprites/Background/BG_1.jpg.meta similarity index 100% rename from Assets/GameMain/UI/UISprites/Background/background_1.jpg.meta rename to Assets/GameMain/UI/UISprites/Background/BG_1.jpg.meta diff --git a/Assets/GameMain/UI/UISprites/Background/background_2.jpg b/Assets/GameMain/UI/UISprites/Background/BG_2.jpg similarity index 100% rename from Assets/GameMain/UI/UISprites/Background/background_2.jpg rename to Assets/GameMain/UI/UISprites/Background/BG_2.jpg diff --git a/Assets/GameMain/UI/UISprites/Background/background_2.jpg.meta b/Assets/GameMain/UI/UISprites/Background/BG_2.jpg.meta similarity index 100% rename from Assets/GameMain/UI/UISprites/Background/background_2.jpg.meta rename to Assets/GameMain/UI/UISprites/Background/BG_2.jpg.meta diff --git a/Assets/GameMain/UI/UISprites/Background/background_3.jpg b/Assets/GameMain/UI/UISprites/Background/BG_3.jpg similarity index 100% rename from Assets/GameMain/UI/UISprites/Background/background_3.jpg rename to Assets/GameMain/UI/UISprites/Background/BG_3.jpg diff --git a/Assets/GameMain/UI/UISprites/Background/background_3.jpg.meta b/Assets/GameMain/UI/UISprites/Background/BG_3.jpg.meta similarity index 100% rename from Assets/GameMain/UI/UISprites/Background/background_3.jpg.meta rename to Assets/GameMain/UI/UISprites/Background/BG_3.jpg.meta diff --git a/Assets/GameMain/UI/UISprites/Background/background_start_menu.jpg b/Assets/GameMain/UI/UISprites/Background/BG_Menu.jpg similarity index 100% rename from Assets/GameMain/UI/UISprites/Background/background_start_menu.jpg rename to Assets/GameMain/UI/UISprites/Background/BG_Menu.jpg diff --git a/Assets/GameMain/UI/UISprites/Background/background_start_menu.jpg.meta b/Assets/GameMain/UI/UISprites/Background/BG_Menu.jpg.meta similarity index 100% rename from Assets/GameMain/UI/UISprites/Background/background_start_menu.jpg.meta rename to Assets/GameMain/UI/UISprites/Background/BG_Menu.jpg.meta diff --git a/Assets/GameMain/UI/UISprites/Common/brush_white.png b/Assets/GameMain/UI/UISprites/Common/brush_white.png new file mode 100644 index 0000000..caf75ef Binary files /dev/null and b/Assets/GameMain/UI/UISprites/Common/brush_white.png differ diff --git a/Assets/GameMain/UI/UISprites/Common/brush_white.png.meta b/Assets/GameMain/UI/UISprites/Common/brush_white.png.meta new file mode 100644 index 0000000..f4f1bd3 --- /dev/null +++ b/Assets/GameMain/UI/UISprites/Common/brush_white.png.meta @@ -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: diff --git a/Assets/Launcher.unity b/Assets/Launcher.unity index 19d9959..67ed4bc 100644 --- a/Assets/Launcher.unity +++ b/Assets/Launcher.unity @@ -122,6 +122,52 @@ NavMeshSettings: debug: m_Flags: 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 GameObject: m_ObjectHideFlags: 0 @@ -156,6 +202,8 @@ Transform: - {fileID: 434859534} - {fileID: 1064285105} - {fileID: 1402371486} + - {fileID: 2000155822} + - {fileID: 51490594} m_Father: {fileID: 1852670053} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &120093239 @@ -248,143 +296,6 @@ MonoBehaviour: m_PointerBehavior: 0 m_CursorLockBehavior: 0 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 Transform: m_CorrespondingSourceObject: {fileID: 430602, guid: adb3eb1c35fcff14f89fba7b05c9d71c, @@ -1184,6 +1095,7 @@ MonoBehaviour: _referenceResolution: {x: 2048, y: 1152} _adaptUiCanvasToViewport: 1 _enableBlackMask: 1 + _autoCollectSceneCanvases: 1 _uiRoots: - {fileID: 934951765} --- !u!1 &1852670052 @@ -1263,10 +1175,59 @@ Transform: m_Children: [] m_Father: {fileID: 119167776} 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 SceneRoots: m_ObjectHideFlags: 0 m_Roots: - {fileID: 1852670053} - {fileID: 120093242} - - {fileID: 188380260} diff --git a/数据表/Dialog.txt b/数据表/Dialog.txt index c86a3be..cf1711f 100644 --- a/数据表/Dialog.txt +++ b/数据表/Dialog.txt @@ -3,12 +3,9 @@ # int string DialogUIMode int # 对话编号 策划备注 对话标识 对话形式 章节编号 1001 第一章介绍 Ch1_Time01 Mask 1.001 - 1002 第一章主流程 Ch1_Dialog_LiJie01 BottomBox 1.002 - 1003 第一章玩法开始前闲聊 Ch1_Dialog_Foreman01 BottomBox 1.003 - 1004 Ch1_Dialog_LiJie02 BottomBox 1.004 - 1005 Ch1_Dialog_Foreman02 BottomBox 1.005 - 1006 Ch1_Narrator01 BottomBox 1.006 - 1007 Ch1_Dialog_LiJie03 BottomBox 1.007 + 1002 第一章主流程 Ch1_LiJie BottomBox 1.002 + 1003 Ch1_Narrator01 BottomBox 1.003 + 1004 Ch1_Dialog_LiJie03 BottomBox 1.004 1008 Ch1_Dialog_Player01 BottomBox 1.008 1009 Ch1_Dialog_LiJie04 BottomBox 1.009 1010 Ch1_Dialog_LiJie05 BottomBox 1.01 diff --git a/数据表/Dialog.xlsx b/数据表/Dialog.xlsx index 7307799..0a17c90 100644 Binary files a/数据表/Dialog.xlsx and b/数据表/Dialog.xlsx differ diff --git a/数据表/DialogLine.txt b/数据表/DialogLine.txt index 75ddc0e..6715b90 100644 --- a/数据表/DialogLine.txt +++ b/数据表/DialogLine.txt @@ -4,51 +4,51 @@ # 对话行编号 策划备注 说话人Id 表情 显示人名 说话朝向 说话内容 演出效果 章节Id 对话Id 100100001 Id规则为 Time None 时间 0 元祐七年,北宋汴京。 None 1.00100001 1001.00001 100200001 第1位数为章节Id LiJie None 李诫 0 工头呢,工头呢,这是发生的什么事! None 1.00200001 1002.00001 - 100300001 第2-4位数为对话Id GongTou None 工头 0 李官人啊,这...,我也不知...,啊! None 1.00300001 1003.00001 - 100300002 第5-9位数为对话行Id GongTou None 工头 0 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00300002 1003.00002 - 100400001 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00400001 1004.00001 - 100400002 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00400002 1004.00002 - 100500001 GongTou None 工头 0 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00500001 1005.00001 - 100500002 GongTou None 工头 0 我一定将这小人找出来...。 None 1.00500002 1005.00002 - 100600001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00600001 1006.00001 - 100700001 LiJie None 李诫 0 你便是新任的画图令史? None 1.00700001 1007.00001 - 100700002 LiJie None 李诫 0 来得正好。 None 1.00700002 1007.00002 - 100800001 Player None 玩家 0 属下正是,见过李主簿。 None 1.00800001 1008.00001 - 100900001 LiJie None 李诫 0 方才工地塌架,你也有所耳闻。 None 1.00900001 1009.00001 - 100900002 LiJie None 李诫 0 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00900002 1009.00002 - 100900003 LiJie None 李诫 0 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00900003 1009.00003 - 101000001 LiJie None 李诫 0 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.01000001 1010.00001 - 101000002 LiJie None 李诫 0 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.01000002 1010.00002 - 101100001 LiJie None 李诫 0 无规矩,则屋不立;无准绳,则工不正。 None 1.01100001 1011.00001 - 101100002 LiJie None 李诫 0 你也要牢记。 None 1.01100002 1011.00002 - 101200001 Player None 玩家 0 是,李主簿。 None 1.01200001 1012.00001 - 101300001 LiJie None 李诫 0 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.01300001 1013.00001 - 101400001 LiJie None 李诫 0 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.01400001 1014.00001 - 101500001 LiJie None 李诫 0 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.01500001 1015.00001 - 101600001 Player None 玩家 0 属下遵命。 None 1.01600001 1016.00001 - 101700001 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.01700001 1017.00001 - 101800001 LiJie None 李诫 0 这里是库房,存放着营造时用到的所有工具。 None 1.01800001 1018.00001 - 101900001 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.01900001 1019.00001 - 102000001 LiJie None 李诫 0 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.02000001 1020.00001 - 102100001 LiJie None 李诫 0 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.02100001 1021.00001 - 102200001 LiJie None 李诫 0 此乃方斗,也叫墨斗,配绳墨使用。 None 1.02200001 1022.00001 - 102200002 LiJie None 李诫 0 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.02200002 1022.00002 - 102300001 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.02300001 1023.00001 - 102400001 LiJie None 李诫 0 营造之事,“直” 为要。 None 1.02400001 1024.00001 - 102400002 LiJie None 李诫 0 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.02400002 1024.00002 - 102500001 Player None 玩家 0 那这是何物? None 1.02500001 1025.00001 - 102600001 LiJie None 李诫 0 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.02600001 1026.00001 - 102700001 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.02700001 1027.00001 - 102800001 LiJie None 李诫 0 汴京地势多洼,营建房宇先以水准定基址 None 1.02800001 1028.00001 - 102800002 LiJie None 李诫 0 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.02800002 1028.00002 - 102900001 LiJie None 李诫 0 水之性平,这水准便是借水定平。 None 1.02900001 1029.00001 - 103000001 LiJie None 李诫 0 除了这些器具,库房更藏有 “料例” 册籍, None 1.03000001 1030.00001 - 103000002 LiJie None 李诫 0 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.03000002 1030.00002 - 103100001 LiJie None 李诫 0 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.03100001 1031.00001 - 103100002 LiJie None 李诫 0 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.03100002 1031.00002 - 103200001 LiJie None 李诫 0 今日先熟其形、知其用。 None 1.03200001 1032.00001 - 103200002 LiJie None 李诫 0 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.03200002 1032.00002 - 103300001 Player None 玩家 0 是,李主簿。 None 1.03300001 1033.00001 + 100200002 第2-4位数为对话Id GongTou None 工头 1 李官人啊,这...,我也不知...,啊! None 1.00200002 1002.00002 + 100200003 第5-9位数为对话行Id GongTou None 工头 1 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00200003 1002.00003 + 100200004 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00200004 1002.00004 + 100200005 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00200005 1002.00005 + 100200006 GongTou None 工头 1 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00200006 1002.00006 + 100200007 GongTou None 工头 1 我一定将这小人找出来...。 None 1.00200007 1002.00007 + 100300001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00300001 1003.00001 + 100300002 LiJie None 李诫 1 你便是新任的画图令史? None 1.00300002 1003.00002 + 100300003 LiJie None 李诫 1 来得正好。 None 1.00300003 1003.00003 + 100300004 Player None 玩家 0 属下正是,见过李主簿。 None 1.00300004 1003.00004 + 100300005 LiJie None 李诫 1 方才工地塌架,你也有所耳闻。 None 1.00300005 1003.00005 + 100300006 LiJie None 李诫 1 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00300006 1003.00006 + 100300007 LiJie None 李诫 1 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00300007 1003.00007 + 100300008 LiJie None 李诫 1 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.00300008 1003.00008 + 100300009 LiJie None 李诫 1 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.00300009 1003.00009 + 100300010 LiJie None 李诫 1 无规矩,则屋不立;无准绳,则工不正。 None 1.0030001 1003.0001 + 100300011 LiJie None 李诫 1 你也要牢记。 None 1.00300011 1003.00011 + 100300012 Player None 玩家 0 是,李主簿。 None 1.00300012 1003.00012 + 100300013 LiJie None 李诫 1 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.00300013 1003.00013 + 100300014 LiJie None 李诫 1 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.00300014 1003.00014 + 100300015 LiJie None 李诫 1 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.00300015 1003.00015 + 100300016 Player None 玩家 0 属下遵命。 None 1.00300016 1003.00016 + 100300017 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.00300017 1003.00017 + 100400001 LiJie None 李诫 1 这里是库房,存放着营造时用到的所有工具。 None 1.00400001 1004.00001 + 100400002 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.00400002 1004.00002 + 100400003 LiJie None 李诫 1 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.00400003 1004.00003 + 100400004 LiJie None 李诫 1 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.00400004 1004.00004 + 100400005 LiJie None 李诫 1 此乃方斗,也叫墨斗,配绳墨使用。 None 1.00400005 1004.00005 + 100400006 LiJie None 李诫 1 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.00400006 1004.00006 + 100400007 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.00400007 1004.00007 + 100400008 LiJie None 李诫 1 营造之事,“直” 为要。 None 1.00400008 1004.00008 + 100400009 LiJie None 李诫 1 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.00400009 1004.00009 + 100400010 Player None 玩家 0 那这是何物? None 1.0040001 1004.0001 + 100400011 LiJie None 李诫 1 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.00400011 1004.00011 + 100400012 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.00400012 1004.00012 + 100400013 LiJie None 李诫 1 汴京地势多洼,营建房宇先以水准定基址 None 1.00400013 1004.00013 + 100400014 LiJie None 李诫 1 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.00400014 1004.00014 + 100400015 LiJie None 李诫 1 水之性平,这水准便是借水定平。 None 1.00400015 1004.00015 + 100400016 LiJie None 李诫 1 除了这些器具,库房更藏有 “料例” 册籍, None 1.00400016 1004.00016 + 100400017 LiJie None 李诫 1 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.00400017 1004.00017 + 100400018 LiJie None 李诫 1 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.00400018 1004.00018 + 100400019 LiJie None 李诫 1 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.00400019 1004.00019 + 100400020 LiJie None 李诫 1 今日先熟其形、知其用。 None 1.0040002 1004.0002 + 100400021 LiJie None 李诫 1 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.00400021 1004.00021 + 100400022 Player None 玩家 0 是,李主簿。 None 1.00400022 1004.00022 103400001 LiJie None 李诫 0 这工地是谁负责! None 1.03400001 1034.00001 103500001 GongTou None 工头 0 李主簿,您怎么又来了… None 1.03500001 1035.00001 103600001 LiJie None 李诫 0 我不来,怎知你们又在如何糊弄? None 1.03600001 1036.00001 diff --git a/数据表/DialogLine.xlsx b/数据表/DialogLine.xlsx index a5a61a8..88af2a4 100644 Binary files a/数据表/DialogLine.xlsx and b/数据表/DialogLine.xlsx differ diff --git a/数据表/UIForm.txt b/数据表/UIForm.txt index 979e2e1..bd91774 100644 --- a/数据表/UIForm.txt +++ b/数据表/UIForm.txt @@ -3,6 +3,7 @@ # int string string bool bool # 界面编号 策划备注 资源名称 界面组名称 是否允许多个界面实例 是否暂停被其覆盖的界面 1 弹出框 DialogForm Dialog True False + 2 BgForm Default False False 100 主菜单 MenuForm Default False True 101 设置 SettingForm Default False True 102 关于 AboutForm Default False True diff --git a/数据表/UIForm.xlsx b/数据表/UIForm.xlsx index 28a45c9..e269e46 100644 Binary files a/数据表/UIForm.xlsx and b/数据表/UIForm.xlsx differ