Unity-Asset僕の財布にはいつだってお金がない。食後に毎回プリンを食べているのが原因のようだ。お金は無くともゲームは作りたい。PortalUnityさんがバウチャーコードをくれるらしい。このイベントに参加したらね。kyotounity.doorkeeper.jpなるほど。完成プロジェクトのアセットを購入して、そのプロジェクトを改造するゲームジャムですか。その完成プロジェクトのアセット代金分のバウチャーコードは頂けると。バウチャーコードのために!というわけで今回は完成プロジェクトを改造していた際に「この処理にハマっちまった!」ということがあったお話です。自分自身で一から作っているときには、なかなかその作りなどの不便な点には気づかないものですからね。この記事にはUnity2018.1.0f2を使用しています。(4.6相当)を使用しています。変数をシリアライズするということ関数がアニメーションから呼ばれることをスクリプトからは読み取れないということいろいろなところでPlayerPrefsを使うということTimeScaleを0にしてゲームを停止させるということ最後だということ変数をシリアライズするということエディタ上でパラメーターを設定したいときは、コンポーネントの変数をシリアライズすればエディタ上で設定できるようになりますよね。アクセス修飾子がpublicの変数は、シリアライズされるのでエディタ上に表示されます。エディタ上で設定しなくてもいい変数までエディタ上で表示されてしまうと、情報を設定する人は混乱してしまいます。余計な情報は表示しないようにすれば、混乱を避けられるはずです。System.NonSerializedアトリビュートを使うのはどうでしょう。これを付けた変数はシリアライズされないので、エディタ上に表示されません。アクセス修飾子がprivateの変数は、シリアライズされないのでエディタ上に表示されません。他のクラスには公開したくないけど、エディタ上ではパラメーターを設定したい。いうことは多々あるはず。いう場合は、SerializeFieldアトリビュートを使いましょう。これを付けた変数はシリアライズされるので、エディタ上に表示されます。エディタ上に表示される。エディタ上に表示されない。エディタ上に表示されない。エディタ上に表示される。GameManager関数がアニメーションから呼ばれることをスクリプトからは読み取れないということこれこそが、今回この完成プロジェクトを改造していて。ハマっちまったところだ。Unityではアニメーションそのものに、イベント関数を仕込むことが出来る。アニメーションがアタッチされているコンポーネントの関数を、アニメーションの任意のタイミングで呼び出すことが出来るのだ。エディタ上で設定できるので、「アニメーションのこのフレームで攻撃処理を呼ぼう!」ということが簡単にできて便利ではあるんだ。この設定をしていない人にとっては、このやりかたは非常にフローが追いづらいものになってしまう!この完成プロジェクトには以下のような処理があったんだ。......}プレイヤーキャラが弾を撃つ処理なんだけど、スクリプトを見る限りどこからも呼ばれていないんだ!文字列検索しても引っかからないし、そもそもprivate関数だから、このクラス内からしか呼ばれないはずだし、ボタンのイベントにも設定できないはずだ!ここがアニメーションのイベント関数の恐ろしいところだ。private関数でも容赦なく呼べるのだ!SeneMessage()と同じ方式かよ......。このことに気づかなかったり、そもそもアニメーションのイベント関数のことを知らなかったりすれば、ここで詰みます。「アニメーションの任意のタイミングで処理を呼ぶ」ということをやりたいときも出てくると思うので、アニメーションのイベント関数の使用を禁止するのも難しそうだ。すると、スクリプト側で関数名をOnAnimationEvent()などアニメーションから呼ばれることを明示的に示すようにしたり、コメントなどを記述するようにしたりして対応するしかなさそうなんだよなぁ。いろいろなところでPlayerPrefsを使うということうーん、PlayerPrefsかぁ......。docs.unity3d.comPlayerPrefsをセーブデータとして使うことは、推奨していないという話は聞くよね。本格的にセーブデータを作るのならば、Jsonやバイナリ形式にしてファイル読み書きした方がいいだろうさ。このPlayerPrefsを使うのが楽なのは事実だよね。個人の裁量で使う分に、兎角言うつもりはないのさ。問題なのは、いろんなところでPlayerPrefsを呼ぶってことなんだよ。この完成プロジェクトでは、ゲーム内課金をする場合の対応も考えてくれているので、武器の数やコインの数などをPlayerPrefsを使ってセーブデータとして保存しているんだよね。}}だが、いろんなところでPlayerPrefsを呼びまくっているせいで、ゲーム全体として何の情報が保存されているかを把握しづらい。何がゲームを立ち上げたら初期化される一時的な情報で、何がゲームをやめても保存されている永続的な情報なのかがわからんのだ!せめてセーブデータ関連の処理は、特定のクラスなどにまとめてほしいな。TimeScaleを0にしてゲームを停止させるということ僕はあまり使ったことがなかったんですが、Time.timeScaleを0にすることで、ゲームの更新を止める方法を使っていました。リザルト画面やポーズ画面などを表示するときに使っているみたいですね。}}docs.unity3d.comなるほど、Time.timeScaleを0にすれば、FixedUpdate()は呼ばれなくなるし、Time.deltaTimeも0になるみたいですね。Update()が呼ばれなくなるわけではないですが、ゲームの更新を止める方法の一つとして利用できそうだ。この方法には大きな問題が!誰かがTime.timeScaleを1に戻さなくてはいけないということだ。この完成プロジェクトのゲームフローをそのまま使う場合は、要所にTime.timeScaleを1に戻す処理が記述されているだろうから、問題にはならないだろう。このゲームフローに新たなフローを追加する場合に問題が発生しそうだ。Time.timeScaleが0のまま、別の処理やシーンに移動してしまう可能性がありえるのだ。Time.timeScaleが0になっていることに気づかなければ、ゲームが正常に動作しなくなってしまう!コンポーネントはついているし、Update()も呼ばれているし、エラーも出ていない。ゲームが動かない!この状況は、不具合の原因を突き止めるのになかなか苦労しそうだ!Time.deltaTimeを0にする際には注意したい。最後だということ今回挙げたことは、自分一人でゲームを作っているときには、あまり不便に感じないことばかりなんですよね。作った本人は全体を把握しているわけですから、問題になりにくいんですよ。自分自身が作ったプロジェクトでも、時間が経てばどんな処理を書いたか忘れてしまいますからね。このあたりのことは気を付けていきたいものです。今回の完成プロジェクトを改造することは、いい勉強になりました。勉強も終わったことですし、プリンでも食べようかな。ゲームパッドを振動させるゲームパッドを振動させるお話。ドキュメントを読みながら組めば簡...2020-12-05【Unity】UnityHubをインストールして使ってみようUnityHubのインストール方法と使い方を簡単にまとめてみた話。アナウンサーを応援しています。引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。