This commit is contained in:
2026-07-06 02:10:51 +08:00
parent deaffb85bf
commit b538c5ab93
7 changed files with 822 additions and 1 deletions
@@ -31,7 +31,7 @@ Material:
- _EchoRadius: 39.41617 - _EchoRadius: 39.41617
- _EchoWidth: 2.5 - _EchoWidth: 2.5
- _LightSoftness: 1 - _LightSoftness: 1
- _MinBrightness: 1 - _MinBrightness: 0
m_Colors: m_Colors:
- _DarknessColor: {r: 0.01, g: 0.01, b: 0.02, a: 1} - _DarknessColor: {r: 0.01, g: 0.01, b: 0.02, a: 1}
- _EchoCenter: {r: -2.4399998, g: -1.5000057, b: 0, a: 0} - _EchoCenter: {r: -2.4399998, g: -1.5000057, b: 0, a: 0}
+509
View File
@@ -1361,6 +1361,7 @@ RectTransform:
m_Children: m_Children:
- {fileID: 1022684515} - {fileID: 1022684515}
- {fileID: 1048541269} - {fileID: 1048541269}
- {fileID: 1479992326}
m_Father: {fileID: 1036666439} m_Father: {fileID: 1036666439}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
@@ -1921,6 +1922,8 @@ MonoBehaviour:
settingsButton: {fileID: 0} settingsButton: {fileID: 0}
creditsButton: {fileID: 995992462} creditsButton: {fileID: 995992462}
quitButton: {fileID: 0} quitButton: {fileID: 0}
storyReplayButton: {fileID: 977847656}
storyPVPlayer: {fileID: 0}
settingsPanel: {fileID: 0} settingsPanel: {fileID: 0}
settingsBackButton: {fileID: 0} settingsBackButton: {fileID: 0}
creditsPanel: {fileID: 1048541268} creditsPanel: {fileID: 1048541268}
@@ -2346,6 +2349,8 @@ MonoBehaviour:
settingsButton: {fileID: 0} settingsButton: {fileID: 0}
creditsButton: {fileID: 0} creditsButton: {fileID: 0}
quitButton: {fileID: 0} quitButton: {fileID: 0}
storyReplayButton: {fileID: 0}
storyPVPlayer: {fileID: 0}
settingsPanel: {fileID: 2013394273} settingsPanel: {fileID: 2013394273}
settingsBackButton: {fileID: 774721830} settingsBackButton: {fileID: 774721830}
creditsPanel: {fileID: 0} creditsPanel: {fileID: 0}
@@ -2947,6 +2952,128 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 0575607a807dc2d4c83554aa364916e4, type: 3} m_Script: {fileID: 11500000, guid: 0575607a807dc2d4c83554aa364916e4, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!1 &1365782246
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 7
m_Component:
- component: {fileID: 1365782247}
- component: {fileID: 1365782250}
- component: {fileID: 1365782249}
- component: {fileID: 1365782248}
m_Layer: 0
m_HasEditorInfo: 1
m_Name: SkipButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1365782247
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1365782246}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1.3, y: 1.3, z: 1.3}
m_ConstrainProportionsScale: 1
m_Children:
- {fileID: 1779218691}
m_Father: {fileID: 1479992326}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: -30, y: 30}
m_SizeDelta: {x: 120, y: 50}
m_Pivot: {x: 1, y: 0}
--- !u!114 &1365782248
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1365782246}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 1365782249}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!114 &1365782249
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1365782246}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 0.3}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &1365782250
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1365782246}
m_CullTransparentMesh: 1
--- !u!1 &1378071327 --- !u!1 &1378071327
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -3150,6 +3277,235 @@ MonoBehaviour:
m_EditorClassIdentifier: m_EditorClassIdentifier:
m_HorizontalFit: 2 m_HorizontalFit: 2
m_VerticalFit: 2 m_VerticalFit: 2
--- !u!1 &1479992325
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 7
m_Component:
- component: {fileID: 1479992326}
- component: {fileID: 1479992329}
- component: {fileID: 1479992328}
- component: {fileID: 1479992327}
- component: {fileID: 1479992331}
- component: {fileID: 1479992330}
m_Layer: 0
m_HasEditorInfo: 1
m_Name: VideoOverlay
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &1479992326
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1479992325}
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:
- {fileID: 1718834982}
- {fileID: 1365782247}
m_Father: {fileID: 897692926}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1479992327
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1479992325}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d51e1907b754a7449b9a571bef4c39db, type: 3}
m_Name:
m_EditorClassIdentifier:
videoOverlay: {fileID: 1479992325}
videoDisplay: {fileID: 0}
skipButton: {fileID: 0}
videoPlayer: {fileID: 1479992329}
--- !u!82 &1479992328
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1479992325}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 0}
m_audioClip: {fileID: 0}
m_PlayOnAwake: 1
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 1
MaxDistance: 500
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!328 &1479992329
VideoPlayer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1479992325}
m_Enabled: 1
m_VideoClip: {fileID: 32900000, guid: e9ea16258fb7da2499288a67fcdffb2a, type: 3}
m_TargetCameraAlpha: 1
m_TargetCamera3DLayout: 0
m_TargetCamera: {fileID: 0}
m_TargetTexture: {fileID: 0}
m_TimeReference: 0
m_TargetMaterialRenderer: {fileID: 0}
m_TargetMaterialProperty: <noninit>
m_RenderMode: 2
m_AspectRatio: 2
m_DataSource: 0
m_TimeUpdateMode: 2
m_PlaybackSpeed: 1
m_AudioOutputMode: 1
m_TargetAudioSources:
- {fileID: 1479992328}
m_DirectAudioVolumes:
- 1
m_Url:
m_EnabledAudioTracks: 01
m_DirectAudioMutes: 00
m_ControlledAudioTrackCount: 1
m_PlayOnAwake: 0
m_SkipOnDrop: 1
m_Looping: 0
m_WaitForFirstFrame: 1
m_FrameReadyEventEnabled: 0
m_VideoShaders: []
--- !u!114 &1479992330
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1479992325}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &1479992331
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1479992325}
m_CullTransparentMesh: 1
--- !u!1 &1492109979 --- !u!1 &1492109979
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -3688,6 +4044,159 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 123025e1710a13c46bf4c72b4a69c62d, type: 3} m_Script: {fileID: 11500000, guid: 123025e1710a13c46bf4c72b4a69c62d, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!1 &1718834981
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 7
m_Component:
- component: {fileID: 1718834982}
- component: {fileID: 1718834984}
- component: {fileID: 1718834983}
m_Layer: 0
m_HasEditorInfo: 1
m_Name: VideoDisplay
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1718834982
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1718834981}
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: 1479992326}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1718834983
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1718834981}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Texture: {fileID: 0}
m_UVRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
--- !u!222 &1718834984
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1718834981}
m_CullTransparentMesh: 1
--- !u!1 &1779218690
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 7
m_Component:
- component: {fileID: 1779218691}
- component: {fileID: 1779218693}
- component: {fileID: 1779218692}
m_Layer: 0
m_HasEditorInfo: 1
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1779218691
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1779218690}
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: 1365782247}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1779218692
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1779218690}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 36
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 3
m_MaxSize: 40
m_Alignment: 4
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: "\u8DF3\u8FC7 >>"
--- !u!222 &1779218693
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1779218690}
m_CullTransparentMesh: 1
--- !u!1 &1801267574 --- !u!1 &1801267574
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
Binary file not shown.
+18
View File
@@ -0,0 +1,18 @@
fileFormatVersion: 2
guid: WnNK5CurUX7eLhb2j9pccpst4FlQvWWo1dIvwTsstWgBgYCFcFKyBGs=
VideoClipImporter:
externalObjects: {}
serializedVersion: 2
frameRange: 0
startFrame: -1
endFrame: -1
colorSpace: 0
deinterlace: 0
encodeAlpha: 0
flipVertical: 0
flipHorizontal: 0
importAudio: 1
targetSettings: {}
userData:
assetBundleName:
assetBundleVariant:
+32
View File
@@ -15,6 +15,10 @@ namespace GameFramework
[SerializeField] Button settingsButton; [SerializeField] Button settingsButton;
[SerializeField] Button creditsButton; [SerializeField] Button creditsButton;
[SerializeField] Button quitButton; [SerializeField] Button quitButton;
[SerializeField] Button storyReplayButton;
[Header("剧情 PV")]
[SerializeField] StoryPVPlayer storyPVPlayer;
[Header("Settings Panel")] [Header("Settings Panel")]
[SerializeField] GameObject settingsPanel; [SerializeField] GameObject settingsPanel;
@@ -35,6 +39,15 @@ namespace GameFramework
creditsButton = FindButton("CreditsButton"); creditsButton = FindButton("CreditsButton");
if (quitButton == null) if (quitButton == null)
quitButton = FindButton("QuitButton"); quitButton = FindButton("QuitButton");
if (storyReplayButton == null)
storyReplayButton = FindButton("StoryReplayButton");
if (storyPVPlayer == null)
{
// 使用 FindObjectsByType 包含 inactive 对象,避免找不到隐藏的 VideoOverlay
var players = FindObjectsByType<StoryPVPlayer>(FindObjectsInactive.Include, FindObjectsSortMode.None);
if (players.Length > 0)
storyPVPlayer = players[0];
}
if (settingsPanel == null) if (settingsPanel == null)
settingsPanel = GameObject.Find("SettingsPanel"); settingsPanel = GameObject.Find("SettingsPanel");
@@ -55,6 +68,12 @@ namespace GameFramework
creditsButton.onClick.AddListener(OnCreditsClick); creditsButton.onClick.AddListener(OnCreditsClick);
if (quitButton != null) if (quitButton != null)
quitButton.onClick.AddListener(OnQuitClick); quitButton.onClick.AddListener(OnQuitClick);
if (storyReplayButton != null)
{
// 避免 Inspector 中已绑定的事件导致重复触发
storyReplayButton.onClick.RemoveAllListeners();
storyReplayButton.onClick.AddListener(OnStoryReplayClick);
}
if (settingsBackButton != null) if (settingsBackButton != null)
settingsBackButton.onClick.AddListener(OnSettingsBackClick); settingsBackButton.onClick.AddListener(OnSettingsBackClick);
@@ -119,5 +138,18 @@ namespace GameFramework
Application.Quit(); Application.Quit();
#endif #endif
} }
void OnStoryReplayClick()
{
if (storyPVPlayer != null)
{
Debug.Log($"[MainMenu] 播放 PV, StoryPVPlayer on: {storyPVPlayer.gameObject.name}");
storyPVPlayer.Play();
}
else
{
Debug.LogWarning("[MainMenu] StoryPVPlayer 未配置!");
}
}
} }
} }
+251
View File
@@ -0,0 +1,251 @@
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
using System.Collections;
namespace GameFramework
{
/// <summary>
/// 剧情 PV 播放器 —— 点击 StoryReplayButton 后弹出全屏视频覆盖层播放 PV。
/// 播放完毕自动关闭,也可点击"跳过"按钮立即关闭。
///
/// 搭建:
/// 1. 在 MainMenu Canvas 下创建 VideoOverlay(初始 SetActive(false)
/// 2. 子物体:BG (全屏黑色 Image)、VideoDisplay (RawImage)、SkipButton (Button)
/// 3. 挂 VideoPlayer 组件,VideoClip 赋值为 pv.mp4
/// 4. 挂本脚本,Inspector 中关联各引用
/// </summary>
public class StoryPVPlayer : MonoBehaviour
{
[Header("覆盖层")]
[Tooltip("视频覆盖层根节点(初始隐藏)")]
[SerializeField] private GameObject videoOverlay;
[Header("视频显示")]
[Tooltip("全屏 RawImage 用于显示视频画面")]
[SerializeField] private RawImage videoDisplay;
[Header("跳过按钮")]
[Tooltip("右下角跳过按钮")]
[SerializeField] private Button skipButton;
[Header("视频播放器")]
[Tooltip("VideoPlayer 组件(挂在 VideoOverlay 或自身上)")]
[SerializeField] private VideoPlayer videoPlayer;
private RenderTexture _renderTexture;
private bool _isPlaying = false;
/// <summary>
/// 懒加载:确保所有引用都已初始化。
/// 使用 GetComponentsInChildren(true) 递归搜索(包括 inactive 子物体)。
/// </summary>
private void EnsureReferences()
{
// videoOverlay:默认就是自身(StoryPVPlayer 挂在 VideoOverlay 上)
if (videoOverlay == null)
{
// 递归搜索子物体中名为 "VideoOverlay" 的 GameObject
var transforms = GetComponentsInChildren<Transform>(true);
foreach (var t in transforms)
{
if (t.name == "VideoOverlay")
{
videoOverlay = t.gameObject;
break;
}
}
// 如果没找到,说明本脚本就挂在 VideoOverlay 上
if (videoOverlay == null)
videoOverlay = gameObject;
}
// 查找 RawImage(递归搜索 videoOverlay 的子物体,包括 inactive
if (videoDisplay == null && videoOverlay != null)
{
var displays = videoOverlay.GetComponentsInChildren<RawImage>(true);
if (displays.Length > 0)
videoDisplay = displays[0];
}
// 查找 SkipButton(递归搜索,按名称匹配避免找到其他按钮)
if (skipButton == null && videoOverlay != null)
{
var buttons = videoOverlay.GetComponentsInChildren<Button>(true);
foreach (var b in buttons)
{
if (b.name == "SkipButton")
{
skipButton = b;
skipButton.onClick.AddListener(Stop);
break;
}
}
}
// 查找 VideoPlayer:先查自身,再查 videoOverlay
if (videoPlayer == null)
videoPlayer = GetComponent<VideoPlayer>();
if (videoPlayer == null && videoOverlay != null)
videoPlayer = videoOverlay.GetComponent<VideoPlayer>();
// 订阅播放完成事件(只订阅一次)
if (videoPlayer != null)
videoPlayer.loopPointReached -= OnVideoFinished;
if (videoPlayer != null)
videoPlayer.loopPointReached += OnVideoFinished;
}
/// <summary>
/// 播放 PV:先激活覆盖层 → 初始化引用 → 创建 RenderTexture → 等一帧 → 开始播放。
/// </summary>
public void Play()
{
Debug.Log($"[StoryPVPlayer] Play() called, _isPlaying={_isPlaying}, gameObject.activeSelf={gameObject.activeSelf}");
if (_isPlaying)
{
Debug.Log("[StoryPVPlayer] 已在播放中,忽略本次点击");
return;
}
// 关键:本脚本所在的 GameObject 可能初始为 inactive,必须先激活才能启动协程。
// 这里先把 gameObject.active 设为 true,让 MonoBehaviour 能正常工作。
gameObject.SetActive(true);
// 确保所有引用已初始化(可能在 Inspector 中未赋值,通过递归搜索查找)
EnsureReferences();
// 确保 videoOverlay 被赋值
if (videoOverlay == null)
videoOverlay = gameObject;
// 激活覆盖层
if (videoOverlay != null && videoOverlay != gameObject)
videoOverlay.SetActive(true);
Debug.Log($"[StoryPVPlayer] 引用检查:videoOverlay={videoOverlay != null}, videoDisplay={videoDisplay != null}, videoPlayer={videoPlayer != null}");
if (videoPlayer == null || videoDisplay == null || videoOverlay == null)
{
Debug.LogError($"[StoryPVPlayer] 引用未配置!videoOverlay={videoOverlay != null}, videoDisplay={videoDisplay != null}, videoPlayer={videoPlayer != null}。请检查 Inspector。");
if (videoOverlay != null) videoOverlay.SetActive(false);
return;
}
// 检查视频文件
if (videoPlayer.clip == null)
{
Debug.LogWarning("[StoryPVPlayer] VideoClip 未设置,尝试从 Resources 加载...");
videoPlayer.clip = Resources.Load<VideoClip>("pv");
if (videoPlayer.clip == null)
{
Debug.LogError("[StoryPVPlayer] 无法加载 pv 视频文件!请将 pv.mp4 放入 Resources 文件夹,或在 Inspector 中赋值 VideoClip。");
videoOverlay.SetActive(false);
return;
}
}
// 创建 RenderTexture(匹配视频分辨率,如果未知则用屏幕分辨率)
int width = videoPlayer.clip != null ? (int)videoPlayer.clip.width : Screen.width;
int height = videoPlayer.clip != null ? (int)videoPlayer.clip.height : Screen.height;
if (_renderTexture != null)
{
_renderTexture.Release();
Destroy(_renderTexture);
}
_renderTexture = new RenderTexture(width, height, 0);
videoPlayer.targetTexture = _renderTexture;
videoDisplay.texture = _renderTexture;
Debug.Log("[StoryPVPlayer] 启动协程,延迟一帧播放");
// 启动协程,等待一帧后再播放(Unity VideoPlayer 在 SetActive 同帧内调用 Play 无效)
StartCoroutine(PlayVideoCoroutine());
}
/// <summary>
/// 延迟一帧后播放视频(解决 VideoPlayer 在激活同帧内调用 Play 无效的问题)。
/// </summary>
private IEnumerator PlayVideoCoroutine()
{
_isPlaying = true;
Debug.Log($"[StoryPVPlayer] PlayVideoCoroutine started, activeSelf={gameObject.activeSelf}");
// 等待一帧,让 VideoPlayer 完成初始化
yield return null;
Debug.Log($"[StoryPVPlayer] 协程等待一帧后:videoPlayer={videoPlayer != null}, isActive={gameObject.activeSelf}");
if (videoPlayer == null)
{
Debug.LogError("[StoryPVPlayer] 协程中 videoPlayer 为 null,无法播放");
_isPlaying = false;
yield break;
}
// 播放
videoPlayer.Play();
Debug.Log($"[StoryPVPlayer] 已调用 videoPlayer.Play(), isPlaying={videoPlayer.isPlaying}");
// 暂停背景音乐
if (AudioManager.Instance != null)
AudioManager.Instance.PauseBGM();
Debug.Log("[StoryPVPlayer] 开始播放 PV");
}
/// <summary>
/// 停止播放:停止 VideoPlayer → 释放 RenderTexture → 隐藏覆盖层。
/// </summary>
public void Stop()
{
_isPlaying = false;
if (videoPlayer != null)
videoPlayer.Stop();
if (_renderTexture != null)
{
_renderTexture.Release();
Destroy(_renderTexture);
_renderTexture = null;
}
if (videoDisplay != null)
videoDisplay.texture = null;
if (videoOverlay != null)
videoOverlay.SetActive(false);
// 恢复背景音乐
if (AudioManager.Instance != null)
AudioManager.Instance.UnpauseBGM();
Debug.Log("[StoryPVPlayer] PV 播放已停止");
}
/// <summary>
/// 视频播放完毕回调(自动关闭覆盖层)。
/// </summary>
private void OnVideoFinished(VideoPlayer source)
{
Debug.Log("[StoryPVPlayer] PV 播放完毕");
Stop();
}
private void OnDestroy()
{
if (videoPlayer != null)
videoPlayer.loopPointReached -= OnVideoFinished;
if (_renderTexture != null)
{
_renderTexture.Release();
Destroy(_renderTexture);
}
}
}
}
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: W38e4CukU3yODrWFvYfwfZp4T6XgBfapY8kwwHspsVk3JNoS/3ZuzTY=
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: