Unityで画面振動、シェイク
この記事は、以下の「桜井政博のゲーム作るには」の「画面振動 【エフェクト】」の回で、
「画面振動は大きなショックを表現するのにうってつけなので、
どんどん織り込んでいくべき」
と桜井さんもおっしゃっており、自分のゲームにも早速実装してみたので、
動画では説明されていなかった、具体的な実装方法についてUnityを使って説明をしようと思います。
画面振動の実装を簡単に行うために以下の無料のアセット「DOTween」を導入します。
細かい使い方についてはここでは解説しません。
コード全体はこのような感じです。
using DG.Tweening; using UnityEngine; public class ObjectFollower : MonoBehaviour { [SerializeField] private GameObject followObj = null; [SerializeField] private bool isFollowable = true; private Tweener tw = null; private Vector3 defaultPos = Vector3.zero; void Start() { Follow(); } void LateUpdate() { Follow(); } private void Follow() { if (!isFollowable) { return; } transform.position = new Vector3(followObj.transform.position.x, followObj.transform.position.y, transform.position.z); } public void SetFollowable(bool value) { isFollowable = value; } public void Shake(float strength, float duration) { if (tw != null && tw.IsActive() && tw.IsPlaying()) { return; } isFollowable = false; tw = transform.DOShakePosition(duration, strength).OnComplete(() => { isFollowable = true; }); } public void Shake(float x, float y, float duration) { if (tw != null && tw.IsActive() && tw.IsPlaying()) { return; } defaultPos = transform.localPosition; isFollowable = false; tw = transform.DOLocalMove(new Vector3(x, y, transform.localPosition.z), duration).SetEase(Ease.InCubic).OnComplete(() => { transform.DOLocalMove(defaultPos, duration).SetEase(Ease.OutCubic).OnComplete(() => { isFollowable = true; }); }); } }
これはカメラにアタッチして、インスペクター上でfollowObjにプレイヤーのオブジェクトをアタッチする事で、
プレイヤーを追従するクラスです。
コードにコメントを追加して説明します。
public void Shake(float x, float y, float duration) { if (tw != null && tw.IsActive() && tw.IsPlaying()) //tweenが存在しているかどうか、アクティブか、再生中かをチェック { return; } defaultPos = transform.localPosition; //Tweenした後に元の座標に戻るために自分の座標を保存しておく isFollowable = false; //一時的にfalseにすることで、Followメソッドでの追従を止めてます。 //tweenに、移動先のXY座標と、移動演出の時間を設定、動きの種類をInCubicに変更 tw = transform.DOLocalMove(new Vector3(x, y, transform.localPosition.z), duration).SetEase(Ease.InCubic).OnComplete(() => { //1つ目のDOLocalMoveが終わったら、保存しておいた最初の座標に戻る transform.DOLocalMove(defaultPos, duration).SetEase(Ease.OutCubic).OnComplete(() => { //一連の処理が終わったのでFollowメソッドで再び追従するように isFollowable = true; }); }); }
上記のような実装で、簡単に画面振動、シェイクを実装する事ができます。
2Dでの使用を想定していますが、応用すれば3Dでも使えるかと思います。
今回ローグライクの移動で壁にぶつかった時に振動するようにしてみました。
まだ移動しかできないゲームとも呼べない状態の代物ですが、
この画面振動を実装した事で、ゲームを遊ぶプレイヤーに対して親切な演出が追加されて、
なんだか少しリッチに感じました。
壁に当たった時だけでなく、自分が攻撃をした時、攻撃を受けた時などにもこの画面演出を使おうと思います。
今後も桜井さんの動画の中で自分が実装できた事があれば、また記事にして共有しようと思います。
あの桜井さんが言ってる事なので、全部実戦できたらきっと素晴らしい神ゲーができるはず!
と思ってるので、引き続き頑張ります。
2022年12月の進捗
12月は細かい不具合の修正や、UIの見た目の改善などしてました。
現在選択中のカードの合計値と記号を表示する画面上の方のUIの見た目をわかりやすくしました。元はどの記号でも■だけだったのと、15をオーバーしたぶんは赤くしました。#ゲーム開発 #gamedev pic.twitter.com/olNtO4k6r7
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年12月4日
バナー、インタースティシャル広告の設定などもしました。
前回のプロジェクトで導入してたバナー広告の表示が今回のプロジェクトでも正常に表示される事を確認。インタースティシャル広告も正常に読み込めてそうです。 pic.twitter.com/1jl415q2Ee
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年12月6日
これで広告収入入るかな、などと考えていたのですが、本業と同ような事を副業でやるのはあまりよろしくない事らしいので、広告収入型の基本無料ゲームを作るのはいったん中断する事にしました。
競業避止義務、というらしいです。
もし作るとしても稼げるゲームではなく、好きで作りたいゲームかな、という。
色々と調べたのですが、競業避止義務というものがある事を知って、本業でゲームプログラマーしてる以上、副業でゲームを作るのは中々黒よりのグレーだなと思ったので、今作ってる広告収入型のゲームを作るのはひとまず止めようと思いました。やるとしたら稼げるゲームではなく好きなゲームかなという。
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年12月29日
最近ホロライブのファンゲームが話題になったり、Twitterで色々なファンアートを見たりして、少し憧れがあったので、ファンアートかファンゲームか、そういったものを作ろうかな、などと考えてました。
あと3Dモデルのキャラも作っていたので、VRChatでオリジナルキャラに似合う、雨の似合うワールドを作るのも楽しいかな、などと考えたりもしてました。
で、何しようか考えてたのですが、ファンアート描いてる人に憧れてたので、ファンアートか、推しが出てくるファンゲーム?か、流行ゲームの仕組みを自分で実装再現して解説、のような事や、VRChatのワールド作りなどをやるのもいいのかなぁ、などと考えてました。
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年12月29日
今までは明確にゲームを作る、と意気込んでいたんですが、とりあえず直近では明確な目標が無い状態なので、しばらくの間は定期的な更新がなくなるかな、と思います。
また何か作り始めたりしたら更新しようと思います。
2022年11月の進捗
9月の進捗の記録がなかったのはスプラトゥーン3が9月8日に発売されたからです。
ツイートも1か月空いてます。
スプラトゥーン3発売日の9月8日から約1か月遊んでる間に、自分が作ってたゲームのゴールがわからなくなって中々ゲーム製作に戻れなくなってました。スプラのウデマエはSまで上がって満足したので、ゲーム製作に戻ろうと思います。
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年10月16日
この後ウデマエはS+になりました。
簡易ローグライクを作ろうとしてたんですけど、"簡易"にする事でゲーム性が落ちててそれをどうやって面白くしよう?みたいな事を考えていて行き詰まった感じだったので、もっと簡単なゲームを作る所から改めて始めようと思います。
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年10月16日
ツイートの通りですが、最初なので武器やアイテムもない、"簡易"ローグライクを作ろうとしていたのですが挫折しました。
資材管理とかが楽しさの肝になってると思うんですよね。色々な種類のアイテムを組み合わせて使ったり、レアな武器を手に入れたり。
そこが面白い所だと思うので、それを排除してランダムなマップで階段を目指すだけのゲームを面白くする、というのはハードルが高かったです。
年収から時給を計算したら、研究名目でゲームを1時間遊ぶって事はこの時給分を研究費用で使ったのと同じでは?と思って、自分が作ってるゲームと関係ないジャンルなのに研究費を使うなんて大層な研究機関だな?と思う個人ゲーム開発者でした。
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年11月1日
10月もほぼ進捗がなく、自分が作ろうとしてるゲーム以外のゲームを研究名目で遊ぶのは研究費用高すぎるんでは?などと思ったりしてました。
ババ抜き作ろうかと考えてましたが四葉のクローバーっていうトランプの一人遊びが簡単そうなのでこれ作ってみようと思います。https://t.co/MJB1fhaLaY
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年11月4日
今まで知らなかったんですが「四葉のクローバー」というトランプの一人遊びゲームを作る事にしました。
獲得した手札はそのままで、場札と山札をシャッフルして再開っていう自分ルールを追加してクリアまでに40分かかりました。あとダイヤとハートを途中で勘違いして獲得してしまっててアナログのダメな所を感じたりしてました。 pic.twitter.com/MBowPao0RO
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年11月5日
リアルにトランプで遊んでみたりして研究を重ねました。
カードを生成して山札からランダムで16枚を並べる処理を実装しました。次はタップで選択ですかね。#gamedev #ゲーム開発 pic.twitter.com/Dg40A7Bkn8
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年11月6日
足して15になる組み合わせを選択するとカードを獲得して新たにカードを配って、足して15になる組み合わせがなかったらゲームオーバーまでできました。残りの山札の数とか表示したいですね。#gamedev #ゲーム開発 pic.twitter.com/tiKURT4OuA
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年11月13日
ざっとこんな感じでルールの実装まではほぼ完成したので、この後は引き続き演出やUIの実装などを進めようと思っています。
ポケモンスカーレットは発売日の11月18日に購入してストーリークリアして満足しました!
2022年8月の進捗
最低限月イチくらいの頻度で進捗報告をしようと考えてます。
基本的に進捗があればTwitterで更新しているので、それ月イチでまとめる、予定です。
8月7日。3Dの脱出ゲームを製作していたものの、謎とかパズルを作るのが難しいと感じ、断念。
UV展開確認用にテクスチャに落書きしてあるのとか、箱とか、見えてないですがカギと洗濯機の3Dモデルも作ってました。操作は大体覚えたので、簡単な物なら今後も作れそう。Blenderの練習にはなったからいいか…
2021年5月に更新が止まっていたローグライクを再開する事に。
2021年5月で更新が止まってた自分のローグライクのリポジトリを見たら既にランダムダンジョン生成ロジックと移動処理まではできてました。[@]が自分で、「↓」が階段で、入ると下のフロアに進む。この時点で数分遊んで楽しいんだから脱出ゲームよりおもしろいのできそう。
ゲーム製作用の名義を「夏野ヨノアメ」(なつのよのあめ)として、屋号を「ヨノアメゲームズ」に決定。
今日はゲーム開発の宣伝用に、Google、Twitter、Instagram、YouTube、はてなブログのアカウントを作りました。まだ何もないですが、これからどんどん発信していきたいと思います。
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年8月11日
夏野ヨノアメとしてのアバターが欲しいと思ったのでキャラデザして、モデリング。
【第1回】ワニでもできる!モデリングforVRChat - Blender2.8さわってみよう - YouTubeを見ながら作成しました。
ちょくちょくBlenderは触ってましたが、ちゃんとしたキャラクターを作るのは今回が初めてでした。
右下が妻様が描いてくれたラフです。それ以外が発注書のようなアイデアスケッチです。今日はVRChat用のアバター案考えてました。夜と雨のモチーフ。ゲーム内にも後々出す予定。#gamedev #ゲーム開発 pic.twitter.com/fo4a2zECVC
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年8月15日
Blenderでのモデリング、スキニング、シェイプキー設定までできました。
ウェイトの調整と「あいうえお」のシェイプキーの設定もできました!口が無いのでリボンが動きます。たぶん。これでBlenderでの作業は終わりらしい!Blender完全に理解した!#blender初心者 pic.twitter.com/1dYXsxOCxC
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年8月18日
VRChatにアップロードしたいのですが、今はひたすら放置でVRChatのトラストランクを上げているところです。
びしょぬれのしずくさんが雨が似合って素敵。
オリジナルキャラの3Dモデルを作ったはいいもののVRChatのアカウント作りたてでアップロードできないので、JustRainとかYayoi Summer Nightsで放置して時間稼いでます。雨が綺麗なワールドとか巡って研究したいですね。
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年8月20日
モデルはびしょぬれのしずくさん。(サンプル)https://t.co/PYsWPUmPOE pic.twitter.com/1tjQFxy57o
雨が降るタイトル画面実装など。
雨が降るタイトル画面ができました。もうこのゲームで最低限やりたかった「雨を降らす」は実装できたので満足です。よく見ると地面のあたりに波紋もでてます。#gamedev #ゲーム開発 pic.twitter.com/k8uvEPYPc7
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年8月21日
現状はここまで。広告の表示タイミングは仮ですが、無料で出す以上どこかしらで入れる必要があるので、区切りになるような場所で表示予定です。
実機上でConsoleが表示でき、デバッグコマンドも実装可能なIn-game Debug Console【Unity】【アセット】https://t.co/0luW2QbDYf
— 夏野ヨノアメ☔ゲーム開発 (@yonoame_games) 2022年8月28日
これすごい便利ですね。コード1行も書かずにコンソール表示できちゃいました。すごい便利。あとインタースティシャル広告もできました。#gamedev #ゲーム開発 pic.twitter.com/P014oNKOqv
こんな感じで今後もゲーム製作の進捗をまとめようと思ってます。
このサイトについて
2023年5月10日:追記
「野」の字には特に思い入れも無くてロゴにもしづらいと感じたので、「乃」に変更して、
「夏乃ヨノアメ」
になりました。
---------------
このサイトは2013年からゲームプログラマーをしている 夏野ヨノアメ(なつのよのあめ) が個人ゲーム開発の進捗報告についてなどの記事を更新していく予定です。
「夏野ヨノアメ」は「夏の夜に降る雨のように、少し嬉しい心地よさのような感情を届けられる存在になれたら」といった意味です。
という建前とは別に、本当は某MMOでシェイクスピアの「夏の夜の夢」からもじって、「夏の夜の雨」という名前の弓キャラで遊んでいたのが最初です。矢を雨のように降らすスキルとかあったので。
屋号「ヨノアメゲームズ」はゲーム開発をしている事がわかりやすいように、名前にゲームズを付けました。
小さい頃から雨が好きで、窓際で雨音を聞きながらゲームしてたり、60分間雨音だけの「雨音のしらべ」というCDを高校生の頃に買ってずっと聞いてました。
SCEの「rain」も大好きでもちろんクリア、トロコン済み。
ゲームの中でもできるだけ雨が降ってたらいいな、と考えてます。
ローグライクが好きで、シレン、トルネコ、チョコボのシリーズそれぞれいくつも遊んでいたので、今はローグライクゲームを作ろうと思っています。