Unity1week 2019/3 「つながる」に参加して。
3月11日から17日までの1週間でゲームを作り上げる第11回Unity1weekに参加しました。
この記事はその大まかなまとめの記録です。
・まず
私にとってはこれで3回目になりますが、2018年度末あたりからゲーム制作としてのUnityに触れずにBlenderばかりやっていたので久しぶりに勘を取り戻そうと思い参加しました。
・お題「つながる」
との事だったので携帯電話から着想を得て、何らかの形でアンテナ三本”バリサン”を目指すゲームにしようと考え、思案の結果
・基地局エリアにプレイヤーが入りに行く
タイプのゲームを作ることになりました。
・備忘録 開発に使った技術等の話
・グラフィック編
前回はグラフィック担当との共同制作であり、豪華な素材を惜しみなく使うことができたが今回は単独での制作だったのでシンプルな素材でも画面がのっぺりしないようにする工夫が求められた。よってPost Processingを用いることとした。
・Post Processing
画面の単調化を防ぐ目的で用いたが、スマホの地図アプリをモチーフにしたゲームである以上あまりケバケバしない程度のシンプルな利用に留めた。
また、進行方向と反対側を暗くする目的でVignetteのCenterを動かすように移動スクリプトに書き込んだ。
post processingをスクリプトで操作する際は
using UnityEngine.Rendering.PostProcessing;
でusingすることができる。具体的な使用法はこれを参考にした。
・Cinemachine
カメラ制御にはCinemachineを用いた。利用した機能は
- Follow(追従)
- Cinemachine Confiner(マップ端の認識)
- Cinemachine Impulse Listener(振動)
- Priority(優先度によるカメラ切り替え)
の4つ。特に振動はアンテナ範囲に入った時が快感であって欲しく、サウンドと連携するようにした。
・DOTween
拡縮、回転、移動等をなめらかに表現するために用いた。
スマホアプリモチーフであるのでイージングの効いた動きは特に重要と考え、メインメニュー、プレイヤー、敵の縮小などに使用した。
・プレイヤー、敵の制御編
・プレイヤーの移動
Unity1week初参加作品「熱い熱いサテライト」では物理頼みの実装であり、リアルではあるものの動きが重たくなりがちで今回は適さないと判断し、
- Input.GetAxisで得た水平、垂直の軸情報を
- Vector2にまとめ
- 毎フレーム現在位置に加算し
- transform.positionに代入する
方法を用いた。
playerhor = Input.GetAxis("Horizontal"); playerver = Input.GetAxis("Vertical"); playerpos = transform.position; playerpos.x += playerhor * movebairitsu; playerpos.y += playerver * movebairitsu; transform.position = playerpos;
また、この際updateではなくfixupdate内で行うことで他のコライダへのめり込みを低減することができる。
Fixedupdateの効果は絶大というお話#unity1week pic.twitter.com/F6t3G72f2l
— 🍁 MomijiCory 🍁 (@_mocory) 2019年3月14日
敵の制御
本来であればどの状況でも無駄なく追いかけるようスクリプトを書くことが望ましいが、その様なノウハウも学習するための時間も無かった今回はプレイヤー座標に向かって一直線に向かってくるような仕様にした。
地形にスタックするような形状を用いないことで、直線で接近しようとしても実質的に正常にプレイヤーを追従することができたが、この際唯一スタックする恐れのある敵とプレイヤーが壁を挟んで向かい合う状況にのみ対策として
- プレイヤーが上下左右どちらにいるかを判別し
- 地形のない軸方向へプレイヤーと反対側に進み
- レイキャスト2Dに地形が当たらなくなったタイミングで通常状態に戻す
ことでほとんどの状態においてスタックすることがなくなった。
しかし特定条件においてスタックする事があるので敵に寿命を設け、定期的に脱出地点からリスポーンすることで敵の位置の偏りとスタックを解決した。
また、敵が寿命に近い個体ほど色が黒くなるようにし、識別を可能にした。
あたまわるわる#unity1week pic.twitter.com/QD5NEfuFr7
— 🍁 MomijiCory 🍁 (@_mocory) 2019年3月16日
正常に動作しない敵の例(通常状態への遷移を0.2秒遅らせることで解決)
・問題点
- 操作性の向上(操作がシビアという感想が多く挙げられた)
- 振動演出が弱い(酔いを考慮して控えめにしたがさり気なくなりすぎた)
- 敵AIが弱い(リスポーンに頼らない方が望ましい)
・最後に
今回はランキングに乗ることはかないませんでしたが、目標としていたUnityにおけるゲーム制作の勘を取り戻すことはできたと感じています。
上位製作者の作品を研究しつつ次回に備えていようと思います。
Unityで仕事がしたいです。