{"record":{"id":"214ee958f852b8cd","repo":"EllanJiang/GameFramework","slug":"already-exist-fsm-0","errorCode":null,"errorMessage":"Already exist FSM '{0}'.","messagePattern":"Already exist FSM '(.+?)'\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Fsm/FsmManager.cs","lineNumber":259,"sourceCode":"        public IFsm<T> CreateFsm<T>(T owner, params FsmState<T>[] states) where T : class\n        {\n            return CreateFsm(string.Empty, owner, states);\n        }\n\n        /// <summary>\n        /// 创建有限状态机。\n        /// </summary>\n        /// <typeparam name=\"T\">有限状态机持有者类型。</typeparam>\n        /// <param name=\"name\">有限状态机名称。</param>\n        /// <param name=\"owner\">有限状态机持有者。</param>\n        /// <param name=\"states\">有限状态机状态集合。</param>\n        /// <returns>要创建的有限状态机。</returns>\n        public IFsm<T> CreateFsm<T>(string name, T owner, params FsmState<T>[] states) where T : class\n        {\n            TypeNamePair typeNamePair = new TypeNamePair(typeof(T), name);\n            if (HasFsm<T>(name))\n            {\n                throw new GameFrameworkException(Utility.Text.Format(\"Already exist FSM '{0}'.\", typeNamePair));\n            }\n\n            Fsm<T> fsm = Fsm<T>.Create(name, owner, states);\n            m_Fsms.Add(typeNamePair, fsm);\n            return fsm;\n        }\n\n        /// <summary>\n        /// 创建有限状态机。\n        /// </summary>\n        /// <typeparam name=\"T\">有限状态机持有者类型。</typeparam>\n        /// <param name=\"owner\">有限状态机持有者。</param>\n        /// <param name=\"states\">有限状态机状态集合。</param>\n        /// <returns>要创建的有限状态机。</returns>\n        public IFsm<T> CreateFsm<T>(T owner, List<FsmState<T>> states) where T : class\n        {\n            return CreateFsm(string.Empty, owner, states);\n        }","sourceCodeStart":241,"sourceCodeEnd":277,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Fsm/FsmManager.cs#L241-L277","documentation":"CreateFsm<T>(name, owner, params FsmState<T>[]) registers a new FSM keyed by (owner type, name). If an FSM with the same owner type and name already exists, the library throws to prevent silently overwriting an existing FSM in the m_Fsms dictionary.","triggerScenarios":"Calling CreateFsm<T> with a name that already maps to an existing FSM for type T — HasFsm<T>(name) returns true before Fsm<T>.Create is attempted.","commonSituations":"Calling CreateFsm twice during initialization (e.g. in both Awake and Start in Unity); restarting a scene without destroying FSMs; duplicate FSM names in a config-driven setup; hot-reload re-running registration code.","solutions":["Check HasFsm<T>(name) before creating and reuse the existing FSM via GetFsm<T>(name)","Destroy the existing FSM first with DestroyFsm<T>(name) if re-creation is intended","Ensure initialization code runs only once (guard flag or singleton pattern)"],"exampleFix":"// before\nfsmManager.CreateFsm(player, \"movement\", states); // throws on second call\n// after\nif (!fsmManager.HasFsm<Player>(\"movement\"))\n{\n    fsmManager.CreateFsm(player, \"movement\", states);\n}\nelse\n{\n    movementFsm = fsmManager.GetFsm<Player>(\"movement\");\n}","handlingStrategy":"validation","validationCode":"if (fsmManager.HasFsm<Player>(\"movement\"))\n    movementFsm = fsmManager.GetFsm<Player>(\"movement\");\nelse\n    movementFsm = fsmManager.CreateFsm(player, \"movement\", states);","typeGuard":null,"tryCatchPattern":"try { movementFsm = fsmManager.CreateFsm(player, \"movement\", states); }\ncatch (GameFrameworkException ex) { movementFsm = fsmManager.GetFsm<Player>(\"movement\"); }","preventionTips":["Gate FSM creation behind a singleton/init-once flag","Always pair CreateFsm with a HasFsm check","Clean up FSMs on scene unload (DestroyFsm) to avoid stale registrations"],"tags":["csharp","fsm","duplicate-key"],"backgroundTag":"file-already-exists","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}