<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C# on Asterfrom Blog</title><link>http://www.asterfrom.com/categories/c%23/</link><description>Recent content in C# on Asterfrom Blog</description><generator>Hugo -- gohugo.io</generator><language>ja</language><copyright>Example Person</copyright><lastBuildDate>Mon, 03 Aug 2026 08:00:00 +0900</lastBuildDate><atom:link href="http://www.asterfrom.com/categories/c%23/index.xml" rel="self" type="application/rss+xml"/><item><title>CS 7632: Game AI</title><link>http://www.asterfrom.com/p/cs-7632-game-ai/</link><pubDate>Mon, 03 Aug 2026 08:00:00 +0900</pubDate><guid>http://www.asterfrom.com/p/cs-7632-game-ai/</guid><description>&lt;p&gt;OMSCS 2026 Summer (夏学期) では Game AI を受講した。&lt;/p&gt;
&lt;h2 id="overall"&gt;Overall
&lt;/h2&gt;&lt;p&gt;この授業は、ゲームにおける AI の実装や制御を中心に扱う授業であった。事前に受講した人から「Unity で実際に動作するものを作成するため面白い」という感想を聞いていたため、興味を持って受講したが、実際に内容も取り付きやすく、楽しみながら学ぶことができた。&lt;/p&gt;
&lt;p&gt;夏学期は期間が短いため負荷が高すぎる授業は避けたかったが、その点でもこの授業はちょうどよかった。毎週の課題はあるものの、極端に重いものではなく、ゲームの裏側で動く AI の考え方を実践的に学べた。一方で、講義動画は長めで毎週視聴する必要があったため、そちらの負担はそれなりに大きかった。成績に関して受講した際には、主にクイズと課題で決まる形式であり、試験は行われなかった。&lt;/p&gt;
&lt;p&gt;なお、AI といっても昨今話題になる Generative AI や Deep Learning が主題ではなく、ゲーム内で自動的に動作する対戦相手やキャラクターの振る舞いが中心である。単に強い AI を作るのではなく、プレイヤーにとって「面白い」ゲーム体験になるように、適度な強さや挙動を設計する点が印象的であった。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://omscs.gatech.edu/cs-7632-game-ai" target="_blank" rel="noopener"
&gt;CS 7632: Game AI&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="content"&gt;Content
&lt;/h2&gt;&lt;p&gt;授業全体を通しては、ゲーム AI をどう実装するか、その際にどのようなアルゴリズムや考え方を使うかを学んだ。最初に扱ったのはグリッドやパスネットワークなど、AI が移動できる領域をどのように表現するかという基本的な話である。その後、A* を用いた経路探索、NavMesh によるより自然な移動経路の構築へと進んでいった。&lt;/p&gt;
&lt;p&gt;射撃や投擲のような動作に関する課題では、物体の軌道や到達位置を予測して、どのタイミングでどのように行動するかを決めるロジックを学んだ。加えて、ゲーム内の状態に応じて動作を切り替える FSM (Finite State Machine) や、複数の条件をなめらかに扱う fuzzy logic も扱った。最後には、Procedural Content Generation (PCG) による自動生成にも触れ、ゲームのフィールドや地形をアルゴリズムで作る考え方を学んだ。普通にゲームを遊んでいると気付きにくいが、その中で活用されている実装ロジックに関して幅広く学べたと思う。&lt;/p&gt;
&lt;h3 id="assignment"&gt;Assignment
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Homework 1: Grid Lattice&lt;/li&gt;
&lt;li&gt;Homework 2: Path Network&lt;/li&gt;
&lt;li&gt;Homework 3: AStar&lt;/li&gt;
&lt;li&gt;Homework 4: NavMesh&lt;/li&gt;
&lt;li&gt;Homework 5: Projectile Aiming with Prison Dodgeball&lt;/li&gt;
&lt;li&gt;Homework 6: FSM with Prison Dodgeball&lt;/li&gt;
&lt;li&gt;Homework 7: Race Track&lt;/li&gt;
&lt;li&gt;Homework 8: Procedural Content Generation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="homework-1-grid-lattice"&gt;Homework 1: Grid Lattice
&lt;/h3&gt;&lt;p&gt;最初の課題では、グリッド上に経路を作る基本的な仕組みを実装した。非常にシンプルな内容であり、Unity の扱いに慣れる導入として適切であった。グリッド毎に移動不可能なオブジェクトが存在しているかを判定していき、移動可能な領域を明らかにしたため、効率的な実装を工夫した。一方で、グリッドベースの経路は、将棋やチェスのような盤面では有効でも、FPS のように滑らかな移動が必要なゲームでは不自然になりやすいという限界も理解できた。&lt;/p&gt;
&lt;h3 id="homework-2-path-network"&gt;Homework 2: Path Network
&lt;/h3&gt;&lt;p&gt;Grid Lattice から発展して、ノードごとに経路を結ぶ Path Network を扱った。単純な格子ではなく、点と点を結んで経路を構成することで、より柔軟に移動経路を表現できるようになった。経路探索の考え方を、より実践的な形で学べた課題であった。&lt;/p&gt;
&lt;h3 id="homework-3-astar"&gt;Homework 3: AStar
&lt;/h3&gt;&lt;p&gt;A* アルゴリズムを用いて、経路選択を実装した。グラフの構造のみを考慮する盲目的探索とド距離推定などのメイン知識を活用するヒューリスティック探索があるが、A* アルゴリズムはヒューリスティック探索に分類され、実務でも検討される手法であると紹介されていた。単純な最短経路探索よりも効率的に、現実的な経路を見つけられる点が印象的であった。ゲーム AI における経路探索の代表的な手法として、非常に重要な内容だったと思う。&lt;/p&gt;
&lt;h3 id="homework-4-navmesh"&gt;Homework 4: NavMesh
&lt;/h3&gt;&lt;p&gt;NavMesh では、フィールド上に三角形のメッシュを張り、その上を通る経路を構成した。グリッドよりも自由度が高く、キャラクターの動きも自然になりやすい。ゲームでよく見る滑らかな移動が、どのように実現されているのかを理解するのに役立った。それぞれ、以下のような特徴で整理される。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;表現単位&lt;/th&gt;
&lt;th&gt;空間効率&lt;/th&gt;
&lt;th&gt;経路品質&lt;/th&gt;
&lt;th&gt;runtime扱いやすさ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grid&lt;/td&gt;
&lt;td&gt;一様セル&lt;/td&gt;
&lt;td&gt;低（広域で過密）&lt;/td&gt;
&lt;td&gt;後処理前提&lt;/td&gt;
&lt;td&gt;高（実装単純）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Path Network&lt;/td&gt;
&lt;td&gt;点と線&lt;/td&gt;
&lt;td&gt;高（疎にできる）&lt;/td&gt;
&lt;td&gt;配置品質依存&lt;/td&gt;
&lt;td&gt;中（オフパス対処が重い）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NavMesh&lt;/td&gt;
&lt;td&gt;凸ポリゴン面&lt;/td&gt;
&lt;td&gt;高（適応解像度）&lt;/td&gt;
&lt;td&gt;高（funnel適用容易）&lt;/td&gt;
&lt;td&gt;高（面制約が使える）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="homework-5-projectile-aiming-with-prison-dodgeball"&gt;Homework 5: Projectile Aiming with Prison Dodgeball
&lt;/h3&gt;&lt;p&gt;投擲物の軌道を予測し、動く対象に対してどのタイミングで投げるかを判断する課題であった。飛翔体に関しては、発射時の初速を1回決めた後には基本的に軌道修正できないため、予測の精度要求が高くなる。距離や発射角度などを考慮しながら、到達地点を予測して狙いを定めるロジックを実装した。実装に関してはいくつか選択肢が考えられるが、ここでは実装難易度と精度を考慮して余弦定理法を実装した。投げられない状況も含めて考慮する必要があり、単純な計算だけでは済まない面白さがあった。&lt;/p&gt;
&lt;h3 id="homework-6-fsm-with-prison-dodgeball"&gt;Homework 6: FSM with Prison Dodgeball
&lt;/h3&gt;&lt;p&gt;この課題では、ドッジボールの行動を FSM で制御した。ボールを持っていないときは探し、持てるなら取りに行き、取れたら投げるというように、状態ごとにロジックを切り替える設計である。TA が作成した相手チームに対して勝利するのが課題のゴールであったが、任意で受講者が参加する別のトーナメントが開催されていた。勝利数に応じて最終的なランクが決定し、extra credit が提供された。&lt;/p&gt;
&lt;h3 id="homework-7-race-track"&gt;Homework 7: Race Track
&lt;/h3&gt;&lt;p&gt;Race Track では、fuzzy logic を利用して決められたコースを安定して走り切るように調整していく課題だった。速度が低いときは加速し、カーブがあるときはハンドルを切るなど、複数の条件に応じて柔軟に振る舞いを変えることができた。FSM よりも条件が重なりやすく、より自然な制御がしやすい点が特徴である。FSM ははっきりした状態の切り替え、Fuzzy Logicは曖昧さを数値化して滑らかに連続的判断する場面で利用されることが多い。&lt;/p&gt;
&lt;h3 id="homework-8-procedural-content-generation"&gt;Homework 8: Procedural Content Generation
&lt;/h3&gt;&lt;p&gt;Procedural Content Generation (PCG) では、アルゴリズムでゲーム内容を生成する考え方を学んだ。Minecraft や No Man&amp;rsquo;s Sky のように、フィールドを自動生成することで、ほぼ無限に近い遊び場を提供するという発想である。この課題では、いくつかのバイオームを含むフィールドを生成した。&lt;/p&gt;
&lt;p&gt;white noise は不自然になりやすいため、perlin noise を利用した。あらかじめフィールドを作成するコードは提供されており、主にパラメータ調整を行った。noise を重ね合わせることで、自然なスケール感を持つ異なるバイオームが表現できた。受講者同士で生成結果を共有する機会もあり、上手い人の作品では山や川の差異が非常に自然で印象的だった。&lt;/p&gt;
&lt;p&gt;PCG の参考情報&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=Uqk5Zf0tw3o" target="_blank" rel="noopener"
&gt;Spelunkyのステージ作成法| Game Maker&amp;rsquo;s Toolkit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=ToCozpl1sYY" target="_blank" rel="noopener"
&gt;GPU-Based Run-Time Procedural Placement in Horizon: Zero Dawn&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="quiz"&gt;Quiz
&lt;/h2&gt;&lt;p&gt;この授業では試験はなく、毎週のクイズと課題で成績が決まった。クイズはオープンテキスト形式で、コンテンツや資料を参照しながら取り組めるため、必要以上に身構える必要はなかった。ほぼすべてのトピックに対してクイズが用意されていたので、授業内容を一通り確認する意味合いが強かった。&lt;/p&gt;
&lt;p&gt;提出期限は比較的柔軟で、空いた時間に進められた点も取り組みやすかった。ただし、内容によっては計算や具体的な挙動の理解が必要になるため、単に流し読むだけでは対応しづらい部分もあった。全体としては、難しすぎず、授業内容の理解を促す適度な負荷だったと思う。&lt;/p&gt;
&lt;h2 id="reflection"&gt;Reflection
&lt;/h2&gt;&lt;p&gt;ゲームの裏側で動いているロジックを学べたことが、この授業で最も面白かった点である。最近の AI というと Generative AI や Deep Learning を想像しがちだが、ゲームの中では昔から AI が自然に使われており、自分にとってはむしろこちらの方が馴染み深いテーマでもあったと感じた。&lt;/p&gt;
&lt;p&gt;古典的な手法であっても、プレイヤーにとって十分に面白い体験を作れることが理解でき、AI を「完璧にする」こと自体が目的ではなく、ゲームとしてちょうどよい強さや振る舞いを設計することが重要である点は印象に残った。&lt;/p&gt;
&lt;p&gt;また、Unity を使って実際に手を動かしながら学べたこともよかったと思う。特にドッジボールやレースの課題では、ロジックを少しずつ調整しながら挙動が変わっていく様子を確認でき、試行錯誤そのものが楽しかった。&lt;/p&gt;
&lt;p&gt;一方で、講義内容はかなり多く、夏学期の短い期間で吸収しきるのは難しい面もあった。もう少し長い期間で受講できていれば、さらに深く理解できたかもしれない。それでも、内容と課題の両方が興味深く、総じて満足度の高い授業だった。&lt;/p&gt;</description></item></channel></rss>