本講座はUnityで3Dアクションゲームの作り方について説明しています。前回はプレイヤーのジャンプ機能、またコライダーの処理について解説してきました。
コライダーの処理は今後も多く出てくるので、前回の記事を見ていない方は読んでおいてくださいね。
前回の記事:
第5回目はプレイヤーの移動処理・アニメーション処理の開発方法について解説していきます。
今回のゲームはスマホでの動作を前提としていますので、スマホ入力の解説もしていきますが、先にテスト用にPCでの入力処理を作成します。
では始めていきます。
移動機能の作成
まずはPCのキーボード入力でプレイヤーを動かしていきます。
「↑↓←→」キーで移動できるようにしていきましょう。
PCキー入力の取得
PCのキー入力を取得する関数に「Input.GetKey()」というものがありますが、今回は方向のみの取得のため「Input.GetAxis()」という関数を使用します。
まずは「PlayerController」に追加していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { ・・・略 // PCキー横方向入力. float horizontalKeyInput = 0; // PCキー縦方向入力. float verticalKeyInput = 0; ・・・略 // Update is called once per frame void Update() { // PCキー入力取得. horizontalKeyInput = Input.GetAxis( "Horizontal" ); verticalKeyInput = Input.GetAxis( "Vertical" ); Debug.Log( horizontalKeyInput + "." + verticalKeyInput ); } ・・・略 } |
「Input.GetAxis()」はカッコの中に「”Horizontal”」「”Vertical”」と記載することで、横方向(←→)、縦方向(↑↓)を「float」の値で取得できます。
それを「Update」関数の中で取得して、「horizontalKeyInput」「verticalKeyInput」という変数に保存し続けています。
「Debug.Log」をしてConsoleウインドウに表示していますので再生して数値が取れるかどうか試してみましょう。
確認ができたら「Debug.Log」は消してしまいましょう。
FixedUpdate
次に取得したキー入力を使って、プレイヤーに力を加えて動かすのですが、ここで「FixedUpdate」というものを使用します。
これは「Update」と同じ様に繰り返し処理をし続けるUnityの関数で、違いは繰り返しの間隔にあります。
「Update」というのは1フレーム毎に呼ばれる関数で、「FixedUpdate」というのは一定時間毎に呼ばれる関数です。
1フレームというのは必ずしも一定時間にはならないので、「Update」の中で力を加えると一定でない間隔で力が加わってしまいます。そのため移動処理に使用するとガタガタしたり不安定になってしまいます。
次回はこの操作をスマホでできるように変更していきます。
また、スマホ操作の処理を作成する際にUnityRemoteというスマホアプリが有ると便利ですので、この機会にダウンロードしておきましょう。
UnityRemoteについて :
次回の記事 :
コメント
Vector3 cameraMove = Camera.main.gameObject.transform.rotation * move;
cameraMove.y = 0;
ここでは、先に算出した力を回転することにより、カメラから見た左右をX軸、手前奥をZ軸となるようにしています。そして回転により出てしまうY軸方向の力を再度0にします。
———————————————————
上記で「cameraMove.y」を0にした後に、
リジッドボディの速度で引いているため、
y軸の下方向に常に力が発生すると思います。
そのためジャンプの高さが低くなってしまいます。
y軸方向には力を加えないために
「cameraMove.y = rigid.velocity.y;」
とするのが良いかなと思います。
コメントありがとうございます!
ご指摘いただいたコードに関してですが、
Vector3 currentRigidVelocity = rigid.velocity;
currentRigidVelocity.y = 0;
の2行が初出解説部分のコードから抜けていたので訂正しておきました。
最終的なコードやプロジェクトなどでは上記2行が入っているので全体としては問題ありません。
ポポポさんが仰っていたy軸方向にかかる力がかからないようになっています。
ご対応ありがとうございます。
詳しい説明や、読者が間違いやすいポイントなどが細かく記載されており、
とても分かりやすく勉強になります。
感謝です。ありがとうございます。
こんにちは。最近こちらのサイトでUnityの勉強をはじめました。とても分かりやすく、参考になっています。ありがとうございます。
「移動力を加える」のところで、FixedUpdate内の
rigid.AddForce( cameraMove – currentRigidVelocity, ForceMode.VelocityChange );
が
rigid.AddForce( cameraMove – rigid.velocity, ForceMode.VelocityChange );
となっています。その後のコードでは正しくなっているのですが、ここだけ直っていないのですみませんが直していただけると助かります。
コメントありがとうございます。
動作としてはどちらでも問題ないですが直前に代入文が入っていること及びその後のつながりを考えるとrigid.AddForce( cameraMove – currentRigidVelocity, ForceMode.VelocityChange );のほうが良いですね。
修正しておきました。
教えていただきありがとうございます。