いや~ここまで順調に進んでいたと思っていたら、思わぬ落とし穴が待っていました。
まぁエラーが対峙することなんてプログラミングの世界においては日常茶飯事なんでしょうけどね。
Unityちゃんが画面端に行くと操作が効かなくなる現象の対処
どういう事かよく分からないと思うので、gifアニメーションで見てみましょう。
こんな状態です。画面端で宙に浮いてしまい動けなくなってしまいます。ジャンプも反応しない状態ですね。
ただし、固まる条件があって、ゆっくりと画面端に進んだ時に固まるようです。
スピードを上げて駆け抜けようとするとちゃんと下に落下するんです。
一応矢印キーでぐるぐるとその場で回転だけはするんですけどね・・・。これは流石に放っておくわけにはいかないバグですね。
直そうと意気込んでいたんですけど、結論から言うと原因が特定できませんでした。
結構な時間を使って色々試行錯誤してたんですけど、中々解消されなかったので、自分でUnityちゃんを動かすスクリプトを作った方が早いと思いました。
というわけで、同じような現象に困っている人は参考にしてもらえればと思います。
SDUnityちゃんをスクリプトを使って動かす(スマホ対応)
最終的にスマホに対応させる必要もあるので、スタンダードアセットのジョイスティックも実装したと思います。
まずは、Unityちゃんに「Rigidbody」と「Capsule Collider」をアタッチします。
上の画像のように設定します。
「Standard Assets」をインポートしてシーンビューに配置
なんだかんだスタンダードアセットって必需品なんですよね。
今回は、スタンダードアセットに付属している「CrossPlatformInput」を利用するのでアセットストアからダウンロードしてインポートしましょう。
スマホで操作するために必要になるジョイスティックですね。
インポートしたら「Standard Assets」→「CrossPlatformInput」→「MobileSIngleStickControl」をシーンビューにドラッグ&ドロップ。
スクリプトを作成する
次に、スクリプトを作ります。
流石に長いので、Gistを使って表示しています。
作成したスクリプトをSD版Unityちゃんにアタッチします。
Unityちゃんのアニメーションを実装する
このままだと、アニメーションが発生しないので、プロジェクトウィンドウから「Create」→「Animator Contoroller」でアニメーションコントローラーを作成。
コントローラー名は「Unitychanmove」にします。
作成したコントローラーをダブルクリックしてアニメーションウィンドウを開きます。
ウィンドウ内で右クリックして「Create State」→「Empty」で「Idle」「Run」「Jump」をそれぞれ作成します。
待機状態になる「Idle」には「Standing@loop」のモーションを設定します。
この時、同じ名前のモーションが2つあると思いますが、下の方にある「humanoid.fbx」の方を選ぶようにしましょう。
同じように「Run」には「Running@loop」を「Jump」には「Jumping@loop」を設定。
次に状態遷移の設定です。
「Idle」を右クリックして「Make Transition」を選択。この状態で「Run」をクリックして状態遷移の矢印を繋ぎましょう。
同じような作業を行い、全て行き来できるようにします。
状態遷移するための条件を付加します。
Parametersの右下にある「+」ボタンを開いて「Bool」を選択し「Running」と入力します。
同様に「Jumping」と「Idle」も「Bool」で作成します。
「Idle」から「Jump」に進む矢印をクリックして「Has Exit Time」のチェックを外します。
Conditionsの右下にある「+」を開いて「Jumping」を選択して「true」にします。
同様の設定を全ての矢印にて行います。
ここまで出来たらUnityちゃんを選択して「Unitychanmove」をセットします。
ジョイスティックでSD版Unityちゃんを操作できるようになります。
尚、画面端に進んでもフリーズすることはなくなりました。良かった良かった。
デフォルトだとジョイスティックの動く範囲が大きすぎるので、MobileJoystickにある「Movement Range」を30まで下げました。30だと上のアニメーションぐらいの挙動になりますね。
とりあえず画面端で動けなくなるバグを解消できたので、次回から本編に戻りますね。