/// <summary> /// 스크립트 실행 /// </summary> /// <param name="filepath"></param> /// <param name="session">실행 중에 사용할 Session. 지정하지 않을 경우 새 세션을 사용</param> /// <param name="snapshotIndex">불러오기 시에만 사용. 시작할 Snapshot Index를 지정</param> public void RunScript(string filepath, ExecuteType exeType = ExecuteType.NewStart, int snapshotIndex = 0) { FSNResourceCache.StartLoadingSession(FSNResourceCache.Category.Script); // 리소스 로딩 세션 시작 if (exeType == ExecuteType.NewStart) // 새 세션을 열어야하는 경우 미리 세션 생성하기 (새 게임) { m_seqEngine.PrepareNewSession(); } FSNScriptSequence scriptSeq = FSNScriptSequence.Parser.FromAsset(filepath, m_seqEngine.CurrentSession); // 스크립트 해석 // TODO : header 적용, 여기에 코드를 삽입하는 것이 맞는지는 잘 모르겠음. 리팩토링이 필요할수도. // 인게임 세팅 var stchain = new FSNInGameSetting.Chain(FSNInGameSetting.DefaultInGameSetting); // 디폴트 속성을 베이스로 chain 만들기 foreach (var pair in scriptSeq.Header.InGameSettings) { var alias = FSNInGameSetting.ConvertPropertyNameAlias(pair.Key); stchain.SetPropertyByString(alias, pair.Value); } m_inGameSetting = stchain.Freeze(); // 속성값 고정, 현재 엔진의 디폴트 속성을 덮어씌운다. // var sshotSeq = FSNSnapshotSequence.Builder.BuildSnapshotSequence(scriptSeq); // Snapshot 시퀀스 생성 FSNResourceCache.EndLoadingSession(); // 리소스 로딩 세션 종료 bool overwriteScriptInfoToSession = exeType != ExecuteType.LoadFromSession; // 불러오기한 경우가 아니면 스크립트 정보를 세션에 덮어써야한다. m_seqEngine.StartSnapshotSequence(sshotSeq, overwriteScriptInfoToSession, snapshotIndex); // 실행 ControlSystem.ScriptLoadComplete(); // 스크립트 로딩 완료 이벤트 }