06 « 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 08

0007:新年関係なく。 

y2017.png
新年あけましておめでとうございます。
今年はよい年にならんことをー。

今日はそんなことも関係なく、ゲームのプログラムについて語ります。
興味ない人にはタイクツかもしれません。基本、語る、このブログの全記事にいえることですが。


■ゲームを作るってコトについて思ったコト
ゲームを作るのは、面白い。
自分は正直、昔っからそういうのは好きでして、RPGツクールとかさわってたワケなのですが。
今でも趣味でたまーにゲームを自作しようと試みたりしています。完成まで至りませんが

んでもってな話。
ゲームというのは作るのに必要な知識がやたら多く、
まるで、
未踏の鉱脈の如く、
すばらしいアイデア・アルゴリズムに次々と出会い、
知識の幅が広がっていくのです。

嗚呼、なんて楽しいんだ、プログラミング・ワールド。

今回は、ゲームを作るうえで考えるいろーんなコトを思いついたぶんだけ連ねつつ、ボチボチと語ります。



■グラフィック
gts.jpg
まず真っ先に挙がるのはやっぱりグラフィック。
PS1や64の時代は、モデリングや3Dの処理技術が未熟でも成り立つぐらいの世界だったので
ものすごく大量のゲームが発売されましたが、今では通用するグラフィックレベルが上がりすぎて
追いつけないクリエイターも続出の困ったちゃん。

ちなみにPS4の主要クラスのキャラのポリゴン数は10万を超えることもあるそう。
昔はそれこそデッサン人形みたいなもので、
首、肩、肘、手首、腰、股、膝、足首が動けば表現ができましたが
最近の超リアルなゲームでは、顔だけで100以上の可動部が入ることもザラ。
マユや唇のようなやわらかな可動部には、
歯の矯正みたいに可動用のポイントが列をなして埋め込まれてたりします。

しかし最もエゲツないのはやっぱり風景でありましょう。
最近流行のオープンワールドは特に顕著に創意工夫を必要とします。
いくらPS4や最新のPCが高性能とはいえ、60FPS(=0.0166秒)の中で
見渡す限りの大地をフルCGで映すわけにもいきません。
そういう時、カリングだの、オクルージョンだの、LODだの、といった技術を使ったりします。
ちなみにPS4なら1000万ポリゴンぐらい出せる?とかなんとか・・・。
なおハリウッド映画で使われるフルCGのキャラのポリゴン数は数百億~兆単位です。
う~~~~ん。天文学的だ・・・。

他にもテッセレーションとか、シェーダとか、とにかく覚えることが多いというか
それだけでもう成り立つ分野なのです、CGってやつは。
映画やCMみたいな決め打ちのシーンは上記のごとくめちゃくちゃにポリゴン数を割いてもいいのですが
ゲームでリアルタイムに動かすためには所々の知識が欠かせません。
髪の毛に影や鏡、映り込み、水面、エフェクト…。それぞれ特化したエキスパートが居てもいいぐらいです。

■UI
gts2.jpg
ユーザにとっては地味というか、あって当然なUI。HUD。
こいつらもゲームを作る側にとってはなかなか強敵です。
上の、FF14のSSを見てもピンとくる方はいるかもしれませんが、ゲーム中の情報は全てUIに集約されます。
単純なステータスだったり、プレイ時間だったり、ゲーム内の時間だったり、チャットだったり。
通信されたデータだったり、セーブデータからの読み込みだったり、
リアルタイムな状況告知だったり、とにかく処理が忙しないので、意外と時間がかかります。
他にも機能的に大きなもの、例えばミニマップやチャット欄なんかは専用で大きな処理になりそうですね。

またメニューには小うるさい制約が多くあり、綺麗にコードを書きたいプログラマをいじめます。
例えば、ボタンを押した瞬間にパッとメニューが出て、
キャンセルしたらパッと消えるようなものはあんまりないと思います。
たいてい、横からスライドインしてくるとか、そういう演出があります。
そして演出中はボタンを押しても受け付けないのがふつうです。
かなり細かいことですが、環境によってはこういう表現がプログラマに負担をかけたりします。
(ゲーム特化のUI作成ツールを使っていればだいぶ緩和されるかもしれませんが)

他にもこまかーーーいことといえば
「特定のシーンでだけ、使えるコマンドが別物になる」
「チュートリアルのときだけ、一部のコマンドが光る」
なんかは結構うっとおしいんじゃないでしょうか。・・・
特殊な例といえば、カービィのトリプルデラックスではカービィの「ビッグバン吸い込み」で、
ボスのみならず、ボスのHPゲージまでもがひんまがって吸い込まれるという演出があったりします。

自分が趣味でゲームを作る場合、だいたいUIで挫折します。手抜きしたくても中々できないし、難関です。

■AI
gts3.jpg
AIもまた、専門性の高い分野の一つ。
しかも、ゲーム別に全く違うAIが要求されるという凶悪性能の持ち主。
ゆえに経験を積みづらく、自分は正直さっぱりわかりません。

近年では将棋や囲碁のAIが世間を沸かせていますが、
ゲームの中にはそれらより難しいAIが必要なものもあります。
といっても、それは「人間らしく動いて、人間に負けないAI」を目指した場合の話で、
ゲームの場合は1フレームでの超反応やCOM用の裏補正を駆使してチョロまかすことが多いです。
以下は、COM補正についてのマリオカートの実例です。
・COMは画面外に行った瞬間に超加速して無理やりユーザに追いつく
・COMは画面外ではステージギミックをほぼ全てすり抜ける
・COMはアイテムを拾っても拾わなくても関係なく、特定間隔で自動的にアイテムを使用する

一見するとめちゃくちゃ理不尽ですが、AIの裏事情なんてそんなものです。

逆にごまかしがきかないAIが必要なゲームはハードルが一気に上がります。
たとえばボードゲーム。
桃鉄のようなタイプだと、相当複雑な予感がします。
マリオパーティのようなタイプなら、ミニゲームはともかくマップ移動に関してはそれほどいらないはず…。
他には格闘ゲームなども正々堂々とした空間にCOMがおかれるので、ある程度複雑化します。
ただ、決まったコンボパターンを距離別に用意し、コンボ精度や距離精度、反応速度をパラメータとして
分けることである程度動いてくれる・・・はずなので、ノウハウさえ揃っていれば意外となんとかなるか?

とにもかくにも、AIの辛いところはそのゲームに特化しまくった構造になるということ。
レースやアクション、RPG、ボードゲームでぜんっぜん構造は変わります。
また、ギミックやアクションなどが新要素として追加されると、かなーり困ったことにもなります。
それらに対応していないので、新要素が重要であればあるほどAIは置いてけぼりです。
さらに、AIはバランス調整をするのがとても難しい上に、
ゲームが完成間近にしかまともに調整できないためレベルデザイナーにとっても強敵です。
シリーズものの1作目はAIがアホ、というのは非常によく聞く話。
当たり前といえば当たり前ですね・・・。

カービィのようにボスの行動をほぼパターン化したり、
ディスガイアのようにだいたい最善行動をとるようにするなど
AIの難点をぶっちゃってしまえば逆にゲームとしてのクオリティが上がることさえあり得ます。

■サウンド
ceat.jpg
自分にとってはAIよりもっとわからない、それがサウンド。
「ループするかどうかだけ決めて鳴らすだけじゃん」というのは夢のお話。
同時に鳴らすことができる音数は決まってますので・・・。

たとえば、敵が倒されると「うおおお~」ってボイスがなるゲームがあったとします。
しかし、敵が100体ぐらいでてくる無双系ゲームで、
超必殺技みたいなのを使って、同時に100体倒せるとします。
100の「うおおお~」が同時再生されたらスピーカー的にも耳的にもアブナいです。
たぶんそもそも100チャンネル同時再生とかできない気もしますが・・・そのへんは詳しくないので割愛。

ほかにある問題点としては、たとえばさきほどの100個のボイスがなる無双ゲームの途中、
ストーリー展開などで仲間キャラクターが「そっちはどう?」的な会話イベントを発生させてるとします。
同時にならせるサウンドには限界がありますので、100個のボイスを無作為に再生したとすると
下手したらその仲間のセリフのボイスが同時再生音の限界で、消える可能性もあります。
まぁ、そんなことになってるゲームはよほどのクソゲーでもまずないですけどね・・・。

そこらへんは基礎的なところができていれば問題ない範囲ではありますが、
最近のゲームあるあるとしては3Dサウンド。
オープンワールドなんかでは基本ですが、音の発生源によって音量の左右バランスや
音反響などでの奥行き表現が変わったりするものです。
これもド素直に音量設定すると、
100mぐらい響かせたい爆音なのに10mも届かないというよくわからない自体になったり。
偽りの音量設定は大事です。

また音ゲーなんかでは、サウンド周りの管理は命です。
ゲームは完璧に60FPSで動けるわけではない
(どんなにいいPCでも機械の動作誤差によって瞬間的に58FPSぐらいになったりする)のですが、
音ゲーは音にあわせてタイミングよく譜面が流れてきてもらわないと困ります。
3秒に1回、59FPSになるとすると、1分で20フレーム、0.3秒もの誤差になります。
ステージ開始時から曲をただ「再生」するだけの処理だと、
曲が終わるころには0.5秒ぐらいはズレますね。
譜面と曲が0.5秒もずれてたら音ゲーとは呼べません。

というわけで、音声の進捗(動画サイトのシークバーてきな)も厳密に管理したり、
また入力ミスしてゲージがなくなるとBGMがヨボヨボしたアレンジに切り替わったり。
音ゲーはサウンドをしっかり管理しないといけないジャンルなのです。多分!!

何度もいいますが自分はサウンドは詳しくないので間違ってるかもしれません。
いまのところ上記は大半、経験による憶測です。

・・・ほかにも、マイクを使う音声認識ゲームなどではさらなる深遠な知識が必要です。
サウンドエンジニアという単語が存在するぐらい、専属の分野になっていますね。

■乱数
srdize.jpg
長々と語る大ジャンルを連ねてみましたが、ここでどちらかといえば小ジャンル。
乱数です。
乱数といえば皆さん闇をかかえ、膝をかかえるワードです。

乱数というと、たんにランダムな数という感じはしますが、
実はコンピュータはランダムなんてものは作れません。
だってちょっと考えればわかるじゃあないですか。
原理的に規則正しく動いているものだけでランダムが作れますか?という話ですよ。
というわけで、ゲーム・・・というよりアルゴリズム全般の世界では
「よりよいランダムっぽい数字を生み出す機構」が求められます。

たとえばデフォルト機能として入っている「rand」という機能は、
「線形合同法」とかいうランダム発生機能を使っています。
この機能、趣味ゲーなどの手抜き乱数でよい場合はあまり気にならないのですが
得られるランダムな数をグラフにして分布をみると、「網目状」の偏りが丸見えになります。

これに対し、よく使われる代表的なアルゴリズムとして「メルセンヌツイスタ」というものがあります。
これは、事実上ランダムといっていいほどバラバラに数字を生成し、
周期性が現れるのは(2の19937乗)-1、規則性のない分布は623次元まで広がります。
何いってるかわからない?自分もはっきりとはわからん。ただすごいランダムってことだけだ。

パチンコなどでは乱数は命です。
勝てる傾向・勝てない傾向を分けて「運気の波」を生じやすいように調節し、
満遍なく損させ、勝てる波のときに一部が勝てるように綿密に計算が企画されたものが実装されています。

では乱数のざっぱな仕組みですが、
乱数には「シード値」という乱数の基準値となる値が必要となります。
この基準値というのは、乱数の数字の範囲ではないです。
乱数というのは「全面に数字がかかれた超・超・超・超・超ぶあつい本」のような概念です。
たとえば「100ページ目の乱数をみろ」といわれたら、
誰が、何度みても同じ数字がでてきます。当たり前ですね。
この100ページ目というのがシード値です。

じゃあシード値はいつ決めるのか?これはランダムにできないので(ウロボロス化する・・・)
ゲーム内でなんとか、ユーザがなんともできない範囲でひりだします。
たとえば
・現実時間
・ゲームを起動してから経過したフレーム数
・プレイヤーの座標(X,Y,Z)を適当に混ぜ合わせた数字
・セーブデータの内部のデータを適当に改造した数字(アイテム所持数とか)
など。

いずれにしても何ページになるのかユーザはまったくわからないので、基本ランダムに見えます。
しかしTASのようなツールプレイは別。
ゲーム本体はエミュで起動しているため「現実時間」は
つねに1990年:1月1日:0時0分0秒からプレイスタート。
つまり乱数の影響は事実上うけません。
動きも固定なのでゲーム開始時からのフレーム数も無意味。
プレイヤーの座標も当然無意味です。

つまり、ゲームの乱数発生システムはTASに完敗ということです。
いつかTASが通用しない乱数発生が生まれないかなーとかひそかに期待してます。

なおネトゲなどの通信が絡むゲームの場合、
乱数シードは「サーバーの持っている現実時間」など
ユーザが決して触れられない領域におかれてるはずなので、
TASだろうがなんだろうがどうすることもできません。さすがにそうウマくはいかないですね。
>スレイプニール★★★ができた!
>スレイプニール★★★ができた!
>スレイプニール★★★ができた!

よくゲームでは「乱数操作されてるだろ」的な陰謀論が発生しますが、
どちらかというと人間の感情としての「期待」
(サイコロで5回連続で1~3がでたら、次は4~6がでると思いたい気持ち
などが無意識に感情をたきつけ、因縁をつけているだけのほうが圧倒的に多いです。
その人の「失敗しやすい時期」「成功しやすい時期」ぐらいは用意するかもしれませんが・・・
「その人の現状をみて成功しやすさを決定」なんて余計な処理を入れると
その傾向を割り出されて想定外に最強装備を量産される可能性があるため、
どう考えてもハイリスクノーリターンです。



2016-12-25_332046480.jpg
あいかわらず書きたいことだけ書いて記事を閉じます。
ぶっちゃけ、乱数の話が書きたかっただけです。あとは適当です。あしからず。

そんなわけで本年もよろしくお願いいたします。デハー

category: プログラミング

Posted on 2017/01/09 Mon. 20:43  edit  |  tb: 0   cm: 0  

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://dakucabal.blog136.fc2.com/tb.php/489-3b02b5c4
この記事にトラックバックする(FC2ブログユーザー)