[Unite2018] 誘導ミサイル完全マスター
公式サイト
http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session10
講演者
SlideShare
動画
https://www.youtube.com/watch?v=dOA5MHNamnc
概要
- 誘導ミサイルのゲーム性について
- 誘導ミサイルの実装方法
- 描画テクニック
内容
- Frustum Culling (視錐台)
- Frustum Cullingの外側の物体の描画を省略する
- やり方は?
- 追尾レーザーの実装
- 誘導ミサイルの実装
- 角度制御がキモ
- 非推奨:Quaternion.Lerp
- バネトルクをつかう
- 遅れて追尾できる
- 詳細
- 主要パラメータ
- バネ係数
- 角度ドラッグ
- 敵の向きに動く大きいと、同じような動きになる
- 大きすぎても小さすぎてもだめ
- 確率でゆらぎを作る
- 速度パラメータ調整
- 敵の向きに動く大きいと、同じような動きになる
- トレイルの描画
便利テクニック
- テクスチャの縁の1ドットを透明にする
トレイルねじれ問題
- 起きやすい条件
- ノード間の間隔が狭い
- トレイル幅が広い
- 暫定的解決としては幅を狭くすればいい
- 根本的解決が難しい
- 折り返しが激しいところを透明にしてしまう
- 起きやすい条件
- 重い処理をなくす方法
- iPhone6で動くデモ〜コンピュートシェーダ応用〜
[numthreads(8, 8, 8)] void exec(uint3 id)
1重ループならこうする
[numthreads(512, 1, 1)] void exec(uint3 id)
- コンピュートシェーダを使った誘導ミサイル
- 課題1:ターゲット情報
- CPU側で毎フレーム更新される
- ターゲットバッファをCPUで更新
- setDataで毎フレーム更新
- 課題2:ミサイルは1つずつ発射される
- 課題3:ミサイル(Mesh)の描画
- 課題4:ターゲットの消滅
- ミサイルよりも先に敵が消滅する場合
- ターゲットバッファに死亡時刻を追加
- 現在時刻を毎フレーム送る
- 死亡時刻と現在時刻のズレ(死亡経過時刻>0)
- 加速度を無効
- Tips. 時刻は絶対時刻で管理する(並列処理向き)
- ミサイルよりも先に敵が消滅する場合
- 課題5:ターゲットに命中を通知
- 課題6:描画バウンド
- 課題7:GetDataの絶望
- CPUのGPU待ち
- 呼び出すタイミングをずらす
- 2フレームに2フレーム分のデータを取得
- 可能だが、安定させるのは難しい
- 課題1:ターゲット情報