RiG++ブログ2020

RiG++の2020年ブログです!

ランダムってなあに?

 注意!gifが止まるのは仕様です。よわよわですみません;;

この記事はなに

 この記事では、いくつかの「ランダム」について書きます。ゲーム制作においては、避けては通れないレベルデザインやステージの構成があります。それに一役立つであろう「ランダム」を田きが紹介していこうと思います。ランダム楽しいよ。

なお、結論はゲームに応じた適切なランダムがあるよ、という所です。

  ご挨拶

みなさんこんにちは。RiG++コーディング課所属の田きです。アドベントカレンダー三回目*1ですね。アドカレは連日書くのは普通か?*2まあ日が空くアドカレも良いよね!ということで。

 

さて、この記事はなぜ三回目に書くことになったのでしょうか?特に理由はありません。空いていたからこの日にしました。*3じゃあランダムに日にちを決めよう!というのでも良いですが、ランダムっていったい何なんだ???となるわけです。というわけで、今回はゲームに出てくるいくつかのランダムについてお話したいなと思います。

お品書き

この記事は、以下の項目に分かれているので、好きなところを読んでね!!

  • 完全ランダム
  • 部分的にランダム
  • 補正されたランダム
  • 終わりに

完全ランダム

完全ランダムとは、その名の通りすべてをランダムにしてしまうという手法です。*4

 

製作者視点では、簡単に実装できるのでこれを使いたくなりますが、ユーザー視点ではデメリットが浮かび上がります。特に、低い確率の事象なのに何回も起こったり、高い確率なのに全然起こらなかったりすると不平を感じます。*5そのため、むやみに用いると良くないことが起こりえます。また、事象が偏ってしまうとゲームバランスの調整も難しくなります。時にはとても簡単、時にはとても難しい、しかもそれはユーザーからは調整できないとなると、洗練されていない印象を与えます。そのため、小さな要素やエンドコンテンツとして完全ランダムが採用されることはあっても、メインコンテンツで採用されることはあまりない気がします。*6

メリットとデメリットはこんな感じです。

メリット

  • 実装が簡単!
  • 真のリアリティがある

デメリット

  • 数字が偏りやすい
  • ユーザー視点ではランダムに見えないことがある
  • 事象*7が偏った時に不平を感じやすい
  • レベルデザインが大変になる

 

 

 

以下のgifは完全ランダムの例です。UnityとC#で作ったものです。一定間隔で10個球を放つのですが、それぞれは発射される角度はランダムです。

f:id:rigpp:20201201163303g:plain

密な部分と疎な部分に分かれているのがわかります。

 

ソースはこんな感じです。

f:id:rigpp:20201201163258p:plainこの図の18行目がキモで、すべての弾に対して角度をランダムに設定しています。

 

 

さて、これをもう少し何とかできないでしょうか。


部分的にランダム

そこで、ランダムな要素は部分的にしてしまいましょう。例えば、以下のようなものが考えられます。

f:id:rigpp:20201201163302g:plain

f:id:rigpp:20201201170128p:plain

21行目あたりを見ると、最初に球ごとに36度ずつ異なる「初期角度」を設定してから、0~36度のランダムな値を与えられています。

f:id:rigpp:20201201163241g:plain

f:id:rigpp:20201201163311p:plain
18行目を見ると、最初に「初期角度」としてランダムな角度が与えられています。その後、球は36度毎の値を与えられています。

 

一枚目のgifではやや体感的な偏りは少しありますが、ほとんど気になりません。二枚目のgifではほぼ偏りはありません。そのため、部分的にランダムな要素を付加することで、ランダムによる理不尽感を減らしつつ、でもランダムであるという印象を与えます。また、一定の法則性があるため、レベルデザインもやや簡単になります。

弾幕ゲーではこのような形はよく見ますし、花火のエフェクトなんかもこんな感じで作れそうです。同心円状に攻撃する、というのにもかかわらず、偏りすぎないようにこのような制限を掛けることもあるでしょう。ゲーム内のクジで、当たりの番号が集中しすぎていると人間の感覚からは外れるので、このように意図的にばらけさせるかもしれません。このように、部分的にランダムな要素を取り入れ、ランダムっぽさの演出と理不尽さの払拭を行うことはよくありそうです。

 

メリットとデメリットはこんな感じです。

メリット

  • ランダム感を出しつつ、理不尽は避けられる!
  • レベルデザインが簡単に
  • 実装もそこまで大変ではない

デメリット

  • 完全なランダムからは離れている*8

 

一応デメリットも挙げましたが、ゲーム制作で完全なランダムが求められることの方が少ないので、ほとんど問題にならないと思います。

補正されたランダム

さて、これらの他に補正されたランダムというのも存在します。まずはこのgifをご覧ください。

f:id:rigpp:20201201163249g:plain

明らかに下方向に偏っていますね。でも、上方向にも全く行かないというわけではありません。これは以下のように実装されています。

f:id:rigpp:20201201163219p:plain

18行目で「初期角度」を-90度に設定します。*9そして、21行目で、「-180~180のランダムな値を、0~1のランダムな値でかけた値」を、初期角度に足しています。「-180~180のランダムな値を、0~1のランダムな値でかけた値」は、0が最も高い確率で現れ、そこから離れるとだんだんと出現確率が低くなる分布を取ります。そのため、gifのような球の放たれ方になったのです。

 

このようにすることで、ランダムっぽさを残しつつ、意図的に難易度を調整したり、演出をしたりできます。

 

他にも、FEシリーズ*10の実行命中率のような補正方法もあります。FEシリーズには「命中率」が存在します。もちろん、他のゲームタイトルにも命中率の概念は存在しますが、大体は0~1の値をランダムで出し、その値が[命中率/100]よりも小さいと命中、という方式をとっています。しかし、FEが特異なのは命中の計算方法にあります。0~1のランダムな値を2つ出し、その平均値pと、[命中率/100]を比べ、pの方が小さいと命中、となっています。この時、pは50に近い値を取りやすくなるため、命中率が高いほど、実際より命中しやすく、命中率が低いほど実際より命中しにくくなっています。例えば、命中率が99の場合、これが外れるにはランダムな値は100と100でないといけないので、その確率は1/10000です。そのため、命中率99は、命中率99,99%を示しているのです。

f:id:rigpp:20201201163107j:plain

これはファイアーエムブレム風化雪月の画像です。左のキャラクターの命中は100なので必中です。右のキャラクターの命中は91ですが、実際に計算してみると、98.29%で命中します。*11

 これにより、確率90%なら当たり、5%なら外れるだろうという人間の心理の通りにゲームが進みやすくなります。ユーザーのゲーム体験も向上することでしょう。*12

 

メリットとデメリットはこんな感じです。

メリット

  • 確率によるレベルデザインが可能になる
  • ある意味「自然」な振る舞いをできる
  • ユーザーのゲーム体験の向上

デメリット

 

順番だけランダム

他に特筆すべきものとして、順番だけランダムというものがあります。テトリスが特に有名です。テトリスの落ちてくるテトリミノ*13は、実は決まった規則で落ちています。その順番は、(7種類のテトリミノをランダムな順番)→(7種類のテトリミノをランダムな順番)、→(7種類のテトリミノをランダムな順番)→...です。つまり、七回ブロックを置くと、一巡します。実際に画像で見てみましょう。

 

一巡目

f:id:rigpp:20201201163111j:plain

二巡目。一巡目ですべての種類のミノが出現している。

f:id:rigpp:20201201163126j:plain

三巡目。すべての種類のミノが二回出現している。

f:id:rigpp:20201201163130j:plain

このように、7つのテトリミノが落ちる順番はランダムですが、大局的にはばらつきの無いようになっています。

 

このように、大局的にはランダム性は薄くなりますが、局所的にはランダムとなります。これにより、やや予期できるゲームとはなるものの、やはり局所的なランダムが効いて面白いゲームとなります。とはいえ、局所的なランダムがうまく生かせない場合は、もっとランダム要素の大きな方法が良いかもしれません。

 

メリットとデメリットはこんな感じです。

メリット

  • ランダム要素を入れつつ、大局的にはランダムの影響の小さいゲームを作れる
  • ある意味「自然」な振る舞いをできる
  • ユーザーのゲーム体験の向上

デメリット

  • そもそもこの方式が合うゲームを考えるのが難しめ

終わりに

いかがでしたか?*14これらの他にもランダムにはいろいろあるので、ゲームをプレイする中でのランダムとか、現実世界*15のランダムとかを、見つけて、あれこれ考えてもらえればなぁ、と思います!

 

次の記事はTZという方が記事を書いてくださるそうです。タイトルから考えると、何でもゲームの公開後のための考え方を書くのだとか?お楽しみに!

 

 

*1:「三日目」ではないようだ

*2:激ウマギャグ。ようこそ立命館大学ダジャレサークルへ

*3:諸説あり。連続で続かないからこの日に入れたとの噂も...

*4:実際には、計算機が完璧な乱数を生成することはできないので、疑似乱数を用いる

*5:なぜか自分に不都合な事象はよく覚えているアレ

*6:要出典

*7:ガチャでレア当たるとか、攻撃を回避するとか

*8:まあ疑似乱数も完全なランダムではないのですが

*9:ゲームエンジンの世界では-90度が真下を表す。って言おうと思ったけど、数学でよく使う座標系もその通りでしたね

*10:ファイアーエムブレムシリーズ。手強いシミュレーションゲームで有名。最近ではキャラゲーの側面が強いが、シミュレーションバトルもきちんと作り込まれている

*11:ニコニコ大百科の記事「実効命中率(ファイアーエムブレム)」では、98.47%となっているが、これは平均を計算したとき値を切り捨てているためである。実際、自身の計算でも計算過程で適切に切り捨てると98.47%になった

*12:実際にやってみればわかりますが、確率に重みがかかった方が人間的に「自然」な感じがします

*13:グリッド中の四つの正方形が、縦横に連続でつながった図形

*14:低品質なサイトがよく使うとされている常套句。でも僕はただの汎用的な言い回しだと思います

*15:ネットではない、家の外に広がっている世界