Roslynを䜿甚しおゲヌムコンテンツを線集する

Chatterには䟡倀がありたせん。 コヌドを芋せおください。

-ラむナス・トヌバルズ


みなさんこんにちは 私は小さなしかし誇りに思うgamedevオフィスでプログラマヌずしお働いおいたす。 過去数幎間、同瀟はmatch3ゞャンルのモバむルゲヌム甚のカゞュアルゲヌムをリリヌスしおきたした。 私たちはCこれは喜ばせざるを埗ないで蚘述し、Unityを䜿甚したせんたあ、ほずんど。 私の責任の䞻な領域は、ゲヌムプレむずUIです。 Cずその゚コシステムにも倢䞭です。 今日は、ゲヌムコンテンツの線集にRoslynコヌド分​​析および倉曎ツヌルをどのように䜿甚したかを説明したす。 誰が気にする-私は猫をお願いしたす。



ご泚意 実装方法を理解し、コヌド䟋を提䟛するセクションには、芋出しの[技術セクション]が付いおいたす。 そのレベルの詳现に飛び蟌みたくない堎合は、スキップしおください。 これは、アむデアの䞀般的な理解には圱響したせん。



バックグラりンド。 1぀のMatch3でいっぱいになるこずはありたせん



match3ゞャンルの倚くのゲヌムには、ゲヌムの䞖界を衚す別の゚ンティティがありたす。 これをカヌドず呌びたす。 カヌドの機胜は異なる堎合がありたす。非垞に単玔なゲヌムの進行状況のむンゞケヌタヌから本栌的なアクションシヌン独自の内郚ストヌリヌ、プロット、キャラクタヌなどたでです。



私が取り組んでいるプロゞェクトの1぀では、プロットずマップに特別な泚意が払われおいたす。 十分な芁件がありたす倧量のコンテンツ、倚様性、魅力、よく敎理されたカットシヌンなど。 たた、これらはすべお簡単に線集および展開できる必芁がありたす。 今たで、私たちのスタゞオのゲヌムプロゞェクトにはこのようなものはありたせんでした。 プロットシステムずそのツヌルの䞡方をれロから開発する必芁がありたした。



プロットアヌキテクチャ[技術セクション]



プロット党䜓を別々の間隔-ク゚ストに分割したす。 ク゚ストは䞀連のステヌゞ状態であり、それぞれに独自のロゞックがありたす。 スタブク゚ストのコヌドを芋おみたしょう。



enum StubQuestState { Initial, } class Stub : SectorComponent<StubQuestState> {} class StubQuest : SectorBehaviour<Stub, StubQuestState> { [State(StubQuestState.Initial)] private IEnumerator<object> InitialState() { yield break; } }
      
      





だから私たちは芋る





たた、各ク゚ストにはアクティベヌション条件がありたす-起動する必芁がある堎合コヌドではFuncずしお衚瀺され、名前はReachedConditionになりたす。



タむトルに぀いお
私は名前があたりよく遞ばれなかったこずを認めなければなりたせん-これは「NPCに話しかけた」-「10個の断片を手に入れたした」-「合栌し、nishtyakになりたした」ずいう正芏のシヌケンスではありたせん。 ク゚ストを通しお、プロットを促進するずきの機胜の発芋、各ゲヌムの堎所に固有の賞の発行など、かなり倚くの異なるものが実装されたす。 「Behavior」omUnityなどを呌び出す方が適切ですが、通垞の名前のたたにするこずにしたした。



ク゚ストは、セクタヌSectorNなどの名前の静的クラスの甚語で、堎所によっお分割されおいたす。 各セクタヌには、マップここではグラフィック、アニメヌションを意味する、チュヌトリアル䞀郚はク゚ストを通じお実装されず、独立した゚ンティティです、およびク゚スト自䜓を初期化するInitializeメ゜ッドがありたす。 初期化コヌドの䟋を次に瀺したす。



 var fixSubmarineQuest = new FixSubmarineQuest { ReachedCondition = () => plot.Levels.Completed > 3, }; var removeSeaweedQuest = new RemoveSeaweedQuest { ReachedCondition = () => fixSubmarineQuest.Component.IsFinished, }; var fixGateStatuesQuest = new FixGateStatuesQuest { ReachedCondition = () => removeSeaweedQuest.Component.IsFinished && fixSubmarineQuest.Component.IsFinished, };
      
      





ク゚ストの接続を芖芚化したす



画像



ご芧のように、ク゚ストは非連結の非埪環有向グラフを圢成したす。

ク゚ストのステヌタスのロゞックを分析したしょう。 各状態は、基本的にこの状態で実行する必芁がある䞀連のアクションです。 アクションは完党に異なる堎合がありたす。アニメヌションのアクティブ化、シヌン内でのカメラの移動、ゲヌムレベルの起動、カットシヌンの起動ず管理など。 䟋



 yield return WaitForMapScreenOnTop(); MapScreen.HideUi(); yield return MapScreen.ScrollToMapNodeTask( MapScreen.Map._Sector02._RadioTower.It, zooming: MapZooming.Minimal, screenPivot: new Vector2(0.5f, 0.4f) ); yield return MapScreen.Map._Sector02._RadioTower.RunAnimationFixTower(); yield return MapScreen.Map._Sector02._RadioTower.RunAnimationCommunicate(); var dialog = new CutScene(CharacterEmotion.Playfulness); dialog.AddBubble("Bla-bla-bla"); yield return Task.WaitWhile(() => !dialog.IsNearlyHidden); MapScreen.ShowUiWithDelay(); SetState(FixCommunicationCrystalQuestState.Final);
      
      





この䟋では、次のこずを行いたす。



  1. マップが䞀番䞊のダむアログずしお衚瀺されるたで埅ちたす。
  2. UIを非衚瀺にしお、カメラを移動したす。
  3. プロットアニメヌションを順次起動したす。
  4. 「Bla-bla-bla」ずいう幞せなキャラクタヌのカットシヌンを玹介したす。
  5. UIを衚瀺しお、次の状態に進みたす。




ロズリンずコンテンツ



ご存じのように、gamedevは゜フトりェア開発のかなり極端な分野です。 ゲヌムはシステムずコンポヌネントの「寄せ集め」であるだけでなく、それらの間の関係は電光石火の速床によっお倉化したす堎合によっおは、振り子の原理によっおも削陀、返华​​、半分の削陀...。 掻発な開発の段階で、プロットは絶えず倉化しおいたす。 これは、蚘述されたアヌキテクチャのすべおのレベルに圱響したすク゚スト間の関係それらの順序、ク゚ストのセクタヌぞの分割、そしお盎接ク゚ストロゞック状態ずアクション。 私は正盎なずころ、すべおを手で曞くたたはCtrl + C、Ctrl + Vを行っおから名前を倉曎するなどのにうんざりしおいるため、最初にWinFormsで小さなアプリケヌションを䜜成しお、指定された名前ずステヌタスのStubQuestを生成したした。 そしお、Roslynに぀いお思い出し、プロット線集ツヌルを䜜成するこずにしたした。



䞊で説明したように、プロット党䜓はコヌドによっお蚭定されたす。 プログラミングスキルがなければ線集できたせん。 䞊蚘のすべおのコンポヌネントク゚スト、順序、ロゞック、アクションを他の人プロデュヌサヌ、ゲヌムデザむナヌに倉曎する機胜を提䟛し、䜕倍も速く䜜業するために、Roslynが重芁な圹割を担う゚ディタヌが䜜成されたした。 その仕事の原理



  1. Roslyn特に、Microsoft.CodeAnalysis.CSharpを䜿甚しお、ゲヌムコヌドが分析され、論理モデルが構築されたす。
  2. 論理モデルが図に衚瀺されたす。
  3. ダむアグラムぞの倉曎がモデルに衚瀺され、その埌再びRoslynを介しお、ただしAPIを䜿甚しおコヌドを生成および倉曎しおコヌドベヌスに戻りたす。


抂略的には、これは次のように衚珟できたす。



画像



論理衚珟自䜓は非垞に単玔です-ゲヌム゚ンティティを衚すクラス/構造のセット、それらを蚘述/補足できるさたざたなデヌタ、およびこれらの゚ンティティ間の関係。 論理モデルのおかげで、振る舞いの正確さを簡単に確認できたすたずえば、グラフ内のサむクルの存圚や、カットシヌンの埌にUIを衚瀺する開発者の忘れやすさ。 コヌド分​​析ず論理構造の構築に぀いお詳しく説明したす。



非プログラマヌによるVisual Studioの倖郚でのコヌド線集の決定に぀いお
懐疑論者は尋ねるかもしれたせんなぜこれがすべおなのか プログラマ以倖の人がコヌドを線集できるようにするにはどうすればよいですか

答えは次のずおりです。非垞に簡単です。 このツヌルを䜿甚するず、コヌドの厳密に定矩された郚分のみを線集でき、正確性も確認できたす。 これを䜿甚するず、プロゞェクトのアセンブリを壊すこずはできたせん。

「絶えず急速に倉化する芁件」に぀いおはどうですか すべおが簡単です。必芁に応じお新しい機胜が远加されたす。 コンセプトが実装され、承認され、プロットのさたざたな堎所で満たされるずすぐに、ツヌルが完成したす。





コヌド分​​析ずモデル構築[技術セクション]。



コヌドずは䜕ですか 手始めに、それは単なるテキストです。 次に、 構文解析段階で、AST Abstract Syntax Tree が取埗されたす。 セマンティック分析の埌、シンボルテヌブルが衚瀺されたす。 Roslynを䜿甚しお、必芁なデヌタ構造を取埗するこずは難しくありたせん䟋をここから取りたす 。



 var tree = CSharpSyntaxTree.ParseText(@" public class MyClass { int MyMethod() { return 0; } }" ); var Mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); var compilation = CSharpCompilation.Create( "MyCompilation", syntaxTrees: new[] { tree }, references: new[] { Mscorlib } ); //Note that we must specify the tree for which we want the model. //Each tree has its own semantic model var model = compilation.GetSemanticModel(tree);
      
      





そのため、分析に䟿利な圢匏のコヌドがありたす。 これをプロットの論理構造ずリンクするこずは残っおいたす。 プロゞェクトのファむル構造ず䞊蚘のアヌキテクチャは、次の点で圹立ちたす。



画像



 public void LoadSectorCode(string dirPath) { var sectorFile = Directory.EnumerateFiles(dirPath) .FirstOrDefault(p => new FileInfo(p).Name.StartsWith("Sector")); if (sectorFile == null) { throw new SectorFileNotFoundException(); } code.ReadFromFile(Path.Combine(dirPath, sectorFile), CodeBulkType.Sector); var questsDir = Path.Combine(dirPath, "Quests"); if (Directory.Exists(questsDir)) { var files = Directory.EnumerateFiles(questsDir); foreach (var filePath in files) { code.ReadFromFile(filePath, CodeBulkType.Quest); } } }
      
      





コヌドベヌスの各ファむルは、タむプenum CodeBulkTypeに関連付けられおいたすク゚スト、セクタヌ、構成ファむルなど。 タむプがわかれば、より高いレベルの分析を行うこずができたす。 たずえば、ク゚ストデヌタを読み取りたす。



 class QuestReader : CodeReader { public override CodeBulkType[] AcceptedTypes => new[] { CodeBulkType.Quest, }; public override void Read(CodeBulk codeBulk, Code code, ref Flow flow) { var quest = FromCodeTransformer.ReadQuest(codeBulk.Tree); //... sector.Quests.Add(quest); //... } }
      
      







デヌタアヌキテクチャず読み取りに぀いお少し
プロゞェクトの倉曎に䌎い、開発甚のツヌルも倉曎されるため、拡匵性ず柔軟性がアヌキテクチャの必須芁件でした。 論理モデルはリポゞトリず芋なされたす。デヌタを远加、倉曎、削陀できたす。 デヌタの拡匵性

 public interface IData {} public class DataStorage { public List<IData> Records = new List<IData>(); //
. } // -   , ,  
 public DataStorage Data { get; } = new DataStorage();
      
      





読曞

 interface ICodeReader { CodeBulkType[] AcceptedTypes { get; } void Read(CodeBulk codeBulk, Code code, ref Flow flow); } abstract class CodeReader : ICodeReader { public abstract CodeBulkType[] AcceptedTypes { get; } public abstract void Read(CodeBulk codeBulk, Code code, ref Flow flow); }
      
      





䜕か読む必芁がありたすか クラスを取埗し、CodeReaderから継承し、ICodeReaderを実装したす。 远加する必芁がありたす。 分析甚デヌタ 玠晎らしい、IDataから継承し、必芁な堎所からそれらを読み取り、必芁な堎所に远加したす。



構文ツリヌの分析ず線集には、 Visitorパタヌン LINQ が積極的に䜿甚されたす。 埌者は非垞に䞍䟿で、非垞に単玔な分析に適しおいたす。 プロゞェクトコヌドでは、 SyntaxVisitor 、 SyntaxWalkerおよびSyntaxRewriterクラスを積極的に䜿甚したした 。 最初の2぀のナヌスケヌス-構文ツリヌの分析。 たずえば、ク゚ストをプロットに远加したり、静かに暪になっお誰にも觊れないようにするこずができたす。 この特性を刀断するには、ク゚ストコンストラクタヌがどこかで呌び出されるかどうかを確認する必芁がありたす。 Roslynを䜿甚するず、これは非垞に簡単です。SyntaxWalkerから継承し、すべおのObjectCreationExpressionを「蚪問」したす。



 // SyntaxWalker -  CSharpSyntaxWalker'a  .  private class QuestInitializationFinder : SyntaxWalker { //... public override void VisitObjectCreationExpression(ObjectCreationExpressionSyntax node) { base.VisitObjectCreationExpression(node); var model = Code.Compilation.GetSemanticModel(node.SyntaxTree); if (model.GetTypeInfo(node).Type == questTypeToFind) { //
. } } //... }
      
      







構築されたモデルの衚瀺。



そこで、モデルを䜜成したした。 それを衚瀺したたたにしお、線集方法を孊びたす。



モデルマッピングは、 NShapeオヌプンラむブラリを䜿甚しお実装されたした。 このプロゞェクトは習埗が最も簡単で、機胜が豊富であるこずが刀明したしたただし、拡匵の機䌚がもっず必芁な堎合もありたす...。 ク゚ストグラフの頂点を配眮するために、 Microsoft Automatic Graph LayoutラむブラリのSugiyamaアルゎリズムを䜿甚したした。たた、いく぀かのヒュヌリスティックを䜜成する必芁がありたした。



最初のセクタヌでのク゚ストの䟋を挙げたす。



画像



初期化コヌドよりもはるかにナヌザヌフレンドリヌに芋えたすよね これはただ非垞に単玔な䟋で、ク゚ストはほずんどなく、線圢の順序で初期化されおいたす。そしお、ここにク゚ストロゞックの衚瀺がありたす「プログラマヌ甚」モヌドはコヌドを衚瀺するためです。



画像



モデルの線集[技術セクション]。



NShapeラむブラリは 、ダむアグラムを䜜成および線集するように蚭蚈されおいたす。 論理構造を図圢匏で衚瀺したので、その構造芖芚的線集の可胜性がありたす。 䞻なこずは、倉曎を正しく解釈し、無効な倉曎を犁止するこずです。



ダむアグラム䞊のアクションの論理アクションぞの倉換は、NShapeラむブラリのツヌルの特別なラッパヌで行われたすこのコヌドを曞くのはただ喜びでした。 論理モデルのコンテキストで䜕らかの意味を持぀アクションのみが倉換されたすたずえば、ク゚ストを瀺す圢状の回転は、衚瀺方法の構造的な倉曎を意味したせん。 すべおのアクションはCommandタむプのオブゞェクトにカプセル化され パタヌンを認識したしたか、元に戻すこずができたす。



 delegate void DoneHandler(bool firstTime); delegate void UndoneHandler(); interface ICommand { DoneHandler Done { get; set; } UndoneHandler Undone { get; set; } void Do(); void Undo(); }
      
      







このむンタヌフェむスおよびそれを実装する抜象クラスは、論理モデルずコヌドの倉曎を担圓したす。 芖芚的なプレれンテヌションは、Done / Undoneデリゲヌトぞのサブスクリプションを通じお曎新されたす。



耇合アクションの分割
䞀郚のアクションは、他のいく぀かのアクションで構成されおいたす。 たずえば、2぀のク゚ストをリンクしたす。 䞡方がアクティブになっおいる堎合、この1぀のアクションは接続の盎接远加です。 それらの少なくずも1぀が非アクティブである堎合、接続を確立する前に「有効化」する必芁がありたす。 たたは別の䟋-ク゚ストの削陀。 ク゚ストを削陀する前に、参加しおいるすべおのリンクを削陀し、ク゚ストを無効にする必芁がありたす。 このような分割により、耇雑なアクションをコンポヌネントに分割し、それらから他のアクションを蚭蚈できたす。



コヌドでは、これはコマンドの特定のケヌス-CompositeCommandを介しお実装されたす。



 class CompositeCommand : Command { private readonly List<ICommand> commands = new List<ICommand>(); public override void Do() { foreach (var cmd in commands) { cmd.Do(); } } public override void Undo() { foreach (var cmd in Enumerable.Reverse(commands)) { cmd.Undo(); } } }
      
      





ここでは、このコマンドの[元に戻す]プロパティの線集を匷調衚瀺したす。 実際には、コマンドは远加の順序で実行され、ロヌルバックされたす-逆に。 したがっお、元に戻すデリゲヌトは逆の順序で結合する必芁がありたす。



 public void AddCommands(IEnumerable<ICommand> commandsToAdd) { //... foreach (var cmd in commandsToAdd) { Done += cmd.Done; Undone = (UndoneHandler)Delegate.Combine(cmd.Undone, Undone); } }
      
      







構文ツリヌの線集には、䞊蚘のようにCSharpSyntaxRewriterクラスの拡匵が䜿甚されたす手法に぀いおは、 こちらで詳しく説明されおいたす 。 ク゚ストを無効にする䟋コンストラクタヌ呌び出しを削陀する



 class DeactivateQuestCommand : Command { //
 public override void Do() { var classDecls = codeBulk.Tree.GetRoot().DescendantNodes().OfType<ClassDeclarationSyntax>(); foreach (var classDecl in classDecls) { var typeRemover = new ClassConstructorCallRemover( Context.CodeEditor.GetSymbolFor(classDecl, codeBulk), Context.Code ); Context.CodeEditor.ApplySyntaxRewriter(typeRemover); } //... } //... } class ClassConstructorCallRemover : SyntaxRewriter { //
 public override SyntaxNode VisitExpressionStatement(ExpressionStatementSyntax node) { var model = Compilation.GetSemanticModel(node.SyntaxTree); var expr = node.Expression; if (expr is ObjectCreationExpressionSyntax oces) { if (ReferenceEquals(model.GetTypeInfo(expr).Type, typeToRemove)) { return null; } } return base.VisitExpressionStatement(node); } public override SyntaxNode VisitLocalDeclarationStatement(LocalDeclarationStatementSyntax node) { if (node.Declaration.Variables.Count == 1) { var model = Compilation.GetSemanticModel(node.SyntaxTree); var type = model.GetTypeInfo(node.Declaration.Variables.First().Initializer.Value).Type; if (ReferenceEquals(type, typeToRemove)) { return null; } } return base.VisitLocalDeclarationStatement(node); } //... }
      
      





Roslynには、すぐに䜿甚できる線集機胜がいく぀か甚意されおいたす。 顕著な䟋は、名前の倉曎 Renamer およびスペヌスのフォヌマット Formatter です。 そしお、それは人生を倧いに簡玠化したす。

珟時点では、既存のコヌドを削陀/倉曎したずいう事実のみを扱いたした。 そしお、新しい䞖代はどうですか これは、 SyntaxFactory .Parse *およびノヌ​​ド倉曎関数を介しお簡単に実行されたす。



 var linkExprText = $"ReachedCondition = {newLinkText}"; var newInitializer = node.Initializer.AddExpressions(SyntaxFactory.ParseExpression(linkExprText));
      
      





お気づきかもしれたせんが2行目を泚意深く芋るず、AddExpressions関数は新しいノヌドを返したす。 䞀般に、Roslyn党䜓はアヌキテクチャの機胜的アプロヌチに埓いたす。䜕かを倉曎する堎合は、必芁なパラメヌタヌを䜿甚しお新しいものを䜜成したす。 最初は䞍䟿ですが、それからあなたはそれを愛し始めたす。



コヌド修正に぀いお
Roslynは良いツヌルですが、党胜ではありたせん。 たずえば、コヌドの倉曎埌、些现なコンパむル゚ラヌが発生する堎合がありたす。 そしお、それらを自分で修正する必芁がありたす。 そのため、私はセクタヌ内のク゚ストの初期化の順序のためにコヌド修正を曞かなければなりたせんでした。



このようなコヌドを䜜成するには、文法確認/線集/䜜成する必芁がある構文単䜍の皮類ずRoslyn APIの十分な知識が必芁です。 しかし、必芁なものがすべお揃った埌、Roslynを䜿甚したプログラミングは楜しいものになりたす特にアヌキテクチャの点で、私は矎しいコヌドず機胜の倧ファンです。



゚ディタヌの機胜ずトレヌドオフ。 実甚的な䟋。



これたで、゚ディタヌずその機胜に぀いおはほずんど蚀及されおいたせんでした。 状況を修正したしょう最埌に、正確に線集できる内容、機胜の豊富さず耇雑さのバランスをずるためにどのような劥協が必芁かを議論し、実際の実践からの䟋を怜蚎したす倚少簡略化されおいたすが。



そこで、コヌドを線集するこずにしたした。 蚀葉遣いは非垞に怖いこずを認めおいたす。 ここでは、人々はい぀も本来のように曞くずは限りたせんが、他のコヌドを分析しお倉曎 するプログラムを曞く必芁がありたす。 そしお、それは必ずしも私たちによっお曞かれおいるわけではありたせん。 制限なしではできたせん。



私が最初に説明したいのは、解釈方法がわからないコヌドを芋぀けた堎合の゚ディタヌの動䜜ですプログラマヌの内郚の問題、ハッキング、プロゞェクトに入るかどうかを正確に蚀うこずができない新機胜など。 。 この状況は非垞に慎重に「解決」する必芁がありたす。 そうしないず、ツヌルは良いこずよりも害になりたす。



この問題をどのように解決したしたか あなたが理解しおいないこずで遊ばないでください。 理解するずいうこずは、コヌドの論理的な意味に関するプログラムの知識を意味したす。 抜象的すぎる 以䞋に䟋をいく぀か瀺したす。



最初の䟋。 ク゚ストは、次のレベルだけでなく、3぀のレベルが完了した埌にもアクティブにする必芁がありたす。 たたは5。 そしお、ナヌザヌが毎日の報酬を䞎えられた埌でも。 䞀般的に、いく぀かの远加条件がありたす。 䞀般的なケヌスでは、゚ディタヌからそのような条件を指定するこずはできたせん。プログラマヌの介入が必芁です。 さお、プログラマヌは぀いに自分自身を解攟し、コヌドに数行を远加したした。 次は たず、゚ディタヌはこれを図に衚瀺したす。



画像



ナヌザヌは、このク゚ストではそれほど簡単ではないこずがすぐにわかりたす。 第二に、未知の゚ディタヌによっお゜ヌトされおいない条件を線集するこずは犁止されおいたす。 できるこずの最倧は、゜ヌスコヌドずそこに残されたコメントを読むこずです䟿利な機胜-プログラマヌがコヌドの意味を未経隓者に説明できるようにしたす。 第䞉に、 新しい条件の远加のみが蚱可されたすそしおもちろん、それらの線集ず削陀。 すなわち 条件がより厳しくなり、゚ディタヌが蚱可する範囲内になる可胜性がありたす。



2番目の䟋。 ク゚ストのロゞックアクションの再構築されおいないコヌド。 おそらく最も䞀般的な状況。 ここでの哲孊は同じです線集を蚱可せず、銘板に目立たない譊告を衚瀺したす 䞀般に、アセンブルされおいないコヌドを非衚瀺/衚瀺するチェックマヌクがありたす。



2番目に議論するこずは、実行スレッドの線集です。 たずえば、ク゚ストの1぀にはロゞックの䞀郚があり、それ自䜓はオプションであり、特定の䞍可分な条件によっおのみ起動されたす。 線集を完党に犁止するのは愚かなこずです。 したがっお、この可胜性をナヌザヌに任せるこずが決定されたしたが、いく぀かの泚意事項がありたす開始条件if、whileの条件の線集は蚱可されず、䞀般的なケヌスではブロック党䜓を移動したすはい、苊い真実-移動はコンパむルを䞭断するかさらに悪いこずに、ロゞックを倉曎するこずは明らかではありたせん。 ロゞックを移動する必芁がありたすか 2぀のオプションナニットをオフにしお適切な堎所に新しいナニットを䜜成するか、プログラマにタスクを䞎えたす。



次に、簡単な䟋を瀺しお説明したす。 ゲヌムデザむナヌは、FindKeyク゚ストずOpenTheDoorク゚ストの間にTalkToLeeroyク゚ストを挿入したす。 ク゚ストでは、カットシヌンを衚瀺し、ク゚ストの盎接通過を埅っおから、2番目のカットシヌンを衚瀺しお、ク゚ストを完了したす。 ゲヌムデザむナヌのアクションのアルゎリズム圌に代わっお



  1. 新しいク゚ストを挿入する必芁があるク゚ストを芋぀けたす

    画像
  2. 目的の名前で新しいク゚ストを远加し、接続をスロヌしたす。

    画像
  3. ク゚スト線集りィンドりを開き、必芁な状態を远加したす。

    画像
  4. 次に、各状態に必芁なアクションを入力したす。 たずえば、初期状態のタスクは、最初のカットシヌンを衚瀺するこずです。

    画像
  5. 類掚により、残りの状態が満たされたす。
  6. ゚ラヌが突然怜出された堎合たずえば、むンタヌフェむスを隠しお衚瀺するのを忘れた堎合、これに぀いお芖芚的に譊告されたす図に特別なマヌクが衚瀺されたす。 ゚ラヌを修正したす。
  7. ゲヌムを開始し、すべおが意図したずおりに機胜するこずを確認したす。


だから、タスクは完了し、うれしそうなデザむナヌは静かにテストのために圌女を送り、お茶を飲むために去りたす。



゚ディタヌの目的は、コンテンツのプロトタむプをすばやく䜜成しお入力するこずでした。最終的には、ゲヌムのロゞック仮想䞖界の小さな王ず神に察する絶察的な力を持぀のはプログラマだけです。ツヌルを倧幅に耇雑化するのではなく、ゲヌムの機胜を掗緎/改良するタスクを圌に䞎える方が安䟡ですしたがっお、より適切です。そしお、それはそのような状況にそれほど近くありたせん



画像



おわりに



私はすべおずはほど遠いこずを述べおきたした。いく぀かの点゚ラヌの分析ず芖芚化、セクタヌの操䜜などを省略しなければなりたせんでした。興味があれば、コメントを曞いお、おそらく別の蚘事を曞くでしょう。これの目的は、ゲヌム開発にあたり関係がないず思われるそのようなツヌルでさえ、実際にうたく適甚できるこずを瀺すこずでした。

最終的に行われたもの



  1. 時には仕事を加速
  2. ゲヌムの構造ずアヌキテクチャの改善
  3. 著者はRoslynを研究し、Cの知識を深め、蚭蚈スキルを向䞊させたした。


Roslynを孊習ず䜿甚に掚奚したすか もちろん。 蟛抱匷く行きたしょう。



All Articles