feat: MCP Unity 场景优化 — 完整交互体系搭建
- 删除重复 Ground - 创建 [Managers] 空物体,挂载 GameManager + StepManager + ExperimentFlowCoordinator + AudioManager - Main Camera 挂载 InteractionSystem - 伤者 InjectedPerson 下创建 5 个交互子物体 (InjuryVisual/Swelling/Pain/VitalSigns/Neuro) - 创建绑带位置、踝关节、衬垫、夹板位置等空物体 - 道具摆放到位:伤者(2,0.05,5) 施救者(3,0,5) 鞋(2.7,0.15,5.5) 绷带/夹板/急救箱在旁 - InjuryLeg Tag 修正,Ground Tag 修正 - 全部新脚本同步导入 (ExperimentTypes/StepData/ExperimentConfig/StepManager/GameManager/ExperimentFlowCoordinator/InteractionSystem/DraggableObject/HighlightEffect/UIManager/ExamPopup/ScoreDisplay/VideoController/AudioManager/CharacterAnimController/StepAnimationHandler) - 旧脚本 (ExperimentController/ConfigLoader/AnimationController/HUDController/VideoPlayerController/PopupSystem/ModeSelectionUI) 全部兼容修复或 stub - 编译通过,0 错误 - Canvas 挂载 UIManager
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 64271bef662af4a249d3b26db806b4b9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3bdbe9aa40f514e1987b69dabd75457d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 85c758bad9d614989adac8e5ba7bd207
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b2f8e3f67a24d4846a754cd805cc514b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2d74c755f0b3d4f24883be1486e1ebb3
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bcc075cfc542648268ca8c360fa79e45
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2e5cb2cde3d3145e2a9e84cae6d45d07
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d4a0758449a944eceb61d2d1628effbd
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5e895eb5a64d940eaa1d0a25076fa6f6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 61caee4db972540ce8a75e126457b7f6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,179 @@
|
||||
{
|
||||
"experimentName": "骨折固定",
|
||||
"experimentId": "FractureFixation",
|
||||
"description": "运动伤害现场急救处理——骨折固定虚拟仿真实验",
|
||||
"fixationType": 0,
|
||||
"totalScore": 100,
|
||||
"passingScore": 60,
|
||||
"steps": [
|
||||
{
|
||||
"stepIndex": 0,
|
||||
"stepName": "环境评估",
|
||||
"tipText": "观察周围环境是否有危险,做好防护措施。",
|
||||
"dialogueText": "周围环境安全。我是救护志愿者,我可以帮助您吗?",
|
||||
"interactionType": 4,
|
||||
"targetTag": "",
|
||||
"targetName": "",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 1,
|
||||
"stepName": "伤情检查",
|
||||
"tipText": "请检查伤员受伤位置",
|
||||
"dialogueText": "伤员左大腿疑似骨折,无伤口。",
|
||||
"interactionType": 1,
|
||||
"targetTag": "InjuryLeg",
|
||||
"targetName": "InjuryLeg",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 2,
|
||||
"stepName": "脱鞋袜检查",
|
||||
"tipText": "请将伤员鞋袜脱掉并保存好,观察末端血液循环、运动及感觉",
|
||||
"dialogueText": "",
|
||||
"interactionType": 1,
|
||||
"targetTag": "Shoe",
|
||||
"targetName": "Shoe",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 3,
|
||||
"stepName": "放置衬带",
|
||||
"tipText": "请在正确的位置穿宽度约10cm的带子",
|
||||
"dialogueText": "",
|
||||
"interactionType": 3,
|
||||
"targetTag": "Bandage",
|
||||
"targetName": "Bandage",
|
||||
"showVideo": true,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 4,
|
||||
"stepName": "肢体并拢",
|
||||
"tipText": "请在两下肢间加衬垫,移动健肢,将双下肢轻轻并拢",
|
||||
"dialogueText": "",
|
||||
"interactionType": 4,
|
||||
"targetTag": "",
|
||||
"targetName": "",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 5,
|
||||
"stepName": "主干固定",
|
||||
"tipText": "请在未受伤腿分别固定骨折近心端(上端)、骨折远心端(下端),然后固定膝关节下,结打在右侧。",
|
||||
"dialogueText": "",
|
||||
"interactionType": 3,
|
||||
"targetTag": "Bandage",
|
||||
"targetName": "Bandage",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 6,
|
||||
"stepName": "踝关节固定",
|
||||
"tipText": "踝关节\"8\"字固定,结打在两足背之间。",
|
||||
"dialogueText": "",
|
||||
"interactionType": 3,
|
||||
"targetTag": "Bandage",
|
||||
"targetName": "Bandage",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 7,
|
||||
"stepName": "终末检查",
|
||||
"tipText": "包扎完毕请检查伤肢血液循环,运动及感觉。",
|
||||
"dialogueText": "伤员一切正常,包扎完毕。",
|
||||
"interactionType": 4,
|
||||
"targetTag": "",
|
||||
"targetName": "",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
}
|
||||
],
|
||||
"examQuestions": [
|
||||
{
|
||||
"questionIndex": 0,
|
||||
"questionText": "点击确认后,请按正确顺序进行环境评估与自我介绍",
|
||||
"choices": ["确定"],
|
||||
"correctChoiceIndex": 0,
|
||||
"correctFeedback": "正确",
|
||||
"incorrectFeedback": "",
|
||||
"questionType": 0,
|
||||
"targetTag": ""
|
||||
},
|
||||
{
|
||||
"questionIndex": 1,
|
||||
"questionText": "点击确认后,请按正确顺序检查伤情",
|
||||
"choices": ["确定"],
|
||||
"correctChoiceIndex": 0,
|
||||
"correctFeedback": "正确",
|
||||
"incorrectFeedback": "",
|
||||
"questionType": 0,
|
||||
"targetTag": ""
|
||||
},
|
||||
{
|
||||
"questionIndex": 2,
|
||||
"questionText": "请选择合适的带子宽度",
|
||||
"choices": ["5cm", "10cm", "20cm"],
|
||||
"correctChoiceIndex": 1,
|
||||
"correctFeedback": "正确!",
|
||||
"incorrectFeedback": "应选择10cm宽度的带子",
|
||||
"questionType": 0,
|
||||
"targetTag": ""
|
||||
},
|
||||
{
|
||||
"questionIndex": 3,
|
||||
"questionText": "请选择正确的放带子顺序",
|
||||
"choices": ["确定"],
|
||||
"correctChoiceIndex": 0,
|
||||
"correctFeedback": "正确",
|
||||
"incorrectFeedback": "",
|
||||
"questionType": 2,
|
||||
"targetTag": "Bandage"
|
||||
},
|
||||
{
|
||||
"questionIndex": 4,
|
||||
"questionText": "请选择正确的系带子顺序",
|
||||
"choices": ["确定"],
|
||||
"correctChoiceIndex": 0,
|
||||
"correctFeedback": "正确",
|
||||
"incorrectFeedback": "",
|
||||
"questionType": 2,
|
||||
"targetTag": "Bandage"
|
||||
},
|
||||
{
|
||||
"questionIndex": 5,
|
||||
"questionText": "请选择带子打结位置",
|
||||
"choices": ["确定"],
|
||||
"correctChoiceIndex": 0,
|
||||
"correctFeedback": "正确",
|
||||
"incorrectFeedback": "",
|
||||
"questionType": 1,
|
||||
"targetTag": "BandageKnot"
|
||||
},
|
||||
{
|
||||
"questionIndex": 6,
|
||||
"questionText": "请选择踝关节打结位置",
|
||||
"choices": ["足底", "足背"],
|
||||
"correctChoiceIndex": 1,
|
||||
"correctFeedback": "正确!",
|
||||
"incorrectFeedback": "应选择足背位置打结",
|
||||
"questionType": 0,
|
||||
"targetTag": ""
|
||||
}
|
||||
],
|
||||
"summaryNotes": "下肢损伤选择仰卧位;\n骨折固定前后要脱掉鞋袜并检查下肢末梢循环、运动、感觉;\n穿带子时应从健侧穿向伤侧;\n骨折固定时先固定伤口的近心端,后固定远心端,再由上而下进行固定;\n固定后尽可能抬高下肢。"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 460759f55f4d740eb98e141d10be6978
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"experimentName": "骨折固定(夹板固定)",
|
||||
"experimentId": "SplintFixation",
|
||||
"description": "运动伤害现场急救处理——夹板固定虚拟仿真实验",
|
||||
"fixationType": 1,
|
||||
"totalScore": 100,
|
||||
"passingScore": 60,
|
||||
"steps": [
|
||||
{
|
||||
"stepIndex": 0,
|
||||
"stepName": "环境评估",
|
||||
"tipText": "观察周围环境是否有危险,做好防护措施。",
|
||||
"dialogueText": "周围环境安全。我是救护志愿者,我可以帮助您吗?",
|
||||
"interactionType": 4,
|
||||
"targetTag": "",
|
||||
"targetName": "",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 1,
|
||||
"stepName": "伤情检查",
|
||||
"tipText": "请检查伤员受伤位置",
|
||||
"dialogueText": "伤员左大腿疑似骨折,无伤口。",
|
||||
"interactionType": 1,
|
||||
"targetTag": "InjuryLeg",
|
||||
"targetName": "InjuryLeg",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 2,
|
||||
"stepName": "脱鞋袜检查",
|
||||
"tipText": "请将伤员鞋袜脱掉并保存好,观察末端血液循环、运动及感觉",
|
||||
"dialogueText": "",
|
||||
"interactionType": 1,
|
||||
"targetTag": "Shoe",
|
||||
"targetName": "Shoe",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 3,
|
||||
"stepName": "加衬垫并用夹板固定",
|
||||
"tipText": "请在骨折肢体加衬垫,并用夹板固定",
|
||||
"dialogueText": "",
|
||||
"interactionType": 3,
|
||||
"targetTag": "Splint",
|
||||
"targetName": "Splint",
|
||||
"showVideo": true,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 4,
|
||||
"stepName": "用带子固定夹板",
|
||||
"tipText": "请用带子将夹板固定在腿上",
|
||||
"dialogueText": "",
|
||||
"interactionType": 3,
|
||||
"targetTag": "Bandage",
|
||||
"targetName": "Bandage",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
},
|
||||
{
|
||||
"stepIndex": 5,
|
||||
"stepName": "终末检查",
|
||||
"tipText": "包扎完毕请检查伤肢血液循环,运动及感觉。",
|
||||
"dialogueText": "伤员一切正常,包扎完毕。",
|
||||
"interactionType": 4,
|
||||
"targetTag": "",
|
||||
"targetName": "",
|
||||
"showVideo": false,
|
||||
"voiceClip": "",
|
||||
"requiredForCompletion": true
|
||||
}
|
||||
],
|
||||
"examQuestions": [
|
||||
{
|
||||
"questionIndex": 0,
|
||||
"questionText": "点击确认后,请按正确顺序进行环境评估与自我介绍",
|
||||
"choices": ["确定"],
|
||||
"correctChoiceIndex": 0,
|
||||
"correctFeedback": "正确",
|
||||
"incorrectFeedback": "",
|
||||
"questionType": 0,
|
||||
"targetTag": ""
|
||||
},
|
||||
{
|
||||
"questionIndex": 1,
|
||||
"questionText": "点击确认后,请按正确顺序检查伤情",
|
||||
"choices": ["确定"],
|
||||
"correctChoiceIndex": 0,
|
||||
"correctFeedback": "正确",
|
||||
"incorrectFeedback": "",
|
||||
"questionType": 0,
|
||||
"targetTag": ""
|
||||
},
|
||||
{
|
||||
"questionIndex": 2,
|
||||
"questionText": "请选择正确的固定方式",
|
||||
"choices": ["肢体固定", "夹板固定", "绷带包扎"],
|
||||
"correctChoiceIndex": 1,
|
||||
"correctFeedback": "正确!夹板固定适用于骨折固定。",
|
||||
"incorrectFeedback": "应选择夹板固定方式",
|
||||
"questionType": 0,
|
||||
"targetTag": ""
|
||||
},
|
||||
{
|
||||
"questionIndex": 3,
|
||||
"questionText": "请选择正确放置夹板的位置",
|
||||
"choices": ["确定"],
|
||||
"correctChoiceIndex": 0,
|
||||
"correctFeedback": "正确",
|
||||
"incorrectFeedback": "",
|
||||
"questionType": 1,
|
||||
"targetTag": "Splint"
|
||||
},
|
||||
{
|
||||
"questionIndex": 4,
|
||||
"questionText": "请选择正确的绑带固定顺序",
|
||||
"choices": ["先上后下", "先下后上"],
|
||||
"correctChoiceIndex": 0,
|
||||
"correctFeedback": "正确!应先固定近心端再固定远心端。",
|
||||
"incorrectFeedback": "应先固定近心端(上端),再固定远心端(下端)",
|
||||
"questionType": 0,
|
||||
"targetTag": ""
|
||||
}
|
||||
],
|
||||
"summaryNotes": "下肢损伤选择仰卧位;\n骨折固定前后要脱掉鞋袜并检查下肢末梢循环、运动、感觉;\n夹板固定时先在骨折肢体加衬垫;\n穿带子时应从健侧穿向伤侧;\n固定后尽可能抬高下肢。"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a7bcf7c9d0296430db1384005ca925e3
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a37b51f5c4beb4b4398199d197af7d37
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cffb0242a91904c5986f45e78b1820b3
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,407 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!29 &1
|
||||
OcclusionCullingSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_OcclusionBakeSettings:
|
||||
smallestOccluder: 5
|
||||
smallestHole: 0.25
|
||||
backfaceThreshold: 100
|
||||
m_SceneGUID: 00000000000000000000000000000000
|
||||
m_OcclusionCullingData: {fileID: 0}
|
||||
--- !u!104 &2
|
||||
RenderSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 9
|
||||
m_Fog: 0
|
||||
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||
m_FogMode: 3
|
||||
m_FogDensity: 0.01
|
||||
m_LinearFogStart: 0
|
||||
m_LinearFogEnd: 300
|
||||
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
|
||||
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
|
||||
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
|
||||
m_AmbientIntensity: 1
|
||||
m_AmbientMode: 0
|
||||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
|
||||
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_HaloStrength: 0.5
|
||||
m_FlareStrength: 1
|
||||
m_FlareFadeSpeed: 3
|
||||
m_HaloTexture: {fileID: 0}
|
||||
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_DefaultReflectionMode: 0
|
||||
m_DefaultReflectionResolution: 128
|
||||
m_ReflectionBounces: 1
|
||||
m_ReflectionIntensity: 1
|
||||
m_CustomReflection: {fileID: 0}
|
||||
m_Sun: {fileID: 0}
|
||||
m_IndirectSpecularColor: {r: 0.18028305, g: 0.22571313, b: 0.3069213, a: 1}
|
||||
m_UseRadianceAmbientProbe: 0
|
||||
--- !u!157 &3
|
||||
LightmapSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 12
|
||||
m_GIWorkflowMode: 1
|
||||
m_GISettings:
|
||||
serializedVersion: 2
|
||||
m_BounceScale: 1
|
||||
m_IndirectOutputScale: 1
|
||||
m_AlbedoBoost: 1
|
||||
m_EnvironmentLightingMode: 0
|
||||
m_EnableBakedLightmaps: 1
|
||||
m_EnableRealtimeLightmaps: 0
|
||||
m_LightmapEditorSettings:
|
||||
serializedVersion: 12
|
||||
m_Resolution: 2
|
||||
m_BakeResolution: 40
|
||||
m_AtlasSize: 1024
|
||||
m_AO: 0
|
||||
m_AOMaxDistance: 1
|
||||
m_CompAOExponent: 1
|
||||
m_CompAOExponentDirect: 0
|
||||
m_ExtractAmbientOcclusion: 0
|
||||
m_Padding: 2
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_LightmapsBakeMode: 1
|
||||
m_TextureCompression: 1
|
||||
m_FinalGather: 0
|
||||
m_FinalGatherFiltering: 1
|
||||
m_FinalGatherRayCount: 256
|
||||
m_ReflectionCompression: 2
|
||||
m_MixedBakeMode: 2
|
||||
m_BakeBackend: 1
|
||||
m_PVRSampling: 1
|
||||
m_PVRDirectSampleCount: 32
|
||||
m_PVRSampleCount: 512
|
||||
m_PVRBounces: 2
|
||||
m_PVREnvironmentSampleCount: 256
|
||||
m_PVREnvironmentReferencePointCount: 2048
|
||||
m_PVRFilteringMode: 1
|
||||
m_PVRDenoiserTypeDirect: 1
|
||||
m_PVRDenoiserTypeIndirect: 1
|
||||
m_PVRDenoiserTypeAO: 1
|
||||
m_PVRFilterTypeDirect: 0
|
||||
m_PVRFilterTypeIndirect: 0
|
||||
m_PVRFilterTypeAO: 0
|
||||
m_PVREnvironmentMIS: 1
|
||||
m_PVRCulling: 1
|
||||
m_PVRFilteringGaussRadiusDirect: 1
|
||||
m_PVRFilteringGaussRadiusIndirect: 5
|
||||
m_PVRFilteringGaussRadiusAO: 2
|
||||
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
|
||||
m_PVRFilteringAtrousPositionSigmaIndirect: 2
|
||||
m_PVRFilteringAtrousPositionSigmaAO: 1
|
||||
m_ExportTrainingData: 0
|
||||
m_TrainingDataDestination: TrainingData
|
||||
m_LightProbeSampleCountMultiplier: 4
|
||||
m_LightingDataAsset: {fileID: 0}
|
||||
m_LightingSettings: {fileID: 0}
|
||||
--- !u!196 &4
|
||||
NavMeshSettings:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_BuildSettings:
|
||||
serializedVersion: 2
|
||||
agentTypeID: 0
|
||||
agentRadius: 0.5
|
||||
agentHeight: 2
|
||||
agentSlope: 45
|
||||
agentClimb: 0.4
|
||||
ledgeDropHeight: 0
|
||||
maxJumpAcrossDistance: 0
|
||||
minRegionArea: 2
|
||||
manualCellSize: 0
|
||||
cellSize: 0.16666667
|
||||
manualTileSize: 0
|
||||
tileSize: 256
|
||||
accuratePlacement: 0
|
||||
maxJobWorkers: 0
|
||||
preserveTilesOutsideBounds: 0
|
||||
debug:
|
||||
m_Flags: 0
|
||||
m_NavMeshData: {fileID: 0}
|
||||
--- !u!1 &330585543
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 330585546}
|
||||
- component: {fileID: 330585545}
|
||||
- component: {fileID: 330585544}
|
||||
- component: {fileID: 330585547}
|
||||
m_Layer: 0
|
||||
m_Name: Main Camera
|
||||
m_TagString: MainCamera
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!81 &330585544
|
||||
AudioListener:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
m_Enabled: 1
|
||||
--- !u!20 &330585545
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
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_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_FocalLength: 50
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
near clip plane: 0.3
|
||||
far clip plane: 1000
|
||||
field of view: 60
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: -1
|
||||
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 &330585546
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 1, z: -10}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &330585547
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
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: 1
|
||||
m_Antialiasing: 0
|
||||
m_AntialiasingQuality: 2
|
||||
m_StopNaN: 0
|
||||
m_Dithering: 0
|
||||
m_ClearDepth: 1
|
||||
m_AllowXRRendering: 1
|
||||
m_RequiresDepthTexture: 0
|
||||
m_RequiresColorTexture: 0
|
||||
m_Version: 2
|
||||
--- !u!1 &410087039
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 410087041}
|
||||
- component: {fileID: 410087040}
|
||||
- component: {fileID: 410087042}
|
||||
m_Layer: 0
|
||||
m_Name: Directional Light
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!108 &410087040
|
||||
Light:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 410087039}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 10
|
||||
m_Type: 1
|
||||
m_Shape: 0
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_Intensity: 2
|
||||
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: 5000
|
||||
m_UseColorTemperature: 1
|
||||
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_UseBoundingSphereOverride: 0
|
||||
m_UseViewFrustumForShadowCasterCull: 1
|
||||
m_ShadowRadius: 0
|
||||
m_ShadowAngle: 0
|
||||
--- !u!4 &410087041
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 410087039}
|
||||
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_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
|
||||
--- !u!114 &410087042
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 410087039}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Version: 1
|
||||
m_UsePipelineSettings: 1
|
||||
m_AdditionalLightsShadowResolutionTier: 2
|
||||
m_LightLayerMask: 1
|
||||
m_CustomShadowLayers: 0
|
||||
m_ShadowLayerMask: 1
|
||||
m_LightCookieSize: {x: 1, y: 1}
|
||||
m_LightCookieOffset: {x: 0, y: 0}
|
||||
--- !u!1 &832575517
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 832575519}
|
||||
- component: {fileID: 832575518}
|
||||
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 &832575518
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 832575517}
|
||||
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: a6560a915ef98420e9faacc1c7438823, type: 2}
|
||||
--- !u!4 &832575519
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 832575517}
|
||||
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_RootOrder: 2
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4b8054ca510a246b2bf82ce19b92e5ca
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
@@ -0,0 +1,127 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e31ed9416930c484393d7e60f1ab94b6
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
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: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
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: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
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: WebGL
|
||||
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: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
@@ -0,0 +1,127 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b02a5babec5b04d878da3fd4e5cba9c9
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
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: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
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: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
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: WebGL
|
||||
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: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 7.8 KiB |
@@ -0,0 +1,127 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3ec68a628410446b0ba973297abc0c46
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
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: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
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: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
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: WebGL
|
||||
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: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
@@ -0,0 +1,127 @@
|
||||
fileFormatVersion: 2
|
||||
guid: aeae0dec279fb4db19f309dfb541ab10
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
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: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
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: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
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: WebGL
|
||||
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: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a74fee214fee248ca8bce545fe9ba60a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e185e7ef2b2bc41a3952d401ed28b894
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,3 @@
|
||||
using UnityEngine;
|
||||
/// <summary>Legacy — replaced by StepAnimationHandler.</summary>
|
||||
public class AnimationController : MonoBehaviour { }
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 05b8d5cbfd0e74474a937b3cc7ad120c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,87 @@
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 角色动画控制器:管理伤者和施救者的动画状态切换。
|
||||
/// 挂在角色根 GameObject 上,引用其 Animator 组件。
|
||||
/// </summary>
|
||||
public class CharacterAnimController : MonoBehaviour
|
||||
{
|
||||
public enum CharacterRole { Patient, Rescuer }
|
||||
public CharacterRole Role = CharacterRole.Patient;
|
||||
|
||||
[Header("Animator 引用")]
|
||||
[SerializeField] private Animator _animator;
|
||||
|
||||
private static readonly int ParamRun = Animator.StringToHash("IsRunning");
|
||||
private static readonly int ParamJump = Animator.StringToHash("Jump");
|
||||
private static readonly int ParamFall = Animator.StringToHash("Fall");
|
||||
private static readonly int ParamLying = Animator.StringToHash("IsLying");
|
||||
private static readonly int ParamCrouch = Animator.StringToHash("Crouch");
|
||||
private static readonly int ParamCheck = Animator.StringToHash("Check");
|
||||
private static readonly int ParamBandage = Animator.StringToHash("Bandage");
|
||||
private static readonly int ParamRemoveShoe = Animator.StringToHash("RemoveShoe");
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (_animator == null) _animator = GetComponent<Animator>();
|
||||
}
|
||||
|
||||
public void PlayRun()
|
||||
{
|
||||
if (_animator == null) return;
|
||||
_animator.SetBool(ParamRun, true);
|
||||
}
|
||||
|
||||
public void StopRun()
|
||||
{
|
||||
if (_animator == null) return;
|
||||
_animator.SetBool(ParamRun, false);
|
||||
}
|
||||
|
||||
public void TriggerJump()
|
||||
{
|
||||
_animator?.SetTrigger(ParamJump);
|
||||
}
|
||||
|
||||
public void TriggerFall()
|
||||
{
|
||||
_animator?.SetTrigger(ParamFall);
|
||||
_animator?.SetBool(ParamLying, true);
|
||||
}
|
||||
|
||||
public void SetLying(bool lying)
|
||||
{
|
||||
_animator?.SetBool(ParamLying, lying);
|
||||
}
|
||||
|
||||
public void PlayCrouch()
|
||||
{
|
||||
_animator?.SetBool(ParamCrouch, true);
|
||||
}
|
||||
|
||||
public void StopCrouch()
|
||||
{
|
||||
_animator?.SetBool(ParamCrouch, false);
|
||||
}
|
||||
|
||||
public void TriggerCheck()
|
||||
{
|
||||
_animator?.SetTrigger(ParamCheck);
|
||||
}
|
||||
|
||||
public void TriggerBandage()
|
||||
{
|
||||
_animator?.SetTrigger(ParamBandage);
|
||||
}
|
||||
|
||||
public void TriggerRemoveShoe()
|
||||
{
|
||||
_animator?.SetTrigger(ParamRemoveShoe);
|
||||
}
|
||||
|
||||
public void TriggerByName(string triggerName)
|
||||
{
|
||||
if (_animator == null || string.IsNullOrEmpty(triggerName)) return;
|
||||
_animator.SetTrigger(Animator.StringToHash(triggerName));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 23fb87b6a5b9544d3aed3b307715504c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,181 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
|
||||
/// <summary>
|
||||
/// 按步骤触发对应动画:开场动画、脱鞋、绑带、夹板放置等。
|
||||
/// 挂在场景中有动画关联物体的 GameObject 上。
|
||||
/// 由 ExperimentFlowCoordinator 绑定到 StepManager.OnStepChanged。
|
||||
/// </summary>
|
||||
public class StepAnimationHandler : MonoBehaviour
|
||||
{
|
||||
[Header("角色引用")]
|
||||
[SerializeField] private CharacterAnimController _patient;
|
||||
[SerializeField] private CharacterAnimController _rescuer;
|
||||
|
||||
[Header("道具引用")]
|
||||
[SerializeField] private GameObject _shoeLeft; // 伤者左脚鞋
|
||||
[SerializeField] private GameObject _shoeRight; // 伤者右脚鞋
|
||||
[SerializeField] private GameObject[] _bandages; // 绑带物件列表
|
||||
[SerializeField] private GameObject[] _splints; // 夹板物件列表
|
||||
[SerializeField] private GameObject _padding; // 衬垫
|
||||
|
||||
[Header("夹板固定专用道具")]
|
||||
[SerializeField] private GameObject _splintLeft;
|
||||
[SerializeField] private GameObject _splintRight;
|
||||
|
||||
[Header("伤口高亮")]
|
||||
[SerializeField] private GameObject _woundHighlight;
|
||||
|
||||
[Header("动画时长")]
|
||||
[SerializeField] private float _shoeRemoveDuration = 1.5f;
|
||||
[SerializeField] private float _bandageAppearDuration = 0.5f;
|
||||
|
||||
/// <summary>由 StepManager.OnStepChanged 调用</summary>
|
||||
public void PlayStepAnimation(int stepIndex)
|
||||
{
|
||||
var sm = FindObjectOfType<StepManager>();
|
||||
if (sm == null) return;
|
||||
|
||||
var step = sm.GetCurrentStep();
|
||||
if (step == null) return;
|
||||
|
||||
StopAllCoroutines();
|
||||
|
||||
// 根据步骤名称匹配动画
|
||||
switch (step.StepName)
|
||||
{
|
||||
case "OpeningScene":
|
||||
StartCoroutine(PlayOpeningScene());
|
||||
break;
|
||||
case "RemoveShoes":
|
||||
StartCoroutine(PlayRemoveShoes());
|
||||
break;
|
||||
case "PlaceBandage":
|
||||
StartCoroutine(PlayPlaceBandage());
|
||||
break;
|
||||
case "LimbFixation":
|
||||
StartCoroutine(PlayLimbFixation());
|
||||
break;
|
||||
case "SplintFixation":
|
||||
StartCoroutine(PlaySplintFixation());
|
||||
break;
|
||||
case "AnkleFixation":
|
||||
StartCoroutine(PlayAnkleFixation());
|
||||
break;
|
||||
case "FinalCheck":
|
||||
break;
|
||||
default:
|
||||
Debug.Log($"StepAnimationHandler: 步骤 {step.StepName} 无专属动画");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#region 动画协程
|
||||
|
||||
private IEnumerator PlayOpeningScene()
|
||||
{
|
||||
// 伤者跑步 → 跳高 → 摔倒
|
||||
_patient?.PlayRun();
|
||||
yield return new WaitForSeconds(4f);
|
||||
_patient?.TriggerJump();
|
||||
yield return new WaitForSeconds(1f);
|
||||
_patient?.TriggerFall();
|
||||
yield return new WaitForSeconds(1.5f);
|
||||
_patient?.StopRun();
|
||||
}
|
||||
|
||||
private IEnumerator PlayRemoveShoes()
|
||||
{
|
||||
// 鞋子弹开/移出
|
||||
if (_shoeLeft != null)
|
||||
{
|
||||
Vector3 target = _shoeLeft.transform.position + Vector3.right * 0.5f + Vector3.up * 0.2f;
|
||||
yield return StartCoroutine(MoveToPosition(_shoeLeft, target, _shoeRemoveDuration));
|
||||
_shoeLeft.SetActive(false);
|
||||
}
|
||||
if (_shoeRight != null)
|
||||
{
|
||||
Vector3 target = _shoeRight.transform.position + Vector3.right * 0.5f + Vector3.up * 0.2f;
|
||||
yield return StartCoroutine(MoveToPosition(_shoeRight, target, _shoeRemoveDuration));
|
||||
_shoeRight.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerator PlayPlaceBandage()
|
||||
{
|
||||
// 显示绑带
|
||||
foreach (var b in _bandages)
|
||||
{
|
||||
if (b != null) b.SetActive(true);
|
||||
}
|
||||
yield return null;
|
||||
}
|
||||
|
||||
private IEnumerator PlayLimbFixation()
|
||||
{
|
||||
// 显示衬垫 + 激活绑带
|
||||
if (_padding != null) _padding.SetActive(true);
|
||||
yield return new WaitForSeconds(0.5f);
|
||||
|
||||
// 依次显示绑带
|
||||
for (int i = 0; i < _bandages.Length; i++)
|
||||
{
|
||||
if (_bandages[i] != null)
|
||||
{
|
||||
_bandages[i].SetActive(true);
|
||||
yield return new WaitForSeconds(_bandageAppearDuration);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerator PlaySplintFixation()
|
||||
{
|
||||
// 显示夹板
|
||||
if (_splintLeft != null) _splintLeft.SetActive(true);
|
||||
if (_splintRight != null) _splintRight.SetActive(true);
|
||||
yield return new WaitForSeconds(0.5f);
|
||||
|
||||
foreach (var s in _splints)
|
||||
{
|
||||
if (s != null) s.SetActive(true);
|
||||
yield return new WaitForSeconds(_bandageAppearDuration);
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerator PlayAnkleFixation()
|
||||
{
|
||||
// 8 字绑带动画 - 激活脚踝处绑带
|
||||
if (_bandages.Length > 0 && _bandages[_bandages.Length - 1] != null)
|
||||
{
|
||||
_bandages[_bandages.Length - 1].SetActive(true);
|
||||
}
|
||||
yield return null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 工具方法
|
||||
|
||||
private IEnumerator MoveToPosition(GameObject obj, Vector3 target, float duration)
|
||||
{
|
||||
if (obj == null) yield break;
|
||||
|
||||
Vector3 start = obj.transform.position;
|
||||
float elapsed = 0f;
|
||||
while (elapsed < duration)
|
||||
{
|
||||
elapsed += Time.deltaTime;
|
||||
obj.transform.position = Vector3.Lerp(start, target, elapsed / duration);
|
||||
yield return null;
|
||||
}
|
||||
obj.transform.position = target;
|
||||
}
|
||||
|
||||
/// <summary>显示伤口高亮</summary>
|
||||
public void ShowWoundHighlight(bool show)
|
||||
{
|
||||
if (_woundHighlight != null) _woundHighlight.SetActive(show);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bbe25e570b15b41d98e77259d82a8f1d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0501e3f1ed8cc4ec3ba149c9cd7b20af
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,92 @@
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 音频管理器:管理背景音乐和步骤语音解说。
|
||||
/// 挂在场景 GameObject 上,通过 AudioSource 组件播放。
|
||||
/// </summary>
|
||||
[RequireComponent(typeof(AudioSource))]
|
||||
public class AudioManager : MonoBehaviour
|
||||
{
|
||||
public static AudioManager Instance { get; private set; }
|
||||
|
||||
[Header("音频源")]
|
||||
[SerializeField] private AudioSource _bgmSource;
|
||||
[SerializeField] private AudioSource _voiceSource;
|
||||
|
||||
[Header("背景音乐")]
|
||||
public AudioClip BGMClip;
|
||||
[Range(0f, 1f)] public float BGMVolume = 0.3f;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance != null) { Destroy(gameObject); return; }
|
||||
Instance = this;
|
||||
DontDestroyOnLoad(gameObject);
|
||||
|
||||
if (_bgmSource == null) _bgmSource = GetComponent<AudioSource>();
|
||||
if (_voiceSource == null)
|
||||
{
|
||||
_voiceSource = gameObject.AddComponent<AudioSource>();
|
||||
_voiceSource.playOnAwake = false;
|
||||
_voiceSource.loop = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
PlayBGM();
|
||||
}
|
||||
|
||||
public void PlayBGM()
|
||||
{
|
||||
if (_bgmSource == null || BGMClip == null) return;
|
||||
_bgmSource.clip = BGMClip;
|
||||
_bgmSource.volume = BGMVolume;
|
||||
_bgmSource.loop = true;
|
||||
_bgmSource.Play();
|
||||
}
|
||||
|
||||
public void StopBGM()
|
||||
{
|
||||
if (_bgmSource != null) _bgmSource.Stop();
|
||||
}
|
||||
|
||||
/// <summary>播放一步语音解说,自动打断前一条</summary>
|
||||
public void PlayVoice(AudioClip clip, float volume = 1f)
|
||||
{
|
||||
if (_voiceSource == null || clip == null) return;
|
||||
_voiceSource.Stop();
|
||||
_voiceSource.clip = clip;
|
||||
_voiceSource.volume = volume;
|
||||
_voiceSource.Play();
|
||||
}
|
||||
|
||||
/// <summary>停止语音</summary>
|
||||
public void StopVoice()
|
||||
{
|
||||
if (_voiceSource != null) _voiceSource.Stop();
|
||||
}
|
||||
|
||||
/// <summary>按文件名从 StreamingAssets 加载并播放语音</summary>
|
||||
public void PlayVoiceFromFile(string fileName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(fileName)) return;
|
||||
StartCoroutine(LoadAndPlayVoice(fileName));
|
||||
}
|
||||
|
||||
private System.Collections.IEnumerator LoadAndPlayVoice(string fileName)
|
||||
{
|
||||
string path = System.IO.Path.Combine(Application.streamingAssetsPath, "Voice", fileName);
|
||||
using var www = UnityEngine.Networking.UnityWebRequestMultimedia.GetAudioClip(path, AudioType.WAV);
|
||||
yield return www.SendWebRequest();
|
||||
if (www.result == UnityEngine.Networking.UnityWebRequest.Result.Success)
|
||||
{
|
||||
var clip = UnityEngine.Networking.DownloadHandlerAudioClip.GetContent(www);
|
||||
PlayVoice(clip);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"AudioManager: 加载语音失败 {path}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 55eccc8daa89f482193b0fcb1aa0f2bc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4d8a4c89bbd0d457494bb8c6130ff34b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,3 @@
|
||||
using UnityEngine;
|
||||
/// <summary>Legacy — replaced by ExperimentConfig ScriptableObject.</summary>
|
||||
public class ConfigLoader : MonoBehaviour { }
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bda8b3bd9c4a14051b7821859e6095f6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,3 @@
|
||||
using UnityEngine;
|
||||
/// <summary>Legacy — replaced by ExperimentFlowCoordinator.</summary>
|
||||
public class ExperimentController : MonoBehaviour { }
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5d499f2451702432ebbf25bfccbe1fa9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,100 @@
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 实验场景的总协调器:挂载在 Experiment 场景的根 GameObject 上,
|
||||
/// 负责将 StepManager / InteractionSystem / UIManager 串联在一起。
|
||||
/// 考核模式以 proportion(0~1)计分。
|
||||
/// </summary>
|
||||
public class ExperimentFlowCoordinator : MonoBehaviour
|
||||
{
|
||||
[Header("核心组件引用")]
|
||||
[SerializeField] private StepManager _stepManager;
|
||||
[SerializeField] private InteractionSystem _interactionSystem;
|
||||
[SerializeField] private UIManager _uiManager;
|
||||
[SerializeField] private StepAnimationHandler _animationHandler;
|
||||
[SerializeField] private AudioManager _audioManager;
|
||||
|
||||
[Header("配置")]
|
||||
[SerializeField] private ExperimentConfig _defaultConfig;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
if (_interactionSystem != null && _stepManager != null)
|
||||
{
|
||||
_interactionSystem.OnObjectClicked.AddListener(OnObjectClicked);
|
||||
_interactionSystem.OnAnywhereClicked.AddListener(OnAnywhereClicked);
|
||||
}
|
||||
|
||||
if (_stepManager != null && _animationHandler != null)
|
||||
{
|
||||
_stepManager.OnStepChanged.AddListener(_animationHandler.PlayStepAnimation);
|
||||
}
|
||||
|
||||
if (_defaultConfig != null)
|
||||
{
|
||||
_stepManager.Config = _defaultConfig;
|
||||
}
|
||||
|
||||
_stepManager.InitializeFromGameManager();
|
||||
}
|
||||
|
||||
#region 交互回调
|
||||
|
||||
private void OnObjectClicked(string tag)
|
||||
{
|
||||
var step = _stepManager.GetCurrentStep();
|
||||
if (step == null) return;
|
||||
|
||||
switch (step.CompleteType)
|
||||
{
|
||||
case StepCompleteType.ClickObject:
|
||||
if (tag == step.TargetTag)
|
||||
{
|
||||
Debug.Log($"ExperimentFlowCoordinator: 正确点击了 {tag}");
|
||||
_stepManager.OnStepInteractionComplete(1f);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log($"ExperimentFlowCoordinator: 点击了 {tag},需要的是 {step.TargetTag}");
|
||||
if (_stepManager.Mode == ExperimentMode.Exam)
|
||||
_stepManager.OnStepInteractionComplete(0f, "点击位置不正确");
|
||||
}
|
||||
break;
|
||||
|
||||
case StepCompleteType.SequenceClick:
|
||||
// 按子项命中比例计分
|
||||
bool isComplete;
|
||||
bool isCorrect = _interactionSystem.TrySequenceClick(tag, out isComplete);
|
||||
if (isComplete)
|
||||
{
|
||||
// 取当前序列已命中数 / 总子项数
|
||||
int hit = _interactionSystem.GetSequenceHitCount();
|
||||
int total = step.ClickSequenceTags?.Length ?? step.SubStepCount;
|
||||
float proportion = total > 0 ? (float)hit / total : 1f;
|
||||
string fb = proportion < 1f ? $"顺序部分正确({hit}/{total} 步正确)" : "";
|
||||
_stepManager.OnStepInteractionComplete(proportion, fb);
|
||||
}
|
||||
else if (!isCorrect)
|
||||
{
|
||||
_stepManager.OnStepInteractionComplete(0f, "点击顺序不正确");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnAnywhereClicked()
|
||||
{
|
||||
var step = _stepManager.GetCurrentStep();
|
||||
if (step == null) return;
|
||||
|
||||
if (step.CompleteType == StepCompleteType.ClickAnywhere)
|
||||
{
|
||||
_stepManager.OnStepInteractionComplete(1f);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e3dd6cb15ae1a4f0e92e2826f64ee6cf
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,38 @@
|
||||
// ============================================================
|
||||
// 实验类型、模式、固定方式的枚举定义
|
||||
// ============================================================
|
||||
|
||||
/// <summary>五大急救实验类型</summary>
|
||||
public enum ExperimentType
|
||||
{
|
||||
CPR, // 心肺复苏
|
||||
FractureFixation, // 骨折固定
|
||||
SprainBandaging, // 扭伤包扎
|
||||
BleedingBandaging, // 出血包扎
|
||||
CasualtyTransport // 伤员搬运
|
||||
}
|
||||
|
||||
/// <summary>运行模式</summary>
|
||||
public enum ExperimentMode
|
||||
{
|
||||
Learn, // 学习模式
|
||||
Exam // 考核模式
|
||||
}
|
||||
|
||||
/// <summary>骨折固定方式(仅骨折固定实验使用)</summary>
|
||||
public enum FixationMethod
|
||||
{
|
||||
LimbFixation, // 肢体固定
|
||||
SplintFixation // 夹板固定
|
||||
}
|
||||
|
||||
/// <summary>单个步骤完成的判定类型</summary>
|
||||
public enum StepCompleteType
|
||||
{
|
||||
None, // 无需交互,自动进入下一步
|
||||
ClickObject, // 点击指定 3D 物体
|
||||
DragToTarget, // 拖拽物体到目标位置
|
||||
ClickAnywhere, // 点击任意空白处
|
||||
MultipleChoice, // 选择题(考核模式)
|
||||
SequenceClick // 按顺序点击多个物体(考核模式)
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 13ab85c5e00ee4765918090eeac6de36
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,75 @@
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 全局单例管理器:持有当前实验的类型、模式、固定方式与加权分数。
|
||||
/// 挂在场景第一个 GameObject 上,设置 DontDestroyOnLoad。
|
||||
/// </summary>
|
||||
public class GameManager : MonoBehaviour
|
||||
{
|
||||
public static GameManager Instance { get; private set; }
|
||||
|
||||
[Header("当前实验设置(运行时赋值)")]
|
||||
public ExperimentType CurrentExperimentType = ExperimentType.FractureFixation;
|
||||
public ExperimentMode CurrentMode = ExperimentMode.Learn;
|
||||
public FixationMethod CurrentFixationMethod = FixationMethod.LimbFixation;
|
||||
|
||||
[Header("加权评分")]
|
||||
public float TotalWeightedScore; // 实际得分(加权累加)
|
||||
public float MaxWeightedScore = 100f; // 总分
|
||||
|
||||
[Header("考核记录")]
|
||||
public float[] StepScores; // 每步实际得分(含权重)
|
||||
public float[] StepMaxScores; // 每步满分(权重值)
|
||||
public string[] StepFeedback; // 每题错误反馈文本
|
||||
public bool[] StepCorrect; // 每题是否有任何得分
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance != null && Instance != this)
|
||||
{
|
||||
Destroy(gameObject);
|
||||
return;
|
||||
}
|
||||
Instance = this;
|
||||
DontDestroyOnLoad(gameObject);
|
||||
}
|
||||
|
||||
/// <summary>初始化考核记录数组</summary>
|
||||
public void InitExamRecord(int stepCount)
|
||||
{
|
||||
StepScores = new float[stepCount];
|
||||
StepMaxScores = new float[stepCount];
|
||||
StepFeedback = new string[stepCount];
|
||||
StepCorrect = new bool[stepCount];
|
||||
TotalWeightedScore = 0f;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 记录一个考核步骤的结果。
|
||||
/// proportion 为 0~1,表示得分比例(SequenceClick 类型部分正确时用到)。
|
||||
/// </summary>
|
||||
public void RecordExamResult(int stepIndex, float maxScore, float proportion, string feedback)
|
||||
{
|
||||
if (StepScores == null || stepIndex >= StepScores.Length) return;
|
||||
|
||||
StepMaxScores[stepIndex] = maxScore;
|
||||
float earned = maxScore * Mathf.Clamp01(proportion);
|
||||
StepScores[stepIndex] = earned;
|
||||
StepFeedback[stepIndex] = feedback;
|
||||
StepCorrect[stepIndex] = proportion > 0f;
|
||||
TotalWeightedScore += earned;
|
||||
}
|
||||
|
||||
/// <summary>按百分比返回考核分数</summary>
|
||||
public float GetExamPercentage()
|
||||
{
|
||||
if (MaxWeightedScore <= 0f) return 0f;
|
||||
return TotalWeightedScore / MaxWeightedScore * 100f;
|
||||
}
|
||||
|
||||
/// <summary>获取总分(整数)</summary>
|
||||
public int GetExamScoreRounded()
|
||||
{
|
||||
return Mathf.RoundToInt(TotalWeightedScore);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c57598038a100447ab7f5396d0f0e49c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,172 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
|
||||
/// <summary>
|
||||
/// 实验流程状态机——整个项目的核心控制器。
|
||||
/// 负责步骤推进、模式切换、UI 更新、加权考核判分调度。
|
||||
/// 挂在一个持久化的 GameObject 上。
|
||||
/// </summary>
|
||||
public class StepManager : MonoBehaviour
|
||||
{
|
||||
[Header("配置")]
|
||||
public ExperimentConfig Config;
|
||||
|
||||
[Header("事件(拖入场景对象或通过代码绑定)")]
|
||||
public UnityEvent<int> OnStepChanged; // 步骤切换时触发,传新步骤索引
|
||||
public UnityEvent<string> OnTipChanged; // Tip 文案更新
|
||||
public UnityEvent<string> OnDialogueChanged; // 角色对话更新
|
||||
public UnityEvent<StepData> OnExamPopup; // 考核弹窗触发,传当前 StepData
|
||||
public UnityEvent<string> OnDetailedContent; // 详细操作说明更新(甲方补充)
|
||||
public UnityEvent OnExperimentComplete; // 实验全部完成
|
||||
public UnityEvent<string, bool> OnVideoToggle; // 画中画视频开关(文件名, 是否激活)
|
||||
public UnityEvent<bool> OnModeUIUpdate; // 通知 UI 刷新模式按钮状态
|
||||
|
||||
// 私有状态
|
||||
private StepData[] _activeSteps;
|
||||
private int _currentStepIndex = -1;
|
||||
private ExperimentMode _mode;
|
||||
private FixationMethod _fixation;
|
||||
|
||||
public int CurrentStepIndex => _currentStepIndex;
|
||||
public int TotalSteps => _activeSteps != null ? _activeSteps.Length : 0;
|
||||
public ExperimentMode Mode => _mode;
|
||||
public FixationMethod Fixation => _fixation;
|
||||
|
||||
/// <summary>用 GameManager 的当前设置初始化实验流程</summary>
|
||||
public void InitializeFromGameManager()
|
||||
{
|
||||
var gm = GameManager.Instance;
|
||||
if (gm == null) { Debug.LogError("StepManager: GameManager.Instance is null!"); return; }
|
||||
Initialize(gm.CurrentExperimentType, gm.CurrentMode, gm.CurrentFixationMethod);
|
||||
}
|
||||
|
||||
/// <summary>显式指定参数初始化</summary>
|
||||
public void Initialize(ExperimentType type, ExperimentMode mode, FixationMethod fixation)
|
||||
{
|
||||
_mode = mode;
|
||||
_fixation = fixation;
|
||||
|
||||
Config = Resources.Load<ExperimentConfig>($"Configs/{type}Config");
|
||||
if (Config == null)
|
||||
{
|
||||
Debug.LogError($"StepManager: 找不到 ExperimentConfig for {type},请在 Resources/Configs/ 下创建");
|
||||
return;
|
||||
}
|
||||
|
||||
_activeSteps = Config.GetStepsFor(mode, fixation);
|
||||
if (_activeSteps == null || _activeSteps.Length == 0)
|
||||
{
|
||||
Debug.LogError($"StepManager: 实验 {type} 模式 {mode} 固定方式 {fixation} 无步骤数据!");
|
||||
return;
|
||||
}
|
||||
|
||||
_currentStepIndex = -1;
|
||||
|
||||
if (mode == ExperimentMode.Exam)
|
||||
GameManager.Instance.InitExamRecord(_activeSteps.Length);
|
||||
|
||||
OnModeUIUpdate?.Invoke(mode == ExperimentMode.Exam);
|
||||
GoToStep(0);
|
||||
}
|
||||
|
||||
/// <summary>跳转到指定步骤(含边界检查)</summary>
|
||||
public void GoToStep(int index)
|
||||
{
|
||||
if (_activeSteps == null) return;
|
||||
index = Mathf.Clamp(index, 0, _activeSteps.Length - 1);
|
||||
if (index == _currentStepIndex) return;
|
||||
|
||||
_currentStepIndex = index;
|
||||
var step = _activeSteps[index];
|
||||
|
||||
if (_mode == ExperimentMode.Learn)
|
||||
{
|
||||
OnTipChanged?.Invoke(step.TipText);
|
||||
OnDialogueChanged?.Invoke(step.DialogueText);
|
||||
OnDetailedContent?.Invoke(step.DetailedContent);
|
||||
if (step.ShowPipVideo)
|
||||
OnVideoToggle?.Invoke(step.VideoFileName, true);
|
||||
else
|
||||
OnVideoToggle?.Invoke(null, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
OnTipChanged?.Invoke("");
|
||||
OnDialogueChanged?.Invoke("");
|
||||
OnDetailedContent?.Invoke("");
|
||||
OnVideoToggle?.Invoke(null, false);
|
||||
|
||||
if (!string.IsNullOrEmpty(step.ExamQuestionText))
|
||||
OnExamPopup?.Invoke(step);
|
||||
}
|
||||
|
||||
OnStepChanged?.Invoke(_currentStepIndex);
|
||||
}
|
||||
|
||||
/// <summary>下一步</summary>
|
||||
public void NextStep()
|
||||
{
|
||||
if (_activeSteps == null) return;
|
||||
if (_currentStepIndex >= _activeSteps.Length - 1)
|
||||
{
|
||||
CompleteExperiment();
|
||||
return;
|
||||
}
|
||||
GoToStep(_currentStepIndex + 1);
|
||||
}
|
||||
|
||||
/// <summary>上一步</summary>
|
||||
public void PreviousStep()
|
||||
{
|
||||
if (_activeSteps == null || _currentStepIndex <= 0) return;
|
||||
GoToStep(_currentStepIndex - 1);
|
||||
}
|
||||
|
||||
/// <summary>获取当前步骤数据(只读)</summary>
|
||||
public StepData GetCurrentStep()
|
||||
{
|
||||
if (_activeSteps == null || _currentStepIndex < 0 || _currentStepIndex >= _activeSteps.Length)
|
||||
return null;
|
||||
return _activeSteps[_currentStepIndex];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 当前步骤互动完成后的回调。
|
||||
/// proportion: 得分比例 0~1(SequenceClick 按子项命中比例,其余全对=1,全错=0)。
|
||||
/// </summary>
|
||||
public void OnStepInteractionComplete(float proportion = 1f, string feedback = "")
|
||||
{
|
||||
var step = GetCurrentStep();
|
||||
if (step == null) return;
|
||||
|
||||
if (_mode == ExperimentMode.Exam)
|
||||
{
|
||||
string fb = string.IsNullOrEmpty(feedback) ? step.ErrorFeedback : feedback;
|
||||
GameManager.Instance.RecordExamResult(_currentStepIndex, step.ScoreWeight, proportion, fb);
|
||||
}
|
||||
|
||||
if (_mode == ExperimentMode.Learn)
|
||||
NextStep();
|
||||
}
|
||||
|
||||
/// <summary>实验完成</summary>
|
||||
private void CompleteExperiment()
|
||||
{
|
||||
Debug.Log("StepManager: 实验流程结束");
|
||||
OnExperimentComplete?.Invoke();
|
||||
}
|
||||
|
||||
/// <summary>切换模式(学习 ↔ 考核),从头开始</summary>
|
||||
public void SwitchMode(ExperimentMode newMode)
|
||||
{
|
||||
GameManager.Instance.CurrentMode = newMode;
|
||||
Initialize(GameManager.Instance.CurrentExperimentType, newMode, GameManager.Instance.CurrentFixationMethod);
|
||||
}
|
||||
|
||||
/// <summary>切换固定方式,从头开始</summary>
|
||||
public void SwitchFixation(FixationMethod newFixation)
|
||||
{
|
||||
GameManager.Instance.CurrentFixationMethod = newFixation;
|
||||
Initialize(GameManager.Instance.CurrentExperimentType, GameManager.Instance.CurrentMode, newFixation);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a2535da3ddf9046e686f9b0d2ce5f569
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 49013f1e509fe47b18f6e8480e546996
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,34 @@
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// Defines an exam question with multiple choices.
|
||||
/// </summary>
|
||||
[CreateAssetMenu(fileName = "ExamQuestion", menuName = "VFS/Exam Question")]
|
||||
public class ExamQuestionData : ScriptableObject
|
||||
{
|
||||
[Header("Question Info")]
|
||||
public int questionIndex;
|
||||
[TextArea(2, 4)]
|
||||
public string questionText;
|
||||
|
||||
[Header("Choices")]
|
||||
public string[] choices;
|
||||
public int correctChoiceIndex;
|
||||
|
||||
[Header("Feedback")]
|
||||
[TextArea(2, 4)]
|
||||
public string correctFeedback;
|
||||
[TextArea(2, 4)]
|
||||
public string incorrectFeedback;
|
||||
|
||||
[Header("Interaction")]
|
||||
public QuestionType questionType;
|
||||
public string targetTag;
|
||||
|
||||
public enum QuestionType
|
||||
{
|
||||
MultipleChoice,
|
||||
ClickTarget,
|
||||
SequenceOrder
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1ac09a60490764c18ba4d4b5616370e8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,38 @@
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 单个实验类型的完整配置:包含学习模式与考核模式的所有步骤。
|
||||
/// 在 Unity Editor 中为每种实验类型各创建一份 Asset。
|
||||
/// </summary>
|
||||
[CreateAssetMenu(fileName = "ExperimentConfig", menuName = "VFS/Experiment Config")]
|
||||
public class ExperimentConfig : ScriptableObject
|
||||
{
|
||||
[Header("实验标识")]
|
||||
public ExperimentType Type;
|
||||
[Header("实验名称")]
|
||||
public string DisplayName;
|
||||
[Header("骨折固定专属 - 固定方式对应的步骤覆盖")]
|
||||
public FixationMethod DefaultFixationMethod = FixationMethod.LimbFixation;
|
||||
[Header("学习模式步骤列表(肢体固定)")]
|
||||
public StepData[] LearnStepsLimb;
|
||||
[Header("学习模式步骤列表(夹板固定)")]
|
||||
public StepData[] LearnStepsSplint;
|
||||
[Header("考核模式步骤列表(肢体固定)")]
|
||||
public StepData[] ExamStepsLimb;
|
||||
[Header("考核模式步骤列表(夹板固定)")]
|
||||
public StepData[] ExamStepsSplint;
|
||||
|
||||
public StepData[] GetStepsFor(ExperimentMode mode, FixationMethod fixation)
|
||||
{
|
||||
if (mode == ExperimentMode.Learn)
|
||||
return fixation == FixationMethod.SplintFixation ? LearnStepsSplint : LearnStepsLimb;
|
||||
else
|
||||
return fixation == FixationMethod.SplintFixation ? ExamStepsSplint : ExamStepsLimb;
|
||||
}
|
||||
|
||||
public int StepCount(ExperimentMode mode, FixationMethod fixation)
|
||||
{
|
||||
var steps = GetStepsFor(mode, fixation);
|
||||
return steps != null ? steps.Length : 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 24d3a8cba581943e1a2b2c167c7dd259
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,63 @@
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 单个实验步骤的数据配置(ScriptableObject)。
|
||||
/// 在 Unity Editor 中为每个实验创建一份 StepData 列表。
|
||||
/// </summary>
|
||||
[CreateAssetMenu(fileName = "StepData", menuName = "VFS/Step Data")]
|
||||
public class StepData : ScriptableObject
|
||||
{
|
||||
[Header("=== 评分 ===")]
|
||||
[Tooltip("本步骤满分(考核模式下使用,总分 100 分)")]
|
||||
[Range(0f, 100f)]
|
||||
public float ScoreWeight = 10f;
|
||||
|
||||
[Tooltip("本步骤的子项数量(如伤情检查有 5 个子项,用于 SequenceClick 按比例计分)")]
|
||||
public int SubStepCount = 1;
|
||||
|
||||
[Header("基础信息")]
|
||||
[Tooltip("步骤序号,从 0 开始")]
|
||||
public int StepIndex;
|
||||
|
||||
[Tooltip("步骤名称(内部标识)")]
|
||||
public string StepName;
|
||||
|
||||
[Header("学习模式文案")]
|
||||
[TextArea(2, 4)]
|
||||
public string TipText; // 顶部 Tip 提示框文案
|
||||
|
||||
[TextArea(2, 4)]
|
||||
public string DialogueText; // 角色对话气泡文案
|
||||
|
||||
[Header("学习模式 - 详细操作说明(甲方补充内容)")]
|
||||
[TextArea(3, 8)]
|
||||
public string DetailedContent; // 伤情检查/夹板固定等详细操作须知
|
||||
|
||||
[Header("考核模式文案")]
|
||||
[TextArea(2, 4)]
|
||||
public string ExamQuestionText; // 考核弹窗题目文案
|
||||
|
||||
[Header("考核选项")]
|
||||
public string[] ExamOptions; // 选择题选项(如 {"5cm", "10cm", "20cm"})
|
||||
public int CorrectOptionIndex; // 正确选项的索引(-1 表示非选择题)
|
||||
public string ErrorFeedback; // 答错时的反馈文案
|
||||
|
||||
[Header("交互配置")]
|
||||
public StepCompleteType CompleteType = StepCompleteType.ClickObject;
|
||||
|
||||
[Tooltip("交互目标的 Tag(如 InjuryLeg, Shoe, Bandage)")]
|
||||
public string TargetTag;
|
||||
|
||||
[Tooltip("考核模式点击顺序(SequenceClick 类型时使用)")]
|
||||
public string[] ClickSequenceTags;
|
||||
|
||||
[Header("额外配置")]
|
||||
[Tooltip("是否为夹板固定专属步骤")]
|
||||
public bool IsSplintOnly;
|
||||
|
||||
[Tooltip("是否需要播放画中画视频")]
|
||||
public bool ShowPipVideo;
|
||||
|
||||
[Tooltip("画中画视频文件名(StreamingAssets 下)")]
|
||||
public string VideoFileName;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dac314898f2b743efa29d166b0ed2980
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: aa42089b59739481481ee9e714b88438
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,54 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
|
||||
/// <summary>
|
||||
/// 挂载在可拖拽的 3D 物体上(如绷带、夹板)。
|
||||
/// 配合 InteractionSystem 使用。
|
||||
/// </summary>
|
||||
public class DraggableObject : MonoBehaviour
|
||||
{
|
||||
[Header("拖拽状态")]
|
||||
public bool IsDraggable = true;
|
||||
|
||||
[Header("吸附目标")]
|
||||
public Transform SnapTarget;
|
||||
|
||||
[Header("事件")]
|
||||
public UnityEvent OnDragStartEvent;
|
||||
public UnityEvent OnDragEndEvent;
|
||||
public UnityEvent OnSnappedEvent; // 吸附成功
|
||||
|
||||
private Vector3 _originalPosition;
|
||||
private Quaternion _originalRotation;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
_originalPosition = transform.position;
|
||||
_originalRotation = transform.rotation;
|
||||
}
|
||||
|
||||
public void OnDragStart()
|
||||
{
|
||||
OnDragStartEvent?.Invoke();
|
||||
}
|
||||
|
||||
public void OnDragEnd()
|
||||
{
|
||||
OnDragEndEvent?.Invoke();
|
||||
}
|
||||
|
||||
public void OnSnapped()
|
||||
{
|
||||
Debug.Log($"DraggableObject: {name} 已吸附到目标");
|
||||
OnSnappedEvent?.Invoke();
|
||||
IsDraggable = false; // 吸附后不可再拖动
|
||||
}
|
||||
|
||||
/// <summary>重置到初始位置</summary>
|
||||
public void ResetPosition()
|
||||
{
|
||||
transform.position = _originalPosition;
|
||||
transform.rotation = _originalRotation;
|
||||
IsDraggable = true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbf0e86605f7b485f8ff25c5810d30c0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,83 @@
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 物体高亮效果:鼠标悬停时切换 Emission 或轮廓材质。
|
||||
/// 挂在可交互的 3D 物体上。
|
||||
/// </summary>
|
||||
public class HighlightEffect : MonoBehaviour
|
||||
{
|
||||
[Header("高亮设置")]
|
||||
[SerializeField] private Color _highlightColor = Color.yellow;
|
||||
[SerializeField] private float _highlightIntensity = 0.5f;
|
||||
|
||||
[Header("可选 - 使用 Outline 组件")]
|
||||
[SerializeField] private bool _useOutline = true;
|
||||
[SerializeField] private float _outlineWidth = 0.02f;
|
||||
|
||||
private Renderer[] _renderers;
|
||||
private Material[] _originalMaterials;
|
||||
private Material[] _highlightMaterials;
|
||||
private bool _isHighlighted;
|
||||
|
||||
[Header("考核高亮 - 始终显示")]
|
||||
public bool AlwaysHighlighted;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
_renderers = GetComponentsInChildren<Renderer>();
|
||||
}
|
||||
|
||||
private void OnMouseEnter()
|
||||
{
|
||||
if (_isHighlighted) return;
|
||||
SetHighlight(true);
|
||||
}
|
||||
|
||||
private void OnMouseExit()
|
||||
{
|
||||
if (AlwaysHighlighted) return;
|
||||
SetHighlight(false);
|
||||
}
|
||||
|
||||
public void SetHighlight(bool on)
|
||||
{
|
||||
_isHighlighted = on;
|
||||
if (_renderers == null) return;
|
||||
|
||||
foreach (var r in _renderers)
|
||||
{
|
||||
if (r == null) continue;
|
||||
foreach (var mat in r.materials)
|
||||
{
|
||||
if (on)
|
||||
{
|
||||
mat.EnableKeyword("_EMISSION");
|
||||
mat.SetColor("_EmissionColor", _highlightColor * _highlightIntensity);
|
||||
}
|
||||
else
|
||||
{
|
||||
mat.DisableKeyword("_EMISSION");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>闪烁效果,用于提示用户点击</summary>
|
||||
public void Flash(float duration = 0.5f)
|
||||
{
|
||||
StopAllCoroutines();
|
||||
StartCoroutine(FlashRoutine(duration));
|
||||
}
|
||||
|
||||
private System.Collections.IEnumerator FlashRoutine(float duration)
|
||||
{
|
||||
float half = duration / 2f;
|
||||
SetHighlight(true);
|
||||
yield return new WaitForSeconds(half);
|
||||
SetHighlight(false);
|
||||
yield return new WaitForSeconds(half);
|
||||
SetHighlight(true);
|
||||
yield return new WaitForSeconds(half);
|
||||
SetHighlight(false);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 289a67afae9f64a8fbff818821d6ea91
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,168 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
|
||||
/// <summary>
|
||||
/// 核心交互系统:射线检测 + 点击/拖拽处理。
|
||||
/// 挂在主相机或专用 GameObject 上。
|
||||
/// </summary>
|
||||
public class InteractionSystem : MonoBehaviour
|
||||
{
|
||||
[Header("射线配置")]
|
||||
[SerializeField] private Camera _mainCamera;
|
||||
[SerializeField] private LayerMask _interactableMask = ~0;
|
||||
[SerializeField] private float _maxRayDistance = 100f;
|
||||
|
||||
[Header("事件 - 由 StepManager 绑定")]
|
||||
public UnityEvent<string> OnObjectClicked; // 点击到 Tag 时触发,传 Tag
|
||||
public UnityEvent OnAnywhereClicked; // 点击空白处触发
|
||||
|
||||
[Header("拖拽配置")]
|
||||
[SerializeField] private float _dragPlaneDistance = 2f;
|
||||
[SerializeField] private float _snapDistance = 0.3f;
|
||||
|
||||
private GameObject _draggedObject;
|
||||
private Vector3 _dragOffset;
|
||||
private float _dragZ;
|
||||
private bool _isDragging;
|
||||
|
||||
// 考核模式序列点击
|
||||
private int _sequenceClickCount;
|
||||
private string[] _expectedSequence;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (_mainCamera == null)
|
||||
_mainCamera = Camera.main;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
HandleClick();
|
||||
HandleDrag();
|
||||
}
|
||||
|
||||
#region 点击处理
|
||||
|
||||
private void HandleClick()
|
||||
{
|
||||
if (!Input.GetMouseButtonDown(0)) return;
|
||||
if (UnityEngine.EventSystems.EventSystem.current != null &&
|
||||
UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
|
||||
return;
|
||||
|
||||
Ray ray = _mainCamera.ScreenPointToRay(Input.mousePosition);
|
||||
if (Physics.Raycast(ray, out RaycastHit hit, _maxRayDistance, _interactableMask))
|
||||
{
|
||||
string tag = hit.collider.tag;
|
||||
if (!string.IsNullOrEmpty(tag))
|
||||
{
|
||||
Debug.Log($"InteractionSystem: 点击到物体 Tag={tag}");
|
||||
OnObjectClicked?.Invoke(tag);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
OnAnywhereClicked?.Invoke();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 拖拽处理
|
||||
|
||||
private void HandleDrag()
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
if (UnityEngine.EventSystems.EventSystem.current != null &&
|
||||
UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
|
||||
return;
|
||||
|
||||
Ray ray = _mainCamera.ScreenPointToRay(Input.mousePosition);
|
||||
if (Physics.Raycast(ray, out RaycastHit hit, _maxRayDistance, _interactableMask))
|
||||
{
|
||||
var draggable = hit.collider.GetComponent<DraggableObject>();
|
||||
if (draggable != null && draggable.IsDraggable)
|
||||
{
|
||||
_draggedObject = hit.collider.gameObject;
|
||||
_dragZ = _mainCamera.WorldToScreenPoint(_draggedObject.transform.position).z;
|
||||
_isDragging = true;
|
||||
draggable.OnDragStart();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Input.GetMouseButton(0) && _isDragging && _draggedObject != null)
|
||||
{
|
||||
Vector3 screenPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _dragZ);
|
||||
Vector3 worldPos = _mainCamera.ScreenToWorldPoint(screenPos);
|
||||
_draggedObject.transform.position = worldPos;
|
||||
}
|
||||
|
||||
if (Input.GetMouseButtonUp(0) && _isDragging && _draggedObject != null)
|
||||
{
|
||||
var draggable = _draggedObject.GetComponent<DraggableObject>();
|
||||
|
||||
if (draggable != null && draggable.SnapTarget != null)
|
||||
{
|
||||
float dist = Vector3.Distance(_draggedObject.transform.position, draggable.SnapTarget.position);
|
||||
if (dist <= _snapDistance)
|
||||
{
|
||||
_draggedObject.transform.position = draggable.SnapTarget.position;
|
||||
_draggedObject.transform.rotation = draggable.SnapTarget.rotation;
|
||||
draggable.OnSnapped();
|
||||
}
|
||||
}
|
||||
|
||||
draggable?.OnDragEnd();
|
||||
_draggedObject = null;
|
||||
_isDragging = false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 考核序列点击
|
||||
|
||||
public void BeginSequenceCheck(string[] expectedTags)
|
||||
{
|
||||
_expectedSequence = expectedTags;
|
||||
_sequenceClickCount = 0;
|
||||
}
|
||||
|
||||
public bool TrySequenceClick(string clickedTag, out bool isComplete)
|
||||
{
|
||||
isComplete = false;
|
||||
if (_expectedSequence == null || _sequenceClickCount >= _expectedSequence.Length)
|
||||
return false;
|
||||
|
||||
if (clickedTag == _expectedSequence[_sequenceClickCount])
|
||||
{
|
||||
_sequenceClickCount++;
|
||||
if (_sequenceClickCount >= _expectedSequence.Length)
|
||||
{
|
||||
isComplete = true;
|
||||
_expectedSequence = null;
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>获取当前序列已正确命中的步数(用于 proportion 计分)</summary>
|
||||
public int GetSequenceHitCount()
|
||||
{
|
||||
return _sequenceClickCount;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 公共方法
|
||||
|
||||
public void SetInteractionEnabled(bool enabled)
|
||||
{
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1de9da6001ff949cf9bedcd003c48487
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2f65bedef5c694798a8ddf6bcaad27ee
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,154 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using TMPro;
|
||||
using System;
|
||||
|
||||
/// <summary>
|
||||
/// 考核弹窗:选择题 + 操作确认。
|
||||
/// 挂在弹窗 Panel 上,由 UIManager 调用 Show()。
|
||||
/// 回调返回 proportion (0~1 得分比例) 和 feedback。
|
||||
/// </summary>
|
||||
public class ExamPopup : MonoBehaviour
|
||||
{
|
||||
[Header("UI 组件")]
|
||||
[SerializeField] private GameObject _popupRoot;
|
||||
[SerializeField] private TMP_Text _questionText;
|
||||
[SerializeField] private Toggle[] _optionToggles;
|
||||
[SerializeField] private TMP_Text[] _optionLabels;
|
||||
[SerializeField] private Button _confirmButton;
|
||||
[SerializeField] private TMP_Text _feedbackText;
|
||||
|
||||
[Header("操作题 UI(点击序列)")]
|
||||
[SerializeField] private GameObject _operationPanel;
|
||||
[SerializeField] private TMP_Text _operationHint;
|
||||
|
||||
private StepData _currentStep;
|
||||
private Action<float, string> _onAnswerCallback;
|
||||
private int _selectedIndex = -1;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_confirmButton?.onClick.AddListener(OnConfirm);
|
||||
if (_popupRoot != null) _popupRoot.SetActive(false);
|
||||
}
|
||||
|
||||
public void Show(StepData step, Action<float, string> onAnswer)
|
||||
{
|
||||
_currentStep = step;
|
||||
_onAnswerCallback = onAnswer;
|
||||
_selectedIndex = -1;
|
||||
if (_feedbackText != null) _feedbackText.text = "";
|
||||
if (_popupRoot != null) _popupRoot.SetActive(true);
|
||||
|
||||
_questionText?.SetText(step.ExamQuestionText);
|
||||
|
||||
switch (step.CompleteType)
|
||||
{
|
||||
case StepCompleteType.MultipleChoice:
|
||||
SetupMultipleChoice(step);
|
||||
break;
|
||||
case StepCompleteType.ClickObject:
|
||||
SetupClickObject(step);
|
||||
break;
|
||||
case StepCompleteType.SequenceClick:
|
||||
SetupSequenceClick(step);
|
||||
break;
|
||||
default:
|
||||
SetupDefault(step);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#region 题型配置
|
||||
|
||||
private void SetupMultipleChoice(StepData step)
|
||||
{
|
||||
if (_operationPanel != null) _operationPanel.SetActive(false);
|
||||
|
||||
int optionCount = step.ExamOptions?.Length ?? 0;
|
||||
for (int i = 0; i < _optionToggles.Length; i++)
|
||||
{
|
||||
bool active = i < optionCount;
|
||||
_optionToggles[i].gameObject.SetActive(active);
|
||||
_optionToggles[i].isOn = false;
|
||||
_optionToggles[i].onValueChanged.RemoveAllListeners();
|
||||
int idx = i;
|
||||
_optionToggles[i].onValueChanged.AddListener((val) => { if (val) _selectedIndex = idx; });
|
||||
if (active) _optionLabels[i]?.SetText(step.ExamOptions[i]);
|
||||
}
|
||||
|
||||
_confirmButton?.gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
private void SetupClickObject(StepData step)
|
||||
{
|
||||
if (_operationPanel != null) _operationPanel.SetActive(true);
|
||||
if (_optionToggles != null)
|
||||
foreach (var t in _optionToggles) t.gameObject.SetActive(false);
|
||||
_confirmButton?.gameObject.SetActive(true);
|
||||
_operationHint?.SetText($"请点击场景中的 {step.TargetTag} 物体");
|
||||
}
|
||||
|
||||
private void SetupSequenceClick(StepData step)
|
||||
{
|
||||
if (_operationPanel != null) _operationPanel.SetActive(true);
|
||||
if (_optionToggles != null)
|
||||
foreach (var t in _optionToggles) t.gameObject.SetActive(false);
|
||||
_confirmButton?.gameObject.SetActive(true);
|
||||
_operationHint?.SetText("请按正确顺序点击物体,完成后按确定");
|
||||
}
|
||||
|
||||
private void SetupDefault(StepData step)
|
||||
{
|
||||
if (_operationPanel != null) _operationPanel.SetActive(false);
|
||||
if (_optionToggles != null)
|
||||
foreach (var t in _optionToggles) t.gameObject.SetActive(false);
|
||||
_confirmButton?.gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 确认与判定
|
||||
|
||||
private void OnConfirm()
|
||||
{
|
||||
if (_currentStep == null) return;
|
||||
|
||||
float proportion = 1f;
|
||||
string feedback = "";
|
||||
|
||||
switch (_currentStep.CompleteType)
|
||||
{
|
||||
case StepCompleteType.MultipleChoice:
|
||||
bool correct = _selectedIndex == _currentStep.CorrectOptionIndex;
|
||||
proportion = correct ? 1f : 0f;
|
||||
feedback = correct ? "" : _currentStep.ErrorFeedback;
|
||||
if (!correct && _feedbackText != null)
|
||||
_feedbackText.text = feedback;
|
||||
break;
|
||||
default:
|
||||
proportion = 1f;
|
||||
break;
|
||||
}
|
||||
|
||||
if (proportion <= 0f && !string.IsNullOrEmpty(feedback))
|
||||
{
|
||||
_onAnswerCallback?.Invoke(0f, feedback);
|
||||
Hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
_onAnswerCallback?.Invoke(proportion, feedback);
|
||||
Hide();
|
||||
}
|
||||
}
|
||||
|
||||
public void Hide()
|
||||
{
|
||||
if (_popupRoot != null) _popupRoot.SetActive(false);
|
||||
_currentStep = null;
|
||||
_onAnswerCallback = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1b7f4e3b0a85d4c75860bf9060f8c3a8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,6 @@
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// Legacy HUD controller — replaced by UIManager. Kept for backward compatibility.
|
||||
/// </summary>
|
||||
public class HUDController : MonoBehaviour { }
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ded61052e4f7c449ca21983fdaa9060b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,38 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
/// <summary>
|
||||
/// Main menu UI — assign all fields in Inspector.
|
||||
/// </summary>
|
||||
public class MainMenuUI : MonoBehaviour
|
||||
{
|
||||
[Header("Text")]
|
||||
public Text titleText;
|
||||
public Text versionText;
|
||||
|
||||
[Header("Buttons")]
|
||||
public Button cprButton;
|
||||
public Button fractureButton;
|
||||
public Button sprainButton;
|
||||
public Button bleedingButton;
|
||||
public Button transportButton;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
if (titleText != null) titleText.text = "运动伤害现场急救处理虚拟仿真实验";
|
||||
if (versionText != null) versionText.text = $"v{Application.version}";
|
||||
|
||||
if (cprButton != null) cprButton.onClick.AddListener(() => OnSelect("CPR"));
|
||||
if (fractureButton != null) fractureButton.onClick.AddListener(() => OnSelect("FractureFixation"));
|
||||
if (sprainButton != null) sprainButton.onClick.AddListener(() => OnSelect("SprainBandage"));
|
||||
if (bleedingButton != null) bleedingButton.onClick.AddListener(() => OnSelect("BleedingBandage"));
|
||||
if (transportButton != null) transportButton.onClick.AddListener(() => OnSelect("CasualtyTransport"));
|
||||
}
|
||||
|
||||
private void OnSelect(string experimentId)
|
||||
{
|
||||
PlayerPrefs.SetString("SelectedExperiment", experimentId);
|
||||
SceneManager.LoadScene("ModeSelection");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7fca7ea321dc34ab19b4bea56e90e8a2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,72 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
public class ModeSelectionUI : MonoBehaviour
|
||||
{
|
||||
[Header("Tip")]
|
||||
public Text tipText;
|
||||
|
||||
[Header("Fixation Mode")]
|
||||
public Button limbFixationButton;
|
||||
public Button splintFixationButton;
|
||||
public GameObject limbFixationCheck;
|
||||
public GameObject splintFixationCheck;
|
||||
|
||||
[Header("Run Mode")]
|
||||
public Button learnModeButton;
|
||||
public Button examModeButton;
|
||||
public GameObject learnModeCheck;
|
||||
public GameObject examModeCheck;
|
||||
|
||||
[Header("Actions")]
|
||||
public Button startButton;
|
||||
public Button backButton;
|
||||
|
||||
private FixationMethod selectedFixation = FixationMethod.LimbFixation;
|
||||
private ExperimentMode selectedRunMode = ExperimentMode.Learn;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
tipText.text = "Tip:请选择实验模式";
|
||||
|
||||
limbFixationButton.onClick.AddListener(() => SelectFixation(FixationMethod.LimbFixation));
|
||||
splintFixationButton.onClick.AddListener(() => SelectFixation(FixationMethod.SplintFixation));
|
||||
learnModeButton.onClick.AddListener(() => SelectRunMode(ExperimentMode.Learn));
|
||||
examModeButton.onClick.AddListener(() => SelectRunMode(ExperimentMode.Exam));
|
||||
startButton.onClick.AddListener(OnStart);
|
||||
backButton.onClick.AddListener(() => SceneManager.LoadScene("main"));
|
||||
|
||||
UpdateSelectionVisuals();
|
||||
}
|
||||
|
||||
private void SelectFixation(FixationMethod mode)
|
||||
{
|
||||
selectedFixation = mode;
|
||||
UpdateSelectionVisuals();
|
||||
}
|
||||
|
||||
private void SelectRunMode(ExperimentMode mode)
|
||||
{
|
||||
selectedRunMode = mode;
|
||||
UpdateSelectionVisuals();
|
||||
}
|
||||
|
||||
private void UpdateSelectionVisuals()
|
||||
{
|
||||
limbFixationCheck.SetActive(selectedFixation == FixationMethod.LimbFixation);
|
||||
splintFixationCheck.SetActive(selectedFixation == FixationMethod.SplintFixation);
|
||||
learnModeCheck.SetActive(selectedRunMode == ExperimentMode.Learn);
|
||||
examModeCheck.SetActive(selectedRunMode == ExperimentMode.Exam);
|
||||
}
|
||||
|
||||
private void OnStart()
|
||||
{
|
||||
if (GameManager.Instance != null)
|
||||
{
|
||||
GameManager.Instance.CurrentFixationMethod = selectedFixation;
|
||||
GameManager.Instance.CurrentMode = selectedRunMode;
|
||||
}
|
||||
SceneManager.LoadScene("Experiment");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2106746edd5ca43288aff94f664b16ae
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,3 @@
|
||||
using UnityEngine;
|
||||
/// <summary>Legacy — replaced by ExamPopup + ScoreDisplay.</summary>
|
||||
public class PopupSystem : MonoBehaviour { }
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c0eab9dd709f74ddf9f6728ef6bb4edf
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,109 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using TMPro;
|
||||
|
||||
/// <summary>
|
||||
/// 实验结束后的结果展示面板。
|
||||
/// 考核模式:显示加权成绩 + 错题分析列表(含每步得分/满分)。
|
||||
/// 学习模式:显示注意事项。
|
||||
/// </summary>
|
||||
public class ScoreDisplay : MonoBehaviour
|
||||
{
|
||||
[Header("面板根节点")]
|
||||
[SerializeField] private GameObject _panelRoot;
|
||||
|
||||
[Header("考核模式")]
|
||||
[SerializeField] private GameObject _examResultRoot;
|
||||
[SerializeField] private TMP_Text _scoreTitle;
|
||||
[SerializeField] private TMP_Text _scoreValue;
|
||||
[SerializeField] private Transform _analysisListParent;
|
||||
[SerializeField] private GameObject _analysisItemPrefab;
|
||||
|
||||
[Header("学习模式 - 注意事项")]
|
||||
[SerializeField] private GameObject _notesRoot;
|
||||
[SerializeField] private TMP_Text _notesText;
|
||||
|
||||
[Header("底部按钮")]
|
||||
[SerializeField] private Button _confirmButton;
|
||||
|
||||
private static readonly string NotesContent =
|
||||
"1. 下肢损伤选择仰卧位;\n" +
|
||||
"2. 骨折固定前后要脱掉鞋袜并检查下肢末梢循环、运动、感觉;\n" +
|
||||
"3. 穿带子时应从健侧穿向伤侧;\n" +
|
||||
"4. 骨折固定时先固定伤口的近心端,后固定远心端,再由上而下进行固定;\n" +
|
||||
"5. 固定后尽可能抬高下肢。";
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_confirmButton?.onClick.AddListener(OnConfirm);
|
||||
if (_panelRoot != null) _panelRoot.SetActive(false);
|
||||
}
|
||||
|
||||
/// <summary>考核模式 - 显示加权成绩</summary>
|
||||
public void ShowExamScore()
|
||||
{
|
||||
if (_panelRoot != null) _panelRoot.SetActive(true);
|
||||
if (_examResultRoot != null) _examResultRoot.SetActive(true);
|
||||
if (_notesRoot != null) _notesRoot.SetActive(false);
|
||||
|
||||
var gm = GameManager.Instance;
|
||||
if (gm == null) return;
|
||||
|
||||
int score = gm.GetExamScoreRounded();
|
||||
float pct = gm.GetExamPercentage();
|
||||
if (_scoreTitle != null) _scoreTitle.text = "成绩显示栏";
|
||||
if (_scoreValue != null) _scoreValue.text = $"考试成绩:{score} 分({pct:F0}%)";
|
||||
|
||||
BuildAnalysisList();
|
||||
}
|
||||
|
||||
/// <summary>学习模式 - 显示注意事项</summary>
|
||||
public void ShowNotesOnly()
|
||||
{
|
||||
if (_panelRoot != null) _panelRoot.SetActive(true);
|
||||
if (_examResultRoot != null) _examResultRoot.SetActive(false);
|
||||
if (_notesRoot != null) _notesRoot.SetActive(true);
|
||||
|
||||
if (_notesText != null) _notesText.text = NotesContent;
|
||||
}
|
||||
|
||||
private void BuildAnalysisList()
|
||||
{
|
||||
if (_analysisListParent == null || _analysisItemPrefab == null) return;
|
||||
|
||||
foreach (Transform child in _analysisListParent)
|
||||
Destroy(child.gameObject);
|
||||
|
||||
var gm = GameManager.Instance;
|
||||
if (gm == null || gm.StepScores == null) return;
|
||||
|
||||
for (int i = 0; i < gm.StepScores.Length; i++)
|
||||
{
|
||||
var item = Instantiate(_analysisItemPrefab, _analysisListParent);
|
||||
var text = item.GetComponentInChildren<TMP_Text>();
|
||||
if (text == null) continue;
|
||||
|
||||
float earned = gm.StepScores[i];
|
||||
float max = gm.StepMaxScores[i];
|
||||
bool fullScore = Mathf.Approximately(earned, max);
|
||||
bool zeroScore = earned <= 0f;
|
||||
|
||||
string status;
|
||||
if (fullScore) status = "<color=#00FF00>正确</color>";
|
||||
else if (zeroScore) status = "<color=#FF0000>错误</color>";
|
||||
else status = $"<color=#FFAA00>部分正确</color>";
|
||||
|
||||
string scorePart = $"({earned:F0}/{max:F0} 分)";
|
||||
string fbPart = (!fullScore && !string.IsNullOrEmpty(gm.StepFeedback[i]))
|
||||
? $":{gm.StepFeedback[i]}" : "";
|
||||
|
||||
text.text = $"第{i + 1}题:{status} {scorePart}{fbPart}";
|
||||
}
|
||||
}
|
||||
|
||||
private void OnConfirm()
|
||||
{
|
||||
if (_panelRoot != null) _panelRoot.SetActive(false);
|
||||
UnityEngine.SceneManagement.SceneManager.LoadScene("MainMenu");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8315bbe42105640af89ceda53b039e65
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,221 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using TMPro;
|
||||
|
||||
/// <summary>
|
||||
/// UI 中央调度器:引用所有子面板,绑定 StepManager 事件。
|
||||
/// 挂在 Canvas GameObject 上。
|
||||
/// </summary>
|
||||
public class UIManager : MonoBehaviour
|
||||
{
|
||||
[Header("管理器引用")]
|
||||
[SerializeField] private StepManager _stepManager;
|
||||
[SerializeField] private InteractionSystem _interactionSystem;
|
||||
|
||||
[Header("=== 顶部提示栏 ===")]
|
||||
[SerializeField] private GameObject _tipPanel;
|
||||
[SerializeField] private TMP_Text _tipText;
|
||||
|
||||
[Header("=== 详细操作说明(甲方补充 - 学习模式) ===")]
|
||||
[SerializeField] private GameObject _detailPanel;
|
||||
[SerializeField] private TMP_Text _detailText;
|
||||
|
||||
[Header("=== 对话气泡 ===")]
|
||||
[SerializeField] private GameObject _dialogueBubble;
|
||||
[SerializeField] private TMP_Text _dialogueText;
|
||||
|
||||
[Header("=== 画中画视频 ===")]
|
||||
[SerializeField] private VideoController _videoController;
|
||||
|
||||
[Header("=== 右侧功能按钮 ===")]
|
||||
[SerializeField] private Button _btnFullScreen;
|
||||
[SerializeField] private Button _btnPrevious;
|
||||
[SerializeField] private Button _btnNext;
|
||||
[SerializeField] private Button _btnSwitchMode;
|
||||
[SerializeField] private Button _btnReturn;
|
||||
[SerializeField] private TMP_Text _btnSwitchModeLabel;
|
||||
|
||||
[Header("=== 底部进度条 ===")]
|
||||
[SerializeField] private Slider _progressBar;
|
||||
[SerializeField] private TMP_Text _progressText;
|
||||
|
||||
[Header("=== 弹窗 ===")]
|
||||
[SerializeField] private ExamPopup _examPopup;
|
||||
[SerializeField] private ScoreDisplay _scoreDisplay;
|
||||
|
||||
[Header("=== 底部主菜单图标 ===")]
|
||||
[SerializeField] private Button _btnCPR;
|
||||
[SerializeField] private Button _btnFracture;
|
||||
[SerializeField] private Button _btnSprain;
|
||||
[SerializeField] private Button _btnBleeding;
|
||||
[SerializeField] private Button _btnTransport;
|
||||
|
||||
[Header("=== 固定方式选择(仅骨折固定) ===")]
|
||||
[SerializeField] private GameObject _fixationPanel;
|
||||
[SerializeField] private Button _btnLimbFixation;
|
||||
[SerializeField] private Button _btnSplintFixation;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
BindEvents();
|
||||
BindButtons();
|
||||
}
|
||||
|
||||
#region 事件绑定
|
||||
|
||||
private void BindEvents()
|
||||
{
|
||||
if (_stepManager == null) return;
|
||||
|
||||
_stepManager.OnStepChanged.AddListener(OnStepChanged);
|
||||
_stepManager.OnTipChanged.AddListener(UpdateTip);
|
||||
_stepManager.OnDialogueChanged.AddListener(UpdateDialogue);
|
||||
_stepManager.OnDetailedContent.AddListener(UpdateDetailContent);
|
||||
_stepManager.OnExamPopup.AddListener(ShowExamPopup);
|
||||
_stepManager.OnExperimentComplete.AddListener(OnExperimentComplete);
|
||||
_stepManager.OnVideoToggle.AddListener(ToggleVideo);
|
||||
}
|
||||
|
||||
private void BindButtons()
|
||||
{
|
||||
_btnFullScreen?.onClick.AddListener(ToggleFullScreen);
|
||||
_btnPrevious?.onClick.AddListener(OnPreviousClicked);
|
||||
_btnNext?.onClick.AddListener(OnNextClicked);
|
||||
_btnSwitchMode?.onClick.AddListener(OnSwitchModeClicked);
|
||||
_btnReturn?.onClick.AddListener(OnReturnClicked);
|
||||
|
||||
_btnLimbFixation?.onClick.AddListener(() => _stepManager?.SwitchFixation(FixationMethod.LimbFixation));
|
||||
_btnSplintFixation?.onClick.AddListener(() => _stepManager?.SwitchFixation(FixationMethod.SplintFixation));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region UI 更新回调
|
||||
|
||||
private void OnStepChanged(int index)
|
||||
{
|
||||
UpdateProgressBar();
|
||||
UpdateNavigationButtons();
|
||||
}
|
||||
|
||||
private void UpdateTip(string text)
|
||||
{
|
||||
if (_tipPanel != null) _tipPanel.SetActive(!string.IsNullOrEmpty(text));
|
||||
if (_tipText != null) _tipText.text = text;
|
||||
}
|
||||
|
||||
private void UpdateDialogue(string text)
|
||||
{
|
||||
if (_dialogueBubble != null) _dialogueBubble.SetActive(!string.IsNullOrEmpty(text));
|
||||
if (_dialogueText != null) _dialogueText.text = text;
|
||||
}
|
||||
|
||||
private void UpdateDetailContent(string text)
|
||||
{
|
||||
if (_detailPanel != null) _detailPanel.SetActive(!string.IsNullOrEmpty(text));
|
||||
if (_detailText != null) _detailText.text = text;
|
||||
}
|
||||
|
||||
private void ToggleVideo(string fileName, bool active)
|
||||
{
|
||||
if (_videoController == null) return;
|
||||
if (active && !string.IsNullOrEmpty(fileName))
|
||||
_videoController.PlayVideo(fileName);
|
||||
else
|
||||
_videoController.StopVideo();
|
||||
}
|
||||
|
||||
private void UpdateProgressBar()
|
||||
{
|
||||
if (_stepManager == null) return;
|
||||
int cur = _stepManager.CurrentStepIndex + 1;
|
||||
int total = _stepManager.TotalSteps;
|
||||
if (_progressBar != null) _progressBar.value = (float)cur / total;
|
||||
if (_progressText != null) _progressText.text = $"{cur}/{total}";
|
||||
}
|
||||
|
||||
private void UpdateNavigationButtons()
|
||||
{
|
||||
if (_stepManager == null) return;
|
||||
_btnPrevious.interactable = _stepManager.CurrentStepIndex > 0;
|
||||
bool isLast = _stepManager.CurrentStepIndex >= _stepManager.TotalSteps - 1;
|
||||
if (_btnNext != null)
|
||||
{
|
||||
var label = _btnNext.GetComponentInChildren<TMP_Text>();
|
||||
if (label != null) label.text = isLast ? "完成" : "下一步";
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 考核弹窗
|
||||
|
||||
private void ShowExamPopup(StepData step)
|
||||
{
|
||||
if (_examPopup == null) return;
|
||||
_examPopup.Show(step, OnExamAnswer);
|
||||
}
|
||||
|
||||
private void OnExamAnswer(float proportion, string feedback)
|
||||
{
|
||||
_stepManager?.OnStepInteractionComplete(proportion, feedback);
|
||||
_stepManager?.NextStep();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 实验完成
|
||||
|
||||
private void OnExperimentComplete()
|
||||
{
|
||||
var gm = GameManager.Instance;
|
||||
if (gm == null) return;
|
||||
if (gm.CurrentMode == ExperimentMode.Exam)
|
||||
{
|
||||
_scoreDisplay?.ShowExamScore();
|
||||
}
|
||||
else
|
||||
{
|
||||
_scoreDisplay?.ShowNotesOnly();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 按钮回调
|
||||
|
||||
private void ToggleFullScreen()
|
||||
{
|
||||
Screen.fullScreen = !Screen.fullScreen;
|
||||
}
|
||||
|
||||
private void OnPreviousClicked()
|
||||
{
|
||||
_stepManager?.PreviousStep();
|
||||
}
|
||||
|
||||
private void OnNextClicked()
|
||||
{
|
||||
if (_stepManager.Mode == ExperimentMode.Exam)
|
||||
{
|
||||
var step = _stepManager.GetCurrentStep();
|
||||
if (step != null && step.CompleteType != StepCompleteType.MultipleChoice)
|
||||
_stepManager.OnStepInteractionComplete(1f);
|
||||
}
|
||||
_stepManager.NextStep();
|
||||
}
|
||||
|
||||
private void OnSwitchModeClicked()
|
||||
{
|
||||
var newMode = _stepManager.Mode == ExperimentMode.Learn
|
||||
? ExperimentMode.Exam : ExperimentMode.Learn;
|
||||
_stepManager.SwitchMode(newMode);
|
||||
}
|
||||
|
||||
private void OnReturnClicked()
|
||||
{
|
||||
UnityEngine.SceneManagement.SceneManager.LoadScene("MainMenu");
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 11edd93e0776546a3b8545535d7dd5e1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,83 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.Video;
|
||||
|
||||
/// <summary>
|
||||
/// 画中画视频控制器:用 VideoPlayer 渲染到 RenderTexture,再赋给 RawImage。
|
||||
/// 挂在包含 RawImage 和 VideoPlayer 的 GameObject 上。
|
||||
/// </summary>
|
||||
[RequireComponent(typeof(RawImage))]
|
||||
public class VideoController : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private VideoPlayer _videoPlayer;
|
||||
[SerializeField] private RawImage _rawImage;
|
||||
|
||||
private RenderTexture _renderTexture;
|
||||
private bool _isPlaying;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (_rawImage == null) _rawImage = GetComponent<RawImage>();
|
||||
if (_videoPlayer == null) _videoPlayer = GetComponentInChildren<VideoPlayer>();
|
||||
|
||||
if (_videoPlayer != null)
|
||||
{
|
||||
_videoPlayer.loopPointReached += OnVideoEnd;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>播放指定视频文件(StreamingAssets/Videos/ 下)</summary>
|
||||
public void PlayVideo(string fileName)
|
||||
{
|
||||
if (_videoPlayer == null) return;
|
||||
|
||||
string path = System.IO.Path.Combine(Application.streamingAssetsPath, "Videos", fileName);
|
||||
_videoPlayer.url = path;
|
||||
|
||||
// 创建 RenderTexture
|
||||
if (_renderTexture == null)
|
||||
{
|
||||
int w = _videoPlayer.targetTexture != null ? _videoPlayer.targetTexture.width : 640;
|
||||
int h = _videoPlayer.targetTexture != null ? _videoPlayer.targetTexture.height : 360;
|
||||
_renderTexture = new RenderTexture(w, h, 0);
|
||||
_videoPlayer.targetTexture = _renderTexture;
|
||||
if (_rawImage != null) _rawImage.texture = _renderTexture;
|
||||
}
|
||||
|
||||
_videoPlayer.Play();
|
||||
_isPlaying = true;
|
||||
gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
public void StopVideo()
|
||||
{
|
||||
if (_videoPlayer != null) _videoPlayer.Stop();
|
||||
_isPlaying = false;
|
||||
gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
public void PauseVideo()
|
||||
{
|
||||
if (_videoPlayer != null) _videoPlayer.Pause();
|
||||
}
|
||||
|
||||
public void ResumeVideo()
|
||||
{
|
||||
if (_videoPlayer != null) _videoPlayer.Play();
|
||||
}
|
||||
|
||||
private void OnVideoEnd(VideoPlayer vp)
|
||||
{
|
||||
// 真人演示视频播完自动循环
|
||||
vp.Play();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (_renderTexture != null)
|
||||
{
|
||||
_renderTexture.Release();
|
||||
Destroy(_renderTexture);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3a31c697647c74734811ac323080d78a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,3 @@
|
||||
using UnityEngine;
|
||||
/// <summary>Legacy — replaced by VideoController.</summary>
|
||||
public class VideoPlayerController : MonoBehaviour { }
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4c7b16cd23ebf4299be89ef8311ed579
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -12,8 +12,8 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3}
|
||||
m_Name: URP-Balanced
|
||||
m_EditorClassIdentifier:
|
||||
k_AssetVersion: 9
|
||||
k_AssetPreviousVersion: 9
|
||||
k_AssetVersion: 11
|
||||
k_AssetPreviousVersion: 11
|
||||
m_RendererType: 1
|
||||
m_RendererData: {fileID: 0}
|
||||
m_RendererDataList:
|
||||
@@ -23,10 +23,16 @@ MonoBehaviour:
|
||||
m_RequireOpaqueTexture: 0
|
||||
m_OpaqueDownsampling: 1
|
||||
m_SupportsTerrainHoles: 1
|
||||
m_StoreActionsOptimization: 0
|
||||
m_SupportsHDR: 1
|
||||
m_HDRColorBufferPrecision: 0
|
||||
m_MSAA: 1
|
||||
m_RenderScale: 1
|
||||
m_UpscalingFilter: 0
|
||||
m_FsrOverrideSharpness: 0
|
||||
m_FsrSharpness: 0.92
|
||||
m_EnableLODCrossFade: 1
|
||||
m_LODCrossFadeDitheringType: 1
|
||||
m_ShEvalMode: 0
|
||||
m_MainLightRenderingMode: 1
|
||||
m_MainLightShadowsSupported: 1
|
||||
m_MainLightShadowmapResolution: 1024
|
||||
@@ -47,23 +53,62 @@ MonoBehaviour:
|
||||
m_CascadeBorder: 0.1
|
||||
m_ShadowDepthBias: 1
|
||||
m_ShadowNormalBias: 1
|
||||
m_AnyShadowsSupported: 1
|
||||
m_SoftShadowsSupported: 1
|
||||
m_ConservativeEnclosingSphere: 0
|
||||
m_NumIterationsEnclosingSphere: 64
|
||||
m_SoftShadowQuality: 2
|
||||
m_AdditionalLightsCookieResolution: 512
|
||||
m_AdditionalLightsCookieFormat: 1
|
||||
m_UseSRPBatcher: 1
|
||||
m_SupportsDynamicBatching: 0
|
||||
m_MixedLightingSupported: 1
|
||||
m_SupportsLightCookies: 1
|
||||
m_SupportsLightLayers: 0
|
||||
m_DebugLevel: 0
|
||||
m_StoreActionsOptimization: 0
|
||||
m_EnableRenderGraph: 0
|
||||
m_UseAdaptivePerformance: 1
|
||||
m_ColorGradingMode: 0
|
||||
m_ColorGradingLutSize: 32
|
||||
m_UseFastSRGBLinearConversion: 0
|
||||
m_SupportDataDrivenLensFlare: 1
|
||||
m_ShadowType: 1
|
||||
m_LocalShadowsSupported: 0
|
||||
m_LocalShadowsAtlasResolution: 256
|
||||
m_MaxPixelLights: 0
|
||||
m_ShadowAtlasResolution: 256
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_VolumeFrameworkUpdateMode: 0
|
||||
m_Textures:
|
||||
blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3}
|
||||
bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3}
|
||||
m_PrefilteringModeMainLightShadows: 1
|
||||
m_PrefilteringModeAdditionalLight: 4
|
||||
m_PrefilteringModeAdditionalLightShadows: 1
|
||||
m_PrefilterXRKeywords: 0
|
||||
m_PrefilteringModeForwardPlus: 1
|
||||
m_PrefilteringModeDeferredRendering: 1
|
||||
m_PrefilteringModeScreenSpaceOcclusion: 1
|
||||
m_PrefilterDebugKeywords: 0
|
||||
m_PrefilterWriteRenderingLayers: 0
|
||||
m_PrefilterHDROutput: 0
|
||||
m_PrefilterSSAODepthNormals: 0
|
||||
m_PrefilterSSAOSourceDepthLow: 0
|
||||
m_PrefilterSSAOSourceDepthMedium: 0
|
||||
m_PrefilterSSAOSourceDepthHigh: 0
|
||||
m_PrefilterSSAOInterleaved: 0
|
||||
m_PrefilterSSAOBlueNoise: 0
|
||||
m_PrefilterSSAOSampleCountLow: 0
|
||||
m_PrefilterSSAOSampleCountMedium: 0
|
||||
m_PrefilterSSAOSampleCountHigh: 0
|
||||
m_PrefilterDBufferMRT1: 0
|
||||
m_PrefilterDBufferMRT2: 0
|
||||
m_PrefilterDBufferMRT3: 0
|
||||
m_PrefilterSoftShadowsQualityLow: 0
|
||||
m_PrefilterSoftShadowsQualityMedium: 0
|
||||
m_PrefilterSoftShadowsQualityHigh: 0
|
||||
m_PrefilterSoftShadows: 0
|
||||
m_PrefilterScreenCoord: 0
|
||||
m_PrefilterNativeRenderPass: 0
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_ShadowCascades: 0
|
||||
|
||||
@@ -13,7 +13,7 @@ MonoBehaviour:
|
||||
m_Name: URP-HighFidelity
|
||||
m_EditorClassIdentifier:
|
||||
k_AssetVersion: 11
|
||||
k_AssetPreviousVersion: 10
|
||||
k_AssetPreviousVersion: 11
|
||||
m_RendererType: 1
|
||||
m_RendererData: {fileID: 0}
|
||||
m_RendererDataList:
|
||||
@@ -32,6 +32,7 @@ MonoBehaviour:
|
||||
m_FsrSharpness: 0.92
|
||||
m_EnableLODCrossFade: 1
|
||||
m_LODCrossFadeDitheringType: 1
|
||||
m_ShEvalMode: 0
|
||||
m_MainLightRenderingMode: 1
|
||||
m_MainLightShadowsSupported: 1
|
||||
m_MainLightShadowmapResolution: 4096
|
||||
@@ -52,9 +53,11 @@ MonoBehaviour:
|
||||
m_CascadeBorder: 0.1
|
||||
m_ShadowDepthBias: 1
|
||||
m_ShadowNormalBias: 1
|
||||
m_AnyShadowsSupported: 1
|
||||
m_SoftShadowsSupported: 1
|
||||
m_ConservativeEnclosingSphere: 0
|
||||
m_NumIterationsEnclosingSphere: 64
|
||||
m_SoftShadowQuality: 2
|
||||
m_AdditionalLightsCookieResolution: 4096
|
||||
m_AdditionalLightsCookieFormat: 4
|
||||
m_UseSRPBatcher: 1
|
||||
@@ -69,6 +72,7 @@ MonoBehaviour:
|
||||
m_ColorGradingMode: 0
|
||||
m_ColorGradingLutSize: 32
|
||||
m_UseFastSRGBLinearConversion: 0
|
||||
m_SupportDataDrivenLensFlare: 1
|
||||
m_ShadowType: 1
|
||||
m_LocalShadowsSupported: 0
|
||||
m_LocalShadowsAtlasResolution: 256
|
||||
@@ -78,5 +82,33 @@ MonoBehaviour:
|
||||
m_Textures:
|
||||
blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3}
|
||||
bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3}
|
||||
m_PrefilteringModeMainLightShadows: 1
|
||||
m_PrefilteringModeAdditionalLight: 4
|
||||
m_PrefilteringModeAdditionalLightShadows: 1
|
||||
m_PrefilterXRKeywords: 0
|
||||
m_PrefilteringModeForwardPlus: 1
|
||||
m_PrefilteringModeDeferredRendering: 1
|
||||
m_PrefilteringModeScreenSpaceOcclusion: 1
|
||||
m_PrefilterDebugKeywords: 0
|
||||
m_PrefilterWriteRenderingLayers: 0
|
||||
m_PrefilterHDROutput: 0
|
||||
m_PrefilterSSAODepthNormals: 0
|
||||
m_PrefilterSSAOSourceDepthLow: 0
|
||||
m_PrefilterSSAOSourceDepthMedium: 0
|
||||
m_PrefilterSSAOSourceDepthHigh: 0
|
||||
m_PrefilterSSAOInterleaved: 0
|
||||
m_PrefilterSSAOBlueNoise: 0
|
||||
m_PrefilterSSAOSampleCountLow: 0
|
||||
m_PrefilterSSAOSampleCountMedium: 0
|
||||
m_PrefilterSSAOSampleCountHigh: 0
|
||||
m_PrefilterDBufferMRT1: 0
|
||||
m_PrefilterDBufferMRT2: 0
|
||||
m_PrefilterDBufferMRT3: 0
|
||||
m_PrefilterSoftShadowsQualityLow: 0
|
||||
m_PrefilterSoftShadowsQualityMedium: 0
|
||||
m_PrefilterSoftShadowsQualityHigh: 0
|
||||
m_PrefilterSoftShadows: 0
|
||||
m_PrefilterScreenCoord: 0
|
||||
m_PrefilterNativeRenderPass: 0
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_ShadowCascades: 1
|
||||
|
||||
@@ -12,8 +12,8 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3}
|
||||
m_Name: URP-Performant
|
||||
m_EditorClassIdentifier:
|
||||
k_AssetVersion: 9
|
||||
k_AssetPreviousVersion: 9
|
||||
k_AssetVersion: 11
|
||||
k_AssetPreviousVersion: 11
|
||||
m_RendererType: 1
|
||||
m_RendererData: {fileID: 0}
|
||||
m_RendererDataList:
|
||||
@@ -23,10 +23,16 @@ MonoBehaviour:
|
||||
m_RequireOpaqueTexture: 0
|
||||
m_OpaqueDownsampling: 1
|
||||
m_SupportsTerrainHoles: 1
|
||||
m_StoreActionsOptimization: 0
|
||||
m_SupportsHDR: 0
|
||||
m_HDRColorBufferPrecision: 0
|
||||
m_MSAA: 1
|
||||
m_RenderScale: 1
|
||||
m_UpscalingFilter: 0
|
||||
m_FsrOverrideSharpness: 0
|
||||
m_FsrSharpness: 0.92
|
||||
m_EnableLODCrossFade: 1
|
||||
m_LODCrossFadeDitheringType: 1
|
||||
m_ShEvalMode: 0
|
||||
m_MainLightRenderingMode: 1
|
||||
m_MainLightShadowsSupported: 0
|
||||
m_MainLightShadowmapResolution: 1024
|
||||
@@ -47,23 +53,62 @@ MonoBehaviour:
|
||||
m_CascadeBorder: 0.1
|
||||
m_ShadowDepthBias: 1
|
||||
m_ShadowNormalBias: 1
|
||||
m_AnyShadowsSupported: 1
|
||||
m_SoftShadowsSupported: 0
|
||||
m_ConservativeEnclosingSphere: 0
|
||||
m_NumIterationsEnclosingSphere: 64
|
||||
m_SoftShadowQuality: 2
|
||||
m_AdditionalLightsCookieResolution: 2048
|
||||
m_AdditionalLightsCookieFormat: 3
|
||||
m_UseSRPBatcher: 1
|
||||
m_SupportsDynamicBatching: 0
|
||||
m_MixedLightingSupported: 1
|
||||
m_SupportsLightCookies: 1
|
||||
m_SupportsLightLayers: 0
|
||||
m_DebugLevel: 0
|
||||
m_StoreActionsOptimization: 0
|
||||
m_EnableRenderGraph: 0
|
||||
m_UseAdaptivePerformance: 1
|
||||
m_ColorGradingMode: 0
|
||||
m_ColorGradingLutSize: 16
|
||||
m_UseFastSRGBLinearConversion: 0
|
||||
m_SupportDataDrivenLensFlare: 1
|
||||
m_ShadowType: 1
|
||||
m_LocalShadowsSupported: 0
|
||||
m_LocalShadowsAtlasResolution: 256
|
||||
m_MaxPixelLights: 0
|
||||
m_ShadowAtlasResolution: 256
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_VolumeFrameworkUpdateMode: 0
|
||||
m_Textures:
|
||||
blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3}
|
||||
bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3}
|
||||
m_PrefilteringModeMainLightShadows: 1
|
||||
m_PrefilteringModeAdditionalLight: 4
|
||||
m_PrefilteringModeAdditionalLightShadows: 1
|
||||
m_PrefilterXRKeywords: 0
|
||||
m_PrefilteringModeForwardPlus: 1
|
||||
m_PrefilteringModeDeferredRendering: 1
|
||||
m_PrefilteringModeScreenSpaceOcclusion: 1
|
||||
m_PrefilterDebugKeywords: 0
|
||||
m_PrefilterWriteRenderingLayers: 0
|
||||
m_PrefilterHDROutput: 0
|
||||
m_PrefilterSSAODepthNormals: 0
|
||||
m_PrefilterSSAOSourceDepthLow: 0
|
||||
m_PrefilterSSAOSourceDepthMedium: 0
|
||||
m_PrefilterSSAOSourceDepthHigh: 0
|
||||
m_PrefilterSSAOInterleaved: 0
|
||||
m_PrefilterSSAOBlueNoise: 0
|
||||
m_PrefilterSSAOSampleCountLow: 0
|
||||
m_PrefilterSSAOSampleCountMedium: 0
|
||||
m_PrefilterSSAOSampleCountHigh: 0
|
||||
m_PrefilterDBufferMRT1: 0
|
||||
m_PrefilterDBufferMRT2: 0
|
||||
m_PrefilterDBufferMRT3: 0
|
||||
m_PrefilterSoftShadowsQualityLow: 0
|
||||
m_PrefilterSoftShadowsQualityMedium: 0
|
||||
m_PrefilterSoftShadowsQualityHigh: 0
|
||||
m_PrefilterSoftShadows: 0
|
||||
m_PrefilterScreenCoord: 0
|
||||
m_PrefilterNativeRenderPass: 0
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_ShadowCascades: 0
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b9a81bc6c945d4299ba496b54f270aee
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 645c38bb4de3549b4857a287d83f3dc6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ba062aa6c92b140379dbc06b43dd3b9b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8a0c9218a650547d98138cd835033977
|
||||
folderAsset: yes
|
||||
timeCreated: 1484670163
|
||||
licenseType: Store
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
@@ -0,0 +1,134 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 727a75301c3d24613a3ebcec4a24c2c8
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
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
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMasterTextureLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 0
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 0
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
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: 2
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 0
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 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
|
||||
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
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,654 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &1
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_PixelRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 45
|
||||
width: 1666
|
||||
height: 958
|
||||
m_ShowMode: 4
|
||||
m_Title:
|
||||
m_RootView: {fileID: 6}
|
||||
m_MinSize: {x: 950, y: 542}
|
||||
m_MaxSize: {x: 10000, y: 10000}
|
||||
--- !u!114 &2
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 466
|
||||
width: 290
|
||||
height: 442
|
||||
m_MinSize: {x: 234, y: 271}
|
||||
m_MaxSize: {x: 10004, y: 10021}
|
||||
m_ActualView: {fileID: 14}
|
||||
m_Panes:
|
||||
- {fileID: 14}
|
||||
m_Selected: 0
|
||||
m_LastSelected: 0
|
||||
--- !u!114 &3
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children:
|
||||
- {fileID: 4}
|
||||
- {fileID: 2}
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 973
|
||||
y: 0
|
||||
width: 290
|
||||
height: 908
|
||||
m_MinSize: {x: 234, y: 492}
|
||||
m_MaxSize: {x: 10004, y: 14042}
|
||||
vertical: 1
|
||||
controlID: 226
|
||||
--- !u!114 &4
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 290
|
||||
height: 466
|
||||
m_MinSize: {x: 204, y: 221}
|
||||
m_MaxSize: {x: 4004, y: 4021}
|
||||
m_ActualView: {fileID: 17}
|
||||
m_Panes:
|
||||
- {fileID: 17}
|
||||
m_Selected: 0
|
||||
m_LastSelected: 0
|
||||
--- !u!114 &5
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 466
|
||||
width: 973
|
||||
height: 442
|
||||
m_MinSize: {x: 202, y: 221}
|
||||
m_MaxSize: {x: 4002, y: 4021}
|
||||
m_ActualView: {fileID: 15}
|
||||
m_Panes:
|
||||
- {fileID: 15}
|
||||
m_Selected: 0
|
||||
m_LastSelected: 0
|
||||
--- !u!114 &6
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12008, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children:
|
||||
- {fileID: 7}
|
||||
- {fileID: 8}
|
||||
- {fileID: 9}
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1666
|
||||
height: 958
|
||||
m_MinSize: {x: 950, y: 542}
|
||||
m_MaxSize: {x: 10000, y: 10000}
|
||||
--- !u!114 &7
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12011, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1666
|
||||
height: 30
|
||||
m_MinSize: {x: 0, y: 0}
|
||||
m_MaxSize: {x: 0, y: 0}
|
||||
m_LastLoadedLayoutName: Tutorial
|
||||
--- !u!114 &8
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children:
|
||||
- {fileID: 10}
|
||||
- {fileID: 3}
|
||||
- {fileID: 11}
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 30
|
||||
width: 1666
|
||||
height: 908
|
||||
m_MinSize: {x: 713, y: 492}
|
||||
m_MaxSize: {x: 18008, y: 14042}
|
||||
vertical: 0
|
||||
controlID: 74
|
||||
--- !u!114 &9
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12042, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 938
|
||||
width: 1666
|
||||
height: 20
|
||||
m_MinSize: {x: 0, y: 0}
|
||||
m_MaxSize: {x: 0, y: 0}
|
||||
--- !u!114 &10
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children:
|
||||
- {fileID: 12}
|
||||
- {fileID: 5}
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 973
|
||||
height: 908
|
||||
m_MinSize: {x: 202, y: 442}
|
||||
m_MaxSize: {x: 4002, y: 8042}
|
||||
vertical: 1
|
||||
controlID: 75
|
||||
--- !u!114 &11
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 1263
|
||||
y: 0
|
||||
width: 403
|
||||
height: 908
|
||||
m_MinSize: {x: 277, y: 71}
|
||||
m_MaxSize: {x: 4002, y: 4021}
|
||||
m_ActualView: {fileID: 13}
|
||||
m_Panes:
|
||||
- {fileID: 13}
|
||||
m_Selected: 0
|
||||
m_LastSelected: 0
|
||||
--- !u!114 &12
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 973
|
||||
height: 466
|
||||
m_MinSize: {x: 202, y: 221}
|
||||
m_MaxSize: {x: 4002, y: 4021}
|
||||
m_ActualView: {fileID: 16}
|
||||
m_Panes:
|
||||
- {fileID: 16}
|
||||
m_Selected: 0
|
||||
m_LastSelected: 0
|
||||
--- !u!114 &13
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_AutoRepaintOnSceneChange: 0
|
||||
m_MinSize: {x: 275, y: 50}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_TitleContent:
|
||||
m_Text: Inspector
|
||||
m_Image: {fileID: -6905738622615590433, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_DepthBufferBits: 0
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 2
|
||||
y: 19
|
||||
width: 401
|
||||
height: 887
|
||||
m_ScrollPosition: {x: 0, y: 0}
|
||||
m_InspectorMode: 0
|
||||
m_PreviewResizer:
|
||||
m_CachedPref: -160
|
||||
m_ControlHash: -371814159
|
||||
m_PrefName: Preview_InspectorPreview
|
||||
m_PreviewWindow: {fileID: 0}
|
||||
--- !u!114 &14
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_AutoRepaintOnSceneChange: 0
|
||||
m_MinSize: {x: 230, y: 250}
|
||||
m_MaxSize: {x: 10000, y: 10000}
|
||||
m_TitleContent:
|
||||
m_Text: Project
|
||||
m_Image: {fileID: -7501376956915960154, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_DepthBufferBits: 0
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 2
|
||||
y: 19
|
||||
width: 286
|
||||
height: 421
|
||||
m_SearchFilter:
|
||||
m_NameFilter:
|
||||
m_ClassNames: []
|
||||
m_AssetLabels: []
|
||||
m_AssetBundleNames: []
|
||||
m_VersionControlStates: []
|
||||
m_ReferencingInstanceIDs:
|
||||
m_ScenePaths: []
|
||||
m_ShowAllHits: 0
|
||||
m_SearchArea: 0
|
||||
m_Folders:
|
||||
- Assets
|
||||
m_ViewMode: 0
|
||||
m_StartGridSize: 64
|
||||
m_LastFolders:
|
||||
- Assets
|
||||
m_LastFoldersGridSize: -1
|
||||
m_LastProjectPath: /Users/danielbrauer/Unity Projects/New Unity Project 47
|
||||
m_IsLocked: 0
|
||||
m_FolderTreeState:
|
||||
scrollPos: {x: 0, y: 0}
|
||||
m_SelectedIDs: ee240000
|
||||
m_LastClickedID: 9454
|
||||
m_ExpandedIDs: ee24000000ca9a3bffffff7f
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
m_OriginalName:
|
||||
m_EditFieldRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 0
|
||||
height: 0
|
||||
m_UserData: 0
|
||||
m_IsWaitingForDelay: 0
|
||||
m_IsRenaming: 0
|
||||
m_OriginalEventType: 11
|
||||
m_IsRenamingFilename: 1
|
||||
m_ClientGUIView: {fileID: 0}
|
||||
m_SearchString:
|
||||
m_CreateAssetUtility:
|
||||
m_EndAction: {fileID: 0}
|
||||
m_InstanceID: 0
|
||||
m_Path:
|
||||
m_Icon: {fileID: 0}
|
||||
m_ResourceFile:
|
||||
m_AssetTreeState:
|
||||
scrollPos: {x: 0, y: 0}
|
||||
m_SelectedIDs: 68fbffff
|
||||
m_LastClickedID: 0
|
||||
m_ExpandedIDs: ee240000
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
m_OriginalName:
|
||||
m_EditFieldRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 0
|
||||
height: 0
|
||||
m_UserData: 0
|
||||
m_IsWaitingForDelay: 0
|
||||
m_IsRenaming: 0
|
||||
m_OriginalEventType: 11
|
||||
m_IsRenamingFilename: 1
|
||||
m_ClientGUIView: {fileID: 0}
|
||||
m_SearchString:
|
||||
m_CreateAssetUtility:
|
||||
m_EndAction: {fileID: 0}
|
||||
m_InstanceID: 0
|
||||
m_Path:
|
||||
m_Icon: {fileID: 0}
|
||||
m_ResourceFile:
|
||||
m_ListAreaState:
|
||||
m_SelectedInstanceIDs: 68fbffff
|
||||
m_LastClickedInstanceID: -1176
|
||||
m_HadKeyboardFocusLastEvent: 0
|
||||
m_ExpandedInstanceIDs: c6230000
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
m_OriginalName:
|
||||
m_EditFieldRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 0
|
||||
height: 0
|
||||
m_UserData: 0
|
||||
m_IsWaitingForDelay: 0
|
||||
m_IsRenaming: 0
|
||||
m_OriginalEventType: 11
|
||||
m_IsRenamingFilename: 1
|
||||
m_ClientGUIView: {fileID: 0}
|
||||
m_CreateAssetUtility:
|
||||
m_EndAction: {fileID: 0}
|
||||
m_InstanceID: 0
|
||||
m_Path:
|
||||
m_Icon: {fileID: 0}
|
||||
m_ResourceFile:
|
||||
m_NewAssetIndexInList: -1
|
||||
m_ScrollPosition: {x: 0, y: 0}
|
||||
m_GridSize: 64
|
||||
m_DirectoriesAreaWidth: 110
|
||||
--- !u!114 &15
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_AutoRepaintOnSceneChange: 1
|
||||
m_MinSize: {x: 200, y: 200}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_TitleContent:
|
||||
m_Text: Game
|
||||
m_Image: {fileID: -2087823869225018852, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_DepthBufferBits: 32
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 19
|
||||
width: 971
|
||||
height: 421
|
||||
m_MaximizeOnPlay: 0
|
||||
m_Gizmos: 0
|
||||
m_Stats: 0
|
||||
m_SelectedSizes: 00000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_TargetDisplay: 0
|
||||
m_ZoomArea:
|
||||
m_HRangeLocked: 0
|
||||
m_VRangeLocked: 0
|
||||
m_HBaseRangeMin: -242.75
|
||||
m_HBaseRangeMax: 242.75
|
||||
m_VBaseRangeMin: -101
|
||||
m_VBaseRangeMax: 101
|
||||
m_HAllowExceedBaseRangeMin: 1
|
||||
m_HAllowExceedBaseRangeMax: 1
|
||||
m_VAllowExceedBaseRangeMin: 1
|
||||
m_VAllowExceedBaseRangeMax: 1
|
||||
m_ScaleWithWindow: 0
|
||||
m_HSlider: 0
|
||||
m_VSlider: 0
|
||||
m_IgnoreScrollWheelUntilClicked: 0
|
||||
m_EnableMouseInput: 1
|
||||
m_EnableSliderZoom: 0
|
||||
m_UniformScale: 1
|
||||
m_UpDirection: 1
|
||||
m_DrawArea:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 17
|
||||
width: 971
|
||||
height: 404
|
||||
m_Scale: {x: 2, y: 2}
|
||||
m_Translation: {x: 485.5, y: 202}
|
||||
m_MarginLeft: 0
|
||||
m_MarginRight: 0
|
||||
m_MarginTop: 0
|
||||
m_MarginBottom: 0
|
||||
m_LastShownAreaInsideMargins:
|
||||
serializedVersion: 2
|
||||
x: -242.75
|
||||
y: -101
|
||||
width: 485.5
|
||||
height: 202
|
||||
m_MinimalGUI: 1
|
||||
m_defaultScale: 2
|
||||
m_TargetTexture: {fileID: 0}
|
||||
m_CurrentColorSpace: 0
|
||||
m_LastWindowPixelSize: {x: 1942, y: 842}
|
||||
m_ClearInEditMode: 1
|
||||
m_NoCameraWarning: 1
|
||||
m_LowResolutionForAspectRatios: 01000000000100000100
|
||||
--- !u!114 &16
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_AutoRepaintOnSceneChange: 1
|
||||
m_MinSize: {x: 200, y: 200}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_TitleContent:
|
||||
m_Text: Scene
|
||||
m_Image: {fileID: 2318424515335265636, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_DepthBufferBits: 32
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 19
|
||||
width: 971
|
||||
height: 445
|
||||
m_SceneLighting: 1
|
||||
lastFramingTime: 0
|
||||
m_2DMode: 0
|
||||
m_isRotationLocked: 0
|
||||
m_AudioPlay: 0
|
||||
m_Position:
|
||||
m_Target: {x: 0, y: 0, z: 0}
|
||||
speed: 2
|
||||
m_Value: {x: 0, y: 0, z: 0}
|
||||
m_RenderMode: 0
|
||||
m_ValidateTrueMetals: 0
|
||||
m_SceneViewState:
|
||||
showFog: 1
|
||||
showMaterialUpdate: 0
|
||||
showSkybox: 1
|
||||
showFlares: 1
|
||||
showImageEffects: 1
|
||||
grid:
|
||||
xGrid:
|
||||
m_Target: 0
|
||||
speed: 2
|
||||
m_Value: 0
|
||||
yGrid:
|
||||
m_Target: 1
|
||||
speed: 2
|
||||
m_Value: 1
|
||||
zGrid:
|
||||
m_Target: 0
|
||||
speed: 2
|
||||
m_Value: 0
|
||||
m_Rotation:
|
||||
m_Target: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226}
|
||||
speed: 2
|
||||
m_Value: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226}
|
||||
m_Size:
|
||||
m_Target: 10
|
||||
speed: 2
|
||||
m_Value: 10
|
||||
m_Ortho:
|
||||
m_Target: 0
|
||||
speed: 2
|
||||
m_Value: 0
|
||||
m_LastSceneViewRotation: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_LastSceneViewOrtho: 0
|
||||
m_ReplacementShader: {fileID: 0}
|
||||
m_ReplacementString:
|
||||
m_LastLockedObject: {fileID: 0}
|
||||
m_ViewIsLockedToObject: 0
|
||||
--- !u!114 &17
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 1
|
||||
m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_AutoRepaintOnSceneChange: 0
|
||||
m_MinSize: {x: 200, y: 200}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_TitleContent:
|
||||
m_Text: Hierarchy
|
||||
m_Image: {fileID: -590624980919486359, guid: 0000000000000000d000000000000000,
|
||||
type: 0}
|
||||
m_Tooltip:
|
||||
m_DepthBufferBits: 0
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 2
|
||||
y: 19
|
||||
width: 286
|
||||
height: 445
|
||||
m_TreeViewState:
|
||||
scrollPos: {x: 0, y: 0}
|
||||
m_SelectedIDs: 68fbffff
|
||||
m_LastClickedID: -1176
|
||||
m_ExpandedIDs: 7efbffff00000000
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
m_OriginalName:
|
||||
m_EditFieldRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 0
|
||||
height: 0
|
||||
m_UserData: 0
|
||||
m_IsWaitingForDelay: 0
|
||||
m_IsRenaming: 0
|
||||
m_OriginalEventType: 11
|
||||
m_IsRenamingFilename: 0
|
||||
m_ClientGUIView: {fileID: 0}
|
||||
m_SearchString:
|
||||
m_ExpandedScenes:
|
||||
-
|
||||
m_CurrenRootInstanceID: 0
|
||||
m_Locked: 0
|
||||
m_CurrentSortingName: TransformSorting
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eabc9546105bf4accac1fd62a63e88e6
|
||||
timeCreated: 1487337779
|
||||
licenseType: Store
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5a9bcd70e6a4b4b05badaa72e827d8e0
|
||||
folderAsset: yes
|
||||
timeCreated: 1475835190
|
||||
licenseType: Store
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user