ユニティちゃんの2Dスクロールアクション:改 その3-2 左右の移動解説①

ども、ゴコーです。

今回は前回の左右移動に関して、多少分かる人向けの解説を行います。

ポイントは大きく分けると

  • 関数は分けて書く
  • なぜ Input.GetAxisRaw() なのか
  • Update() と FixedUpdate() の違いについて
  • AddForce() や MovePosition() などの違い/使い分け

という感じです。

が、長いので分割して、今回は前2つについて見ていきます。

それでは、さっそく見ていきましょう

スポンサーリンク

関数を機能毎に分けて書く

僕のコードの書き方は大体が我流ですので「毎度毎度見にくいわ!」っていう方も多いかと思います。
申し訳ない…。

そんな僕でも実践している数少ない書き方のルールの一つが「関数は機能毎に分ける」です。

例えば、今回でしたら

と、入力を受け取るための関数として GetInput を用意し、その関数に Update() でアクセスしている訳ですが、実際には

というように、1行で済んでしまいます。
なぜこんなめんどくさいことしてるのか、という話です。
答えは簡単。後々のためです。

この書き方では分かりにくいですが、以下のようなケースを想像して下さい。

調子が良くて、Update() の中にまとめて5個くらいの機能を一気に書いた!Unityエディターに戻ると20個くらい一気にエラーが出た!どの機能がエラー出してるか分からん!しかもメッセージの内容も分からん!死んだ!

前に実装した機能を見返したくてコード読みなおしてみたけど、どこからどこまでが何の機能だったか思い出せない!コメントも書いてなかった!死んだ!

何となく想像が付いたかもしれませんが、これは過去に僕が実際にやらかしたミスです。

…1ヶ月前に自分で書いたコードは他人が書いたコードだと思うと良いですよ(白目)

では、上記のような惨事を回避するためにできそうなことを書いてみましょう。

・関数を分ける
似たような機能を持つ関数は後で見ても分かるような名前を付け、よほど簡潔に終了する、みたいな時以外は Update()の中に直書きみたいなことは避けるようにしましょう。
名前は今回なら GetInput(入力を取得) というものにしていますが、 GetNyuryoku でも SyutokuNyuuryoku でも、後で見て分かるなら何でも良いと思います。…分かるならね。

既存の関数に機能を追加、なんてことも良くあるのでそれも考慮して分割しましょう。

・こまめに保存し、エディターに戻る
3本の矢が集まれば容易く折れることは無い、みたいな逸話があったと思います。
バグも同じで、いくつか種類の違うバグが絡んでしまうともう初心者には訳が分かりません。
と言う訳で、バグは早めに潰しましょう。

Unity で MonoDevelop を使っていてバグの存在が判明するのは、コードを保存してUnityエディタに戻った時です。
機能を追加したら…、何か変更したら…、保存してこまめにエディターを確認することをお勧めします。

・コメントを書く
先ほども書いたとおり、1ヶ月前に書いたコードは他人が書いたものと思って下さい。
それくらい過去の自分のコードは読めなくて、訳わからんのです。
ちょっとした説明を入れておけば、よく分からない部分を理解できるものにできるかもしれません。書きましょう。
さらに、できればコメントが無くても分かるような見やすいコードを書くように心掛けましょう。

以上がコードを書く上で僕が気にしていることの一部分です。
後で自分を恨むなんてことにならないよう、意識してみると良いかもしれませんね。

なぜ Input.GetAxisRaw() なのか

Input というクラスは入力全般を受け付けてくれます。
上下左右に対する入力を受け付ける Input.GetAxis() という関数もこの一族で、引数を “Horizontal” とすれば左右の、 “Vertical” と入れれば上下の入力を取得してくれます。

Input.GetAxis() と似た関数に Input.GetAxisRaw() と言う関数があります。
両者の違いは

Input.GetAxis()
-1.0 ~ 1.0 までの値を返す。方向キーを押し始めた時は 0.xx くらいの小さい値を返し、押し続けている間に 1.0(-1.0) に近づいていく。値の増減速度はUnityエディター上で変更できる。

Input.GetAxisRaw()
-1.0, 0, 1.0 のどれかを返す。方向キーを押している間は 1.0(-1.0) を、押していない時は 0 を返す。

という感じです。

GetAxis() は3Dアクションなど、本物っぽい動きをする際に非常に効果的かと思います。細かい調整をかけられるのも良いですね。

今回作ろうとしているのは「足の端が数ドットでも乗っていれば足場から落ちない」みたいな、物理法則をガン無視した感じのゲームですので、リアルな加速減速、は逆に合わないかもしれません。

ということで今回は「突然動きだし、突然止まる」みたいな動きが作りやすくなる GetAxisRaw() を採用しました。もちろん、GetAxis() で数値を調整して同じようにすることはできますが、説明するのがめんどくさ(ry

さて、今回はここまでです。次回も発展ではなく解説ですが、結構深いところをみていきましょう。

では、また。

Comments

comments

スポンサーリンク
336*280px