3Dアクションゲームの作り方5 プレイヤー移動処理とアニメーション処理の開発 | Unity入門の森 ゲームの作り方

3Dアクションゲームの作り方5 プレイヤー移動処理とアニメーション処理の開発

Unity 3Dアクションゲームの作り方 ゼルダ・原神・モンハン風 (スマホ化対応)


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

本講座はUnityで3Dアクションゲームの作り方について説明しています。前回はプレイヤーのジャンプ機能、またコライダーの処理について解説してきました。

コライダーの処理は今後も多く出てくるので、前回の記事を見ていない方は読んでおいてくださいね。

前回の記事:

3Dアクションゲームの作り方4 ジャンプ処理とコライダー処理汎用スクリプトを開発しよう
本講座はUnityで3Dアクションゲームの作り方について説明していきます。前回はプレイヤーが攻撃できるようにするまで解説してきました。 前回の記事: 第4回目は攻撃処理に加え、キャラクターをジャンプできるようにしていきます。 また、本講座だ...

第5回目はプレイヤーの移動処理・アニメーション処理の開発方法について解説していきます。

今回のゲームはスマホでの動作を前提としていますので、スマホ入力の解説もしていきますが、先にテスト用にPCでの入力処理を作成します。

では始めていきます。


【Line登録者限定のプレゼントもあるよ!】

移動機能の作成

まずはPCのキーボード入力でプレイヤーを動かしていきます。

「↑↓←→」キーで移動できるようにしていきましょう。

PCキー入力の取得

PCのキー入力を取得する関数に「Input.GetKey()」というものがありますが、今回は方向のみの取得のため「Input.GetAxis()」という関数を使用します。

まずは「PlayerController」に追加していきます。

「Input.GetAxis()」はカッコの中に「”Horizontal”」「”Vertical”」と記載することで、横方向(←→)、縦方向(↑↓)を「float」の値で取得できます。

それを「Update」関数の中で取得して、「horizontalKeyInput」「verticalKeyInput」という変数に保存し続けています。

「Debug.Log」をしてConsoleウインドウに表示していますので再生して数値が取れるかどうか試してみましょう。

確認ができたら「Debug.Log」は消してしまいましょう。

FixedUpdate

次に取得したキー入力を使って、プレイヤーに力を加えて動かすのですが、ここで「FixedUpdate」というものを使用します。

これは「Update」と同じ様に繰り返し処理をし続けるUnityの関数で、違いは繰り返しの間隔にあります。

「Update」というのは1フレーム毎に呼ばれる関数で、「FixedUpdate」というのは一定時間毎に呼ばれる関数です。

1フレームというのは必ずしも一定時間にはならないので、「Update」の中で力を加えると一定でない間隔で力が加わってしまいます。そのため移動処理に使用するとガタガタしたり不安定になってしまいます。

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.shop/)で講座閲覧権を取得してね。

次回はこの操作をスマホでできるように変更していきます。

また、スマホ操作の処理を作成する際にUnityRemoteというスマホアプリが有ると便利ですので、この機会にダウンロードしておきましょう。

UnityRemoteについて : 

Unity Remote (スマホアプリ) の使い方 スマホでエディタの再生状態を確認!
「UntiyRemote」というスマホアプリについて解説します。 正確には「Unity Remote 5」という名前でIOS、Androidともに配信されていますので、apple storeやGoogle play storeでそれぞれダウ...

次回の記事 : 

3Dアクションゲームの作り方6 スマホタッチによる移動処理を開発しよう!
本講座はUnityで3Dアクションゲームの作り方について説明していきます。前回はプレイヤーの移動処理、アニメーションの設定について解説してきました。 前回の記事: 第6回目は前回作成したPCでのキー入力や移動処理を実機のスマホで操作できるよ...


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

  1. ポポポ より:

    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;」
    とするのが良いかなと思います。

    • Unity入門の森 より:

      コメントありがとうございます!

      ご指摘いただいたコードに関してですが、
      Vector3 currentRigidVelocity = rigid.velocity;
      currentRigidVelocity.y = 0;
      の2行が初出解説部分のコードから抜けていたので訂正しておきました。

      最終的なコードやプロジェクトなどでは上記2行が入っているので全体としては問題ありません。
      ポポポさんが仰っていたy軸方向にかかる力がかからないようになっています。

  2. ポポポ より:

    ご対応ありがとうございます。

    詳しい説明や、読者が間違いやすいポイントなどが細かく記載されており、
    とても分かりやすく勉強になります。
    感謝です。ありがとうございます。

  3. オイムス より:

    こんにちは。最近こちらのサイトでUnityの勉強をはじめました。とても分かりやすく、参考になっています。ありがとうございます。

    「移動力を加える」のところで、FixedUpdate内の

    rigid.AddForce( cameraMove – currentRigidVelocity, ForceMode.VelocityChange );

    rigid.AddForce( cameraMove – rigid.velocity, ForceMode.VelocityChange );

    となっています。その後のコードでは正しくなっているのですが、ここだけ直っていないのですみませんが直していただけると助かります。

    • Unity入門の森 より:

      コメントありがとうございます。
      動作としてはどちらでも問題ないですが直前に代入文が入っていること及びその後のつながりを考えるとrigid.AddForce( cameraMove – currentRigidVelocity, ForceMode.VelocityChange );のほうが良いですね。
      修正しておきました。
      教えていただきありがとうございます。

タイトルとURLをコピーしました