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();
+ // }
}
///