未解之谜
查看一个动画控制器的依赖,里面竟然有另一个动画控制器。

直接去被依赖项的meta文件拷贝guid,然后去依赖项的YAML里搜索,结果是:

这个guid多次出现在AnimatorStateTransition模块。
看不懂YAML,于是把依赖别人的控制器复制一个,把状态删一个,打印一次依赖。然后删成默认状态机,啥都不依赖了,只依赖那个动画控制器。
然后把控制器的层、参数、状态全删掉,再建一个全新控制器,对比它们的YAML。新建的控制器很干净:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: New Animator Controller
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers: []
被删空的控制器YAML则是:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1101 &-8043723507950298118
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: running
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 5868839050235648224, guid: 06bf078c7d5187148b17f1e7918a9e99,
type: 2}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.9464286
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-7986762334218738143
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 6
m_ConditionEvent: bodyStatus
m_EventTreshold: 1
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -4066937683750499412, guid: 06bf078c7d5187148b17f1e7918a9e99,
type: 2}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.89892185
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-5474338561685204398
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: Jump
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -9165411807507458709, guid: 06bf078c7d5187148b17f1e7918a9e99,
type: 2}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.068148136
m_TransitionOffset: 0
m_ExitTime: 0.89687735
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-789983268425872304
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: TakeDrop
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 3227172602469648728, guid: 06bf078c7d5187148b17f1e7918a9e99,
type: 2}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.89892185
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-186031674231208760
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 6
m_ConditionEvent: bodyStatus
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -1130861594894586152, guid: 06bf078c7d5187148b17f1e7918a9e99,
type: 2}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.89892185
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: NPC 1
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: 50358232126170600}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1107 &50358232126170600
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates: []
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 0, y: 30, z: 0}
m_EntryPosition: {x: 120, y: 120, z: 0}
m_ExitPosition: {x: 270, y: 50, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 0}
--- !u!1101 &1116902853594775685
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 3
m_ConditionEvent: gunStatus
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -2272526421185388783, guid: 06bf078c7d5187148b17f1e7918a9e99,
type: 2}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.90909094
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
多了很多AnimatorStateTransition:模块。
我能想到的解释就是这个控制器的一些状态和转换当初是从被依赖的直接复制出来的,在序列化文件里它就是直接复制了这部分文本,但是这样无效,所以保存时序列化另外创建了转换对象,这部分文本也没有删。
这里m_ObjectHideFlags意思应该是这个对象已失效,隐藏,但是不删除。
我看了被依赖控制器YAML的一个转换对象,m_DstState字段根本没有guid,所以可能是拷贝状态时转换对象进了新控制器,添加了对原来目标状态的引用。
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 6
m_ConditionEvent: bodyStatus
m_EventTreshold: 2
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -5291231011926439337}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.9493243
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!114 &-9205196945450993477
继续实验:拷贝状态转换
然后我从一个状态机C拷了一个转换,到新建的状态机,什么也没拷上,然后打印一下新状态机的依赖,已经依赖上状态机C了。


如果徒手修改YAML文件
我删除了AnimatorStateTransition:k开头的一段,编辑器直接解析失败,状态机界面打不开,文件直接废掉。


继续实验:拷贝状态
又新建动画控制器,从控制器M拷贝状态过去,成功粘贴。打印依赖,依赖了状态机M。

被粘贴的控制器的YAML是这样的,控制器M的guid是05a5eccf713b1304b872c5c0c2e3ab0a,出现在AnimatorStateTransition模块,而不是AnimatorState模块。
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1101 &-9221984846367630791
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 2
m_ConditionEvent: dead
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -3094905352768277915, guid: 05a5eccf713b1304b872c5c0c2e3ab0a,
type: 2}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.92788464
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1107 &-3121839260780123505
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 798723549730859907}
m_Position: {x: 320, y: 30, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 798723549730859907}
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u54C8\u54C8\u54C8"
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -3121839260780123505}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1102 &798723549730859907
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Dead
m_Speed: 2
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 0
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 78833b2045374d9489cc36e6fa0e9bed, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
如何拷贝状态机
右键有一个

粘贴后不会依赖源控制器,源控制器的guid也不会出现在YAML。

结论&教训
不要从已有的状态机框选Ctrl C拷贝状态和转换,否则目标控制器会引用源控制器。分AB包会出问题。
在状态机界面右键点拷贝。
Broken text PPtr in file(Assets/Art/Animators/XXX.controller). Local file identifier (-2698132134870541907) doesn't exist!
现在推测这个错误也是框选拷贝状态机导致的,在YAML里被添加了对动画文件的引用,但是这些模块停止随编辑器更新。

更多实验
我又框选Ctrl C几次,也不是一定会隐性依赖。一切以选择依赖结果为准,看见有2个控制器,说明已经被污染了。一旦污染这个控制器也就完蛋了,不管怎么删都无法去除依赖了,手动删YAML又会导致编辑器解析错误。

没有隐性依赖其他控制器,但是隐性依赖很多动画剪辑
还遇到了这个情况,依赖的动画剪辑明显多于实际用到的。



10


被折叠的 条评论
为什么被折叠?



