diff --git a/Assets/DC/场景01/女巫/女巫扔幽灵.fbx b/Assets/DC/场景01/女巫/女巫扔幽灵.fbx new file mode 100644 index 00000000..395cf957 Binary files /dev/null and b/Assets/DC/场景01/女巫/女巫扔幽灵.fbx differ diff --git a/Assets/DC/场景01/女巫/女巫扔幽灵.fbx.meta b/Assets/DC/场景01/女巫/女巫扔幽灵.fbx.meta new file mode 100644 index 00000000..aae4f9b1 --- /dev/null +++ b/Assets/DC/场景01/女巫/女巫扔幽灵.fbx.meta @@ -0,0 +1,138 @@ +fileFormatVersion: 2 +guid: c7089232fc29b014f970636baafa5e8f +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: + - serializedVersion: 16 + name: "\u6254\u5E7D\u7075" + takeName: Take 001 + internalID: 1827226128182048838 + firstFrame: 0 + lastFrame: 100 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 1 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/DC/场景04/幽灵/幽灵02.controller b/Assets/DC/场景04/幽灵/幽灵02.controller index 831baeea..80a6740a 100644 --- a/Assets/DC/场景04/幽灵/幽灵02.controller +++ b/Assets/DC/场景04/幽灵/幽灵02.controller @@ -105,10 +105,10 @@ AnimatorStateMachine: m_ChildStates: - serializedVersion: 1 m_State: {fileID: 2841690997665387767} - m_Position: {x: 450, y: 290, z: 0} + m_Position: {x: 390, y: 370, z: 0} - serializedVersion: 1 m_State: {fileID: -9039481108547387752} - m_Position: {x: 762.47046, y: 353.65445, z: 0} + m_Position: {x: 690, y: 410, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] diff --git a/Assets/_SnowWhite/Prefabs/DreamAppleEvent/DreamWitch.controller b/Assets/_SnowWhite/Prefabs/DreamAppleEvent/DreamWitch.controller index 01544ef7..d163c311 100644 --- a/Assets/_SnowWhite/Prefabs/DreamAppleEvent/DreamWitch.controller +++ b/Assets/_SnowWhite/Prefabs/DreamAppleEvent/DreamWitch.controller @@ -1,5 +1,27 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1101 &-9219469375051992505 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 7820496553238198887} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.94 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1107 &-7501048581804035218 AnimatorStateMachine: serializedVersion: 6 @@ -11,10 +33,13 @@ AnimatorStateMachine: m_ChildStates: - serializedVersion: 1 m_State: {fileID: -4661813889618432727} - m_Position: {x: 260, y: 400, z: 0} + m_Position: {x: 80, y: 450, z: 0} - serializedVersion: 1 m_State: {fileID: 7820496553238198887} m_Position: {x: 260, y: 240, z: 0} + - serializedVersion: 1 + m_State: {fileID: 1069791650338107702} + m_Position: {x: 460, y: 450, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] @@ -37,6 +62,7 @@ AnimatorState: m_CycleOffset: 0 m_Transitions: - {fileID: 8977837539387090479} + - {fileID: 4495544168063020523} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -142,6 +168,85 @@ AnimatorController: m_IKPass: 0 m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} +--- !u!1102 &1069791650338107702 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: "\u6254\u5E7D\u7075" + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 6536301934859382806} + - {fileID: -9219469375051992505} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 1827226128182048838, guid: c7089232fc29b014f970636baafa5e8f, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &4495544168063020523 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: Summon + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 1069791650338107702} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &6536301934859382806 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: Throw + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -4661813889618432727} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.94 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1102 &7820496553238198887 AnimatorState: serializedVersion: 6 @@ -154,6 +259,7 @@ AnimatorState: m_CycleOffset: 0 m_Transitions: - {fileID: -3457870087006147639} + - {fileID: 8595878504398405683} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -170,7 +276,7 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: ---- !u!1101 &8977837539387090479 +--- !u!1101 &8595878504398405683 AnimatorStateTransition: m_ObjectHideFlags: 1 m_CorrespondingSourceObject: {fileID: 0} @@ -179,9 +285,31 @@ AnimatorStateTransition: m_Name: m_Conditions: - m_ConditionMode: 1 - m_ConditionEvent: Idle + m_ConditionEvent: Summon m_EventTreshold: 0 m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 1069791650338107702} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.9 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &8977837539387090479 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} m_DstState: {fileID: 7820496553238198887} m_Solo: 0 m_Mute: 0 diff --git a/Assets/_SnowWhite/Scenes/GongSi1Lou.unity b/Assets/_SnowWhite/Scenes/GongSi1Lou.unity index 23b8c57d..6b858a5d 100644 --- a/Assets/_SnowWhite/Scenes/GongSi1Lou.unity +++ b/Assets/_SnowWhite/Scenes/GongSi1Lou.unity @@ -288482,8 +288482,8 @@ MonoBehaviour: swordAttachPoint: {fileID: 0} poisonApplePrefab: {fileID: 6932340588733953491, guid: 08c07a1efc6272a4e9c2dc8e60cb5aff, type: 3} - targetAppleCount: 2 - appleSpawnInterval: 1.5 + targetAppleCount: 30 + appleSpawnInterval: 4 ghostPrefab: {fileID: 1012488050875606214, guid: d2133e78601c21643b85faf7ac37ff4b, type: 3} ghostSpawnInterval: 15 diff --git a/Assets/_SnowWhite/Scripts/AI/SpiritController.cs b/Assets/_SnowWhite/Scripts/AI/SpiritController.cs index 722e3919..f1529c3b 100644 --- a/Assets/_SnowWhite/Scripts/AI/SpiritController.cs +++ b/Assets/_SnowWhite/Scripts/AI/SpiritController.cs @@ -666,32 +666,8 @@ namespace SpiritSystem Vector3 targetPos = playerHead.position + playerForward * introDistance + Vector3.up * introHeight; + - // 仅在苹果场景中检查目标位置是否在玩家面前160度内 - if (isInAppleScene) - { - Vector3 directionToTarget = (targetPos - playerHead.position).normalized; - float angle = Vector3.Angle(playerForward, directionToTarget); - - // 如果角度小于80度(即在玩家前方160度扇区内),则移动到玩家后方 - if (angle < 90f) - { - Debug.Log($"[SpiritController] 苹果场景:目标位置在玩家面前160度内 (角度: {angle:F1}),重新定位到后方"); - // 使用后方方向(180度旋转) - Vector3 playerBackward = -playerForward; - targetPos = playerHead.position - + playerBackward * introDistance - + Vector3.up * introHeight; - } - else - { - Debug.Log($"[SpiritController] 苹果场景:目标位置在玩家后方 (角度: {angle:F1})"); - } - } - else - { - Debug.Log($"[SpiritController] 非苹果场景:保持原位置"); - } Debug.Log($"[SpiritController] 目标位置: {targetPos}, 起始位置: {transform.position}"); @@ -768,7 +744,16 @@ namespace SpiritSystem } /// - /// 播放跳舞动画 - 移到正前方并跳舞 + /// 保持在当前位置不动(不跟随玩家) + /// + public void StayAtCurrentPosition() + { + SetState(SpiritState.StayInFront); + Debug.Log("[SpiritController] 保持在当前位置不移动"); + } + + /// + /// 播放跳舞动画 - 移到正前方并跳舞,动画结束后飞回固定位置 /// public void PlayDance(Action onComplete = null) { @@ -782,6 +767,9 @@ namespace SpiritSystem { if (playerHead == null) yield break; + // 记录当前固定位置 + Vector3 fixedPosition = transform.position; + // 飞到正前方 Vector3 playerForward = playerHead.forward; Vector3 targetPos = playerHead.position @@ -808,10 +796,39 @@ namespace SpiritSystem ReturnToFollow(); // 通知外部完成 onComplete?.Invoke(); + + // 跳舞动画播放完成后,飞回固定位置 + yield return new WaitForSeconds(2f); // 等待跳舞动画持续约2秒 + + // 飞回固定位置 + yield return FlyToFixedPosition(fixedPosition); + + // 回到固定不移动状态 + SetState(SpiritState.StayInFront); } /// - /// 播放沮丧动画 - 移到正前方并沮丧 + /// 飞回固定位置 + /// + private IEnumerator FlyToFixedPosition(Vector3 fixedPosition) + { + float t = 0; + Vector3 startPos = transform.position; + float duration = 0.5f; + + while (t < 1f) + { + t += Time.deltaTime / duration; + float smoothT = Mathf.SmoothStep(0, 1, t); + transform.position = Vector3.Lerp(startPos, fixedPosition, smoothT); + yield return null; + } + + transform.position = fixedPosition; + } + + /// + /// 播放沮丧动画 - 移到正前方并沮丧,动画结束后飞回固定位置 /// public void PlaySad(Action onComplete = null) { @@ -825,6 +842,9 @@ namespace SpiritSystem { if (playerHead == null) yield break; + // 记录当前固定位置 + Vector3 fixedPosition = transform.position; + // 飞到正前方 Vector3 playerForward = playerHead.forward; Vector3 targetPos = playerHead.position @@ -851,6 +871,15 @@ namespace SpiritSystem ReturnToFollow(); // 通知外部完成 onComplete?.Invoke(); + + // 沮丧动画播放完成后,飞回固定位置 + yield return new WaitForSeconds(2f); // 等待沮丧动画持续约2秒 + + // 飞回固定位置 + yield return FlyToFixedPosition(fixedPosition); + + // 回到固定不移动状态 + SetState(SpiritState.StayInFront); } /// diff --git a/Assets/_SnowWhite/Scripts/DreamEvent/DreamAppleEvent.cs b/Assets/_SnowWhite/Scripts/DreamEvent/DreamAppleEvent.cs index 0c0c968f..27e2deca 100644 --- a/Assets/_SnowWhite/Scripts/DreamEvent/DreamAppleEvent.cs +++ b/Assets/_SnowWhite/Scripts/DreamEvent/DreamAppleEvent.cs @@ -194,10 +194,10 @@ public class DreamAppleEvent : CutsceneBase yield return new WaitForSeconds(2f); // 等待女巫生成动画 - // 女巫出现后,小精灵回到跟随模式 + // 女巫出现后,小精灵保持在当前位置不移动 if (spirit != null) { - spirit.ReturnToFollow(); + spirit.StayAtCurrentPosition(); } // ========== 开始战斗 ========== @@ -391,6 +391,13 @@ public class DreamAppleEvent : CutsceneBase if (debugMode) Debug.Log($"[DreamAppleEvent] 苹果被切开!进度: {slicedAppleCount}/{targetAppleCount}"); + // 播放小精灵跳舞动画 + var spirit = SpiritSystem.SpiritController.Instance; + if (spirit != null && currentState == DreamEventState.Battle) + { + spirit.PlayDance(); + } + // 更新UI UpdateBattleUI(); @@ -410,6 +417,13 @@ public class DreamAppleEvent : CutsceneBase if (debugMode) Debug.Log($"[DreamAppleEvent] 苹果未击中!已错过: {missedAppleCount}"); + + // // 播放小精灵沮丧动画 + // var spirit = SpiritSystem.SpiritController.Instance; + // if (spirit != null && currentState == DreamEventState.Battle) + // { + // spirit.PlaySad(); + // } } ///