狠狠撸

狠狠撸Share a Scribd company logo
ゲーム作りの雰囲気
~ビームを出そう!
190625 平山尚
私はゲーム作ってるんですが、
皆さんは作ってませんよね?
何、话せばいいの?
わからないので、好きにする!!
たまたまこの二日くらいやってたことで行きます。
ゲーム屋の日常をご観賞ください。
190625 LT 「ビーム」
ビームとは何か?
なんかドバーっと光る線が
敵に飛んでって壊す奴。
ビームって線だよね?
線ってどうやって描くの?
普通は三角形つなげて描く。
GPU(Graphics Processing Unit)は三角を書く機械。
でも、今のスマホは
PLAYSTATION3くらい速い。
豪華に行こう。
线=つながった点
点をいっぱい描くぜ。
それっぽい
それぞれは三角に丸い絵を貼ってる
カメラに垂直を保てばペラく見えない
せっかく光の粒なんだし、
ホワァッっと消えたら良くね?
粒子ごとに運動方程式。
積分はオイラーでいいや。
a = f/m
v’ = v + Δt×a
p’ = p + Δt×v
力をランダムに加えれば、
風とか、大気中の粒子の衝突とか、
感じ出るよね?
感じ出てきたぞ
当たったら、火花出るでしょ普通。
これも粒子だよね
装甲の破片が赤熱して散ってるなら、
重いんだし落ちるよね。
重力加えよう。
f = new Vector3(0f, -gravity, 0f);
散らす方向は?
球面にランダムに散らして、その方角に飛ばそう。
角度2つθ、φをランダムに決めるけど、それだと極で
密になっちゃうから工夫がいるね。
縦角度θの輪の長さはcosθに比例するから、cosθを積
分して累積分布関数にして、逆関数取ればいいね!
yAngle = Random.Range(-Mathf.PI, Mathf.PI);
var r = Random.Range(0f, 1f);
xAngle = Mathf.Asin((2f * r) - 1f);
まあまあかな。
なんか、クッソ重いんだけど。
気づいたら3万個出てた。
16msごとに3万個積分しようってんだから、そりゃヤ
バいよ。
速くすっか。
とりあえずスレッド。
粒子同士の依存関係はない。
グループ分けしてスレッドにブン投げる。
スレッドプール
スレッドを作るのも止めるのもOS処理が走る。
スレッドは決まった数作りっぱにして、仕事
をキューに積んで、ヒマになった奴が仕事取る。
速くなった。
下がスレッド。上のメインス
レッドはそれを待ってる。
いっぱい出る
でもなんかさみしい。
光なのにまぶしくないぞ
まぶしい?
蛍光灯写真。
はみ出してる。
はみ出せばまぶしい!!
ポストプロセスしよう!!
GPU並列計算で光を広げちゃえ!!!
参考:https://techblog.kayac.com/unity-light-weight-bloom-effect
まぶしい!!!!
で、できたのがこんなの(デモ)
? 板をカメラに向けるベクトル演算
? キャッシュ効率を鑑みたデータ構造のC#実装
? スレッドプール実装と同期
? ほどよく被写体を写すカメラ制御の数学
あたりもコツがあります。省略。
こんな感じな私の日常です。
ゲーム作るの、楽しそうでしょ?
ありがとうございました!!
twitter: https://twitter.com/hirasho
デモコード: https://github.com/hiryma/UnitySamples/tree/master/ParticleBeams

More Related Content

190625 LT 「ビーム」

Editor's Notes

  1. 普通は四角形ですが、正叁角形を使うと顶点3/4、インデクス1/2で、描画面积は同じです。テクスチャはクランプにするか、余白を多く取りましょう。
  2. 実際はForward-Backward Eulerです。p’ = p + Δt×v’と、 v’を使います。機械によっては若干遅いかもしれませんが、ほとんど同負荷で積分の安定性が上がるので便利です。
  3. 実际には、ビームベクトルを敌法线に対して反射させたベクトルを中心に、笔丑辞苍驳の式と同じ感じで肠辞蝉の累乗で分布を作っています。
  4. JobSystemも試しましたが、データ量と計算量の比が悪く、コピーのオーバーヘッドで遅くなったので、自前でやりました。 なお、Updateで計算キック、LateUpdateで待ち合わせをしており、1フレ結果が遅れて良いならかなり性能を上げられます。また、実際の製品であればUpdateでやることがもっとたくさんあるので、並列性はより生きるでしょう。
  5. 贵颈谤别16ボタンを押すと16本のビームが出ます。
  6. スレッドプールによる並列化ですが、 同じ配列の異なる要素を複数スレッドでアクセスして安全か? ということを確認していないので、 安全を期すなら配列もスレッドごとに分けた方が良いと思われます。