無料で読める "Game AI Pro" がとても良い

Game AI Proという、ゲームAIについての記事をまとめた本があります。
Game Programming Gemsのように技術について書かれたトピックを、
たくさん集めた本、それのゲームAIについて特化したバージョン。

Game AI Pro, Game AI Pro2という2冊の本が現在刊行されているが、
最初のGame AI Proは公式サイトですべての記事が公開されています。

www.gameaipro.com

ゲームAIは最近、テクニックが細分化され高度化されているおり、
ゲームプログラマとしては、ある程度把握しておくのは良いこと。

最近だと開発会社によっては専門職としてゲームAIプログラマーを採用していることもあり、
AIに習熟していけばエキスパートを目指すのもありだし、
そうでないオールマイティなゲームプログラマとしても、
スキルセットに持っておくのはプラスになるでしょう。

公開されているのは英語版になり、
まだ日本語には翻訳されてませんが、
それでも読む価値はあると思います。
とても有用な本なので、是非日本語化されて欲しいとは思いますが。

今回、さっと読んでみて、
とばし読んだところもあるけど、
各章の概要をまとめておこうと思います。
紹介程度に。

Section 1: General Wisdom

1. What is Game AI?

概要。Game AIの定義とは。

2. Informing Game AI through the Study of Neurology

神経学の入門。

3. Advanced Randomness Techniques for Game AI: Gaussian Randomness, Filtered Randomness, and Perlin Noise

シンプルなランダムではない3つの特徴のある乱数の紹介。

Section 2: Architecture

4. Behavior Selection Algorithms: An Overview

アルゴリズムの選択について。 FSM/HFSM/behaviour tree/GOAP
Hierarchical Task Networks(HTN)

5. Structural Architecture -- Common Tricks of the Trade

アーキテクチャの紹介。hierarchy/option stacks/black board/Modularity

6. The Behavior Tree Starter Kit

BTについて概要と実装。

7. Real-World Behavior Trees in Script

Kingdoms of Amalur: Reckoningというゲームでの実例。
ビヘイビアの実装をLuaスクリプトで書くことによるイテレーションの高速化。

8. Simulating Behavior Trees: A Behavior Tree / Planner Hybrid Approach

ビヘイビアツリーとプランニングのハイブリッド実装。

9. An Introduction to Utility Theory

ユーティリティ理論・ユーティリティベーストAIのイントロダクション。

10. Building Utility Decisions into Your Existing Behavior Tree

ユーティリティのBTへの組みこみ。

11. Reactivity and Deliberation in Decision Making Systems

Reactivity(反射、反応)とdeliberation(熟考)について、どのデザインが効果的か、どう落とし穴を回避するか。
意思決定システムにはReactivityとDeliberationが必要。

12. Exploring HTN Planners through Example

hierarchical task networks(HTN)について。

13. Hierarchical Plan-Space Planning for Multi-Unit Combat Maneuvers

Multi agent におけるプランニングは、協調させる必要があり、ワールドステートが膨大になるためGOAP,HTNが適用しにくい。
全てのプランを含むplan-spaceで調べるメリットについて。

14. Phenomenal AI Level-of-Detail Control with the LOD Trader

LODについて。距離だけでは微妙。

15. Runtime Compiled C++ for Rapid AI Development

RCC++ runtime c++コンパイルについて。

16. Plumbing the Forbidden Depths: Scripting and AI

スクリプティングについて。

Section 3: Movement and Pathfinding

17. Pathfinding Architecture Optimizations

A*より最適化の余地がある。事前計算など。

18. Choosing a Search Space Representation

探索のための世界表現の選択。
Grid / Weigh-pointed graph / Navigation Meshes

19. Creating High-Order Navigation Meshes through Iterative Wavefront Edge Expansions

ナビゲーションメッシュの生成アルゴリズムについて。

20. Precomputed Pathfinding for Large and Detailed Worlds on MMO Servers

MMO(FF14)での事前計算ナビゲーションの用例。

21. Techniques for Formation Movement using Steering Circles

Steering circleを用いた隊列移動。

22. Collision Avoidance for Pre-Planned Locomotion

Hitman:Absolutionでの、ADL(Animation Driven Locomotion)とコリジョン回避の組み合わせ方法。
Reciprocal velocity obstacle techniques (RVO)

23. Crowd Pathfinding and Steering using Flow Field Tiles

FlowFieldを利用した群衆の移動。

24. Efficient Crowd Simulation for Mobile Games

FieldRunner2におけるFlowField。モバイル最適化。

25. Animation-Driven Locomotion with Locomotion Planning

ADL を状況に合わせてプランにする。
Bulletstormでの例。

Section 4: Strategy and Tactics

26. Tactical Position Selection: An Architecture and Query Language

Tactical Position Selection (TPS)
CryEngine, Crysis2。
DSLによる非同期抽出,重みつけ

27. Tactical Pathfinding on a NavMesh

最短経路よりも、危険性などを考慮した良い経路をナビメッシュで見つける方法。

28. Beyond the Kung-Fu Circle: A Flexible System for Managing NPC Attacks

Kingdoms of Amalur: Reckoningでの例。
よくある多数のエネミーとの戦闘で通常1人ずつ攻撃してくるようなケース(Kung-Fu Circle)で、
ダイナミックまたは難易度に応じて攻撃してくる人数を変動させる。
ベルギアンAIの紹介。

29. Hierarchical AI for Multiplayer Bots in Killzone 3

Killzone3のBots
3つのレイヤーからなるアーキテクチャ
レイヤーは下のレイヤーを制御し、下のレイヤーは情報を返す。

30. Using Neural Networks to Control Agent Threat Response

supreme commander 2にて
ニューラルネットワーク使ったら非常に効果的だった話。

Section 5: Agent Awareness and Knowledge Representation

31. Crytek's Target Tracks Perception System

CryEngineのTarget Tracks Perception System (TTPS).
主人公の居場所などをAIに渡してしまうと不自然に感じられてしまう。

32. How to Catch a Ninja: NPC Awareness in a 2D Stealth Platformer

Mark of the NinjaのAI実装例。
interest sourceを使ってオブジェクト・イベントを大量に作成する作業の軽減や、
roleをエージェントに与えて自然なグループの反応の実現について。

33. Asking the Environment Smart Questions

Bulletstormの例。
低CPUコストで直観的なシステム。Environment Tactical Querying (ETQ)

34. A Simple and Robust Knowledge Representation System

EverSkyの例。
Knowledgeについて、blackboardの改善。

35. A Simple and Practical Social Dynamics System

パーティでのハグなど言葉を用いないコミュニケーションにより世界をより納得感のあるものに。
Gaze control(凝視)/Proxemic Control(位置、距離)/Posture(姿勢)/Gesture

36. Breathing Life into Your Background Characters

背景NPCについて。Schedule system。

37. Alibi Generation: Fooling All the Players All the Time

町を歩くNPCをより高度なものにするために意味をつける。
どういう背景を持っていて、なにをするのか。

Section 6: Racing

38. An Architecture Overview for AI in Racing Games

レースゲームのためのアーキテクチャ。4つのレイヤーと一つのサブシステム(コリジョン回避)

39. Representing and Driving a Race Track for AI Controlled Vehicles

Track(コース)について。

40. Racing Vehicle Control Systems using PID Controllers

PIDコントローラについて。

41. The Heat Vision System for Racing AI: A Novel Way to Determine Optimal Track Positioning

ひとつの車への反応を記述するのはできるが、同時に一台となってしまう。
混雑した状況での挙動のためにHeat visionというシステム。

42. A Rubber-Banding System for Gameplay and Race Management

Rubber-banding。
プレイヤーの前に離れているときはスローダウン、
後ろにいるときはブーストしてプレイヤーの近くに来るようにする。

Section 7: Odds and Ends

43. An Architecture for Character-Rich Social Simulation

Prom Weekで使われた Comme il Faut (CiF) social simulation architecture について。

44. A Control-Based Architecture for Animal Behavior

World of Zooの例。
Control-Basedアーキテクチャ

45. Introduction to GPGPU for AI

GPGPUの話。OpenCL

46. Creating Dynamic Soundscapes using an Artificial Sound Designer

Artificail Sound Designer。
イベントを登録してDBを更新して適切な音を鳴らしてくれる。

47. Tips and Tricks for a Robust Third-Person Camera System

Third-Person viewにおけるカメラについて。

48. Implementing N-grams for Player Prediction, Procedural Generation, and Stylized AI

N-gramsの推測をゲームへの適用する。



以上、簡単なコメントを読んだメモから補足して、
書いてます。

僕自身は実はGame AI Proをkindle版を購入してましたが、
そのあとpdfの公開に気付きました。

次はGame AI Pro2も読みたいところです。

Unity5.4 で Object.Instantiate()に親が指定できる

タイトルままですが、
ふとintellisenseが見慣れないサジェスチョンしてきたので気づきました。

docs.unity3d.com

引数にparentとなるtransformを指定できます。
生成時に他のTransformの子として生成できます。

これは便利、というかいままで無くて不便なので、
拡張メソッドでInstantiateAsChild(this Transform parent) みたいなものを作ってました。


Release noteにも

unity3d.com

Core: Object.Instantiate now takes a optional Transform parent parameter.

ちゃんとありましたね。

    [SerializeField]
    GameObject childPrefab;


    void Start ()
    {
        var parent = this.transform;
        Instantiate(childPrefab, Vector3.zero, Quaternion.identity, parent);
    }

こんな感じで。
オブジェクトに追加しておくと、

f:id:kurihara-n:20160813011402p:plain

このように呼び出したものの子になる。

シン・ゴジラ感想

昨晩見てきた。

面白かったし、これでネタバレを気にしないですむ。

時間が合う回で見に行ったらMX4Dという座席が揺れたり、霧吹きつけられたり、

スモークがたかれたりするスクリーンで、

これは完全に失敗。

ビル崩壊に合わせて焚かれたスモークが、

次の会議室のシーンまで残ってスクリーンに被ってたり、

メガネに霧吹きつけられたらどうなるのか分かってないんかって思ったり。

まあ事前にちゃんと調べておけという話である。

 

序盤、中盤、終盤と盛り上がりがあって、

気持ちが持ってかれて、

結構、顔がうわーって顔して見ていたんじゃないかな。

 

http://sho.tdiary.net/20160731.html

そう、もうネタバレ気にしないでいいので、

こちらを読んで。

そう、特にちょっと序盤はちょっと特に

心が痛むような、そんなことも思いながら見てた。

 

人間の描写は、石原さとみが思いの外可愛くもなく、

その割に大統領になるっていっても、その素養がなさそうだが…みたいな感じだったり、

主人公が何日もシャツ変えてなくてシャワー浴びてなくて臭うってシーンがあったわりに

無精髭も伸びてないきれいな顔してて

ちょっと詰めが甘い、っていうかそこに興味が薄いのかなって感じがしたり。

まあ、そのぶん色々なオジサン俳優が出てて、

オジサンの成分は良い感じに出てた。

 

あと戦車がかっこよかったな。

 

 東京は政治も経済も集中しすぎなので、

せめて政治機能を千葉の浦安に移すと、

ゴジラとしては有効なんではないかな。

 

途中からゴジラ自分で戦って倒したい気がしたので、

地球防衛軍をすっごくプレイしたくなってた。

帰ってから地球防衛軍4.1をダウンロードしようか悩んだけど、

今月はNo man's skyを予約したので我慢。

正しい重力には従わないキャラクターのコンポーネント設定

Unityにて3Dキャラクターのコリジョン処理を含めた移動処理を実現したい場合、

  • CharacterControllerを使う
  • StandardAssetsのThird Person Controller的にCollider+Rigidbodyを制御する

などの方法や、その他ゴニョゴニョするなどがありますが、
どれが最適かはそれぞれのゲームで表現したいことなどに依存するかと思います。

今回、余暇で作ってるゲームのキャラクター挙動で、
Rigidbodyもつけつつ、Physicsの重力計算は無視したくなり、
いくつか試行錯誤したので、
その結果と過程におけるキャラクターのコンポーネント構成/設定を書いてみたいと思います。

キャラクター制御に対する一つのアプローチだと思って頂ければと思います。

そもそも

上記に上げたほうほうでなにが都合が悪いのか。

CharacterController

http://docs.unity3d.com/ja/current/Manual/class-CharacterController.html

Character Controller は、主にRigidbody による物理特性を使用しない、3 人称や 1 人称のプレイヤー制御に使用されます。

Character Controllerを使うと、Rigidbodyが無くても地形・壁との接触判定をした移動をしてくれます。
逆に、Rigidbodyを想定した、その他のRigidbodyを持つオブジェクトと共有できるような普遍的なコンポーネントなどを作るのは難しくなっちゃいます。

一方、プレイヤーキャラクターが物理特性の影響をうけるようにしたい場合は、キャラクターコントローラーの代わりに、リジッドボディ を使用した方がよいでしょう。

ともあります。

Third Person Controller

Standard Assetsのサンプルシーンに含まれる
https://www.assetstore.unity3d.com/jp/#!/content/32351
人型のキャラクターEthanがフィールドを走り回るデモです。

EthanにはRigidbodyとCupsleColliderがついており、
OnAnimatorMove()でanimator.deltaPositionから平行移動、
FixedUpdate()からRigidbodyに対してジャンプ処理のためにAddForceをしています。


物理的な挙動になりますが、
細かな挙動の作成が面倒であったり、
プレイヤーの状態によって色々な挙動にしたい場合など、
ちょっと面倒に思います。
特徴的なアクションをキャラクターにさせたい場合、
例えば残像を残しずつ瞬間移動をしたりとか、
そういうときはforceではなく、座標を直接制御したくなったりします。

今回、ひとまず落ち着いた方法としては、
上の二つの中間のようなあたりのやり方になります。

設定

f:id:kurihara-n:20160731174612p:plain

キャラクターにはColliderとRigidbodyをつけます。
壁等とのコリジョン処理はRigidbodyによって押し合い・壁ズリ処理してもらいます。
useGravityを無効にして、ジャンプ、落下処理は自分で行います。
一方、地面との設置判定は自前のスクリプトで、
Rayを飛ばして判定をとるようにします。

インスペクタはこんな感じ。
f:id:kurihara-n:20160731224556p:plain

LayerはPlayerにしています。
これはレイキャストによる地面判定時に自分のコリジョンにレイがヒットしないように
Playerのマスクを無視するよう指定するためです。

コンポーネントは上から、
Rigidbody
SphereCollider
CharacterLocomotion(移動のための自作スクリプト)
以下はその他もろもろ

要点としてはRigidbodyの設定になります。
まず、Dragはデフォルトでゼロになっていると思いますが、
物理挙動による力が加わった場合に減衰させるための値を入れておきます。

use Gravityのチェックは外しておきます。
このケースでは落下処理はスクリプトで行います。

constrintsの設定は、回転に関して3軸固定にするためチェックを入れておきます。
物理計算時に回転が入ってしまうことを防ぎます。

Character Locomotion

これは移動処理を行う自作スクリプトです。

例えば、ジャンプボタンを軽く押した場合に短いジャンプをし、
ジャンプボタンを長押しした場合にゆっくり大きいジャンプをする、
というようなキャラクターの挙動を書いてみたとします。

gist.github.com

途中にアニメータのフラグの設定など余計なものがありますが、あくまでひとつの例ということで
とりあえずそのままにしてます。

        verticalSpeed -= Time.deltaTime * gravityScale;
        transform.position += new Vector3(0.0f, verticalSpeed, 0.0f) + horizontalSpeed;

で自前で落下の処理を行っています。

その処理のあとのRayCastをしているあたりが地面の判定をしている箇所になります。
さきに書いたように自分自身のLayerであるPlayerのマスクを無視するよう指定しています。

JumpInputという別のコンポーネントで、ジャンプボタンの入力をトリガーするようにしています。
短いジャンプのイベントがきたら、

        verticalSpeed = 0.2f;
        gravityScale = 1f;

長いジャンプの入力で

        verticalSpeed = 0.08f;
        gravityScale = 0.1f;

と重力計算パラメータを変更するようにしています。

f:id:kurihara-n:20160731231753g:plain

あくまで一つの例ではありますし、
プログラムもこのままではまずいですが、
こういう実装の選択肢もあるかと思います。


ユニティちゃんライセンス

この作品はユニティちゃんライセンス条項の元に提供されています

Unreal Engine 4 で極めるゲーム開発 感想

Unreal Engine 4で極めるゲーム開発:サンプルデータと動画で学ぶUE4ゲーム制作プロジェクト

Unreal Engine 4で極めるゲーム開発:サンプルデータと動画で学ぶUE4ゲーム制作プロジェクト

とりあえず読了。
理解のためにはハンズオンが基本的には必要だけど、
後半時間があまりなかったので、
少々飛ばし読みしてしまいました。

もう少し実務でUE4を使うか、
サイドプロジェクトで使うとなったら
全て手順通りやってみたいと思います。

まずUE4の入門書としては
実際にサンプルのゲーム制作を通して
ひととおり必要になる要素に説明をしていて
とても良いと思います。
これはまだ僕がUE4初級者だから、ということもあり、
熟練者からしたら少し視点が違うかもですが。

この本は、ゲーム開発に関わる様々なセクションの人に向けて書かれており
各章ごと、どのセクション向けかという案内がされていたりもします。
その点では色々な人が導入しやすいような作りになっています。
ただゲームプログラマ視点からいうと、

  • 入力をとる
  • ゲームオブジェクトを移動させる
  • ゲームオブジェクトを動的に生成させる

という処理の実現方法が、
もう少し早い段階できても良かったかな、とは思いました。
ただ上に書いたとおりプログラマ向けだけの本ではないので、
そこはあまり無理を言ってもというところであります。

特に良いなと思ったのがワークフローについてで、
それぞれの章での説明の背景に、
つねにワークフローが意識されつつ、
本が構成されているように思ったところです。
4.2節ではまるまるワークフローに説明が割かれています。
また、他の箇所でも、
ゲームの実制作におけるワークフローの在り方について意識がされているように思いました。

そういう意味で、これはUE4の本ではありますが、
UE4を使用する人以外でも、
読んでみて為になることはあるのではないかと思いました。

Constant Force コンポーネント

 
Constant Force コンポーネントについて。
 
子供と作ってるゲームのために武器のアセットを買ってみたのですが、
 
 
デモの挙動を見ていると、
Constant Forceという慣れないコンポーネントがついていました。
 
Rigidbodyに一定の力を与えるためのコンポーネントのようです。
 
 
ドキュメントによるとforce/relative force, torgue/relative torqueというパラメータがあります。
relativeはオブジェクトのローカル座標系におけるベクトルで、
そうでないほうはワールドで処理されます。
 
ミサイルのように前に前にと飛んでいくオブジェクトはrelative forceを設定します。
また、例えば外からの力で飛ばされるような場合はワールドのほうを使うと良いのかと思います。
 
どうも検索すると3,4年前の動画も出てくるので、
ずっと前から存在していたコンポーネントのようです。
でも知らなかった…か、忘れてたか…。
 
このコンポーネントと同様な表現は、それほど難しくないスクリプトで実現できますが、
覚えておくと手早く使えて便利そうです。
 
飛んでく弾がConstant Forceによるものです。 

f:id:kurihara-n:20160721001338g:plain

着弾時にStandard assetsのparticle demoで使われているexplosionを生成すると

rigidbodyを持つオブジェクトが飛ばせて良い感じ:)

ユニティちゃんライセンス

この作品はユニティちゃんライセンス条項の元に提供されています

 

Unity アプリのバージョンを知る

スマートフォンアプリを開発していて、複数のデバイスを使っていたりすると、
「あれ、このデバイスに入っているこのアプリはいつのバージョンのもの?」
みたいなことに立ち会うことがたまにあります。

開発用のビルドでは、そのアプリがいつのアプリなのか分かると助かります。

そのためバージョンナンバーをアプリアイコンにオーバーレイで書き込むアセットを作って
ストアに公開しました。

AppVersionIcon
https://www.assetstore.unity3d.com/jp/#!/content/65849

f:id:kurihara-n:20160712230042p:plain

こんな感じのエディタウィンドウでバージョン番号を設定してapplyすると
アプリのアイコンにナンバーが書かれます。

f:id:kurihara-n:20160712230308p:plain

こんな感じ。

これは割とマイルストーンごとに手動で使ってもらうことを想定しているので、
自動でビルド毎にナンバーが書かれるようなものにはなっていません。

もう1つのやり方として、
自身のアセンブリからバージョン情報を取得し実行中にどこかで表示するという方法があります。

using UnityEngine;
using System.Collections;
using System.Reflection;
using System;

[assembly: AssemblyVersion("1.0.*")]
public class BuildDate : MonoBehaviour
{
    string   dateText;
    GUIStyle style = new GUIStyle();
    Rect     rect  = new Rect(0, 0, 640, 30);
    const int defaultFontSize = 12;

    void Start()
    {
        var asm = System.Reflection.Assembly.GetExecutingAssembly();
        var version = asm.GetName().Version;

        int days = version.Build;
        int seconds = version.Revision * 2;

        DateTime baseDate = new DateTime(2000, 1, 1);
        DateTime buildDate = baseDate.AddDays(days);
        DateTime buildDateTime = buildDate.AddSeconds(seconds);

        dateText = "Build date :" + buildDateTime.ToString();
        style.fontSize = (int)(defaultFontSize * Mathf.Max(1.0f, ((float)Screen.width / rect.width)));
    }

    void OnGUI()
    {
        GUI.Label(rect, dateText, style);
    }
}
<||

こちらはスクリプトをコンポーネントとしてアプリのメイン画面に存在するオブジェクトなどに追加しておけば、
ビルド毎の時間を時間を表示してくれるので便利です。
アプリを起動する必要はありますが、自動にビルドごとに更新されていくので情報は確実です。

例えば、相互に通信するアプリを作っていた場合バージョン違いで送受信するデータに不整合が起こるようなことは
まま起こりえます。