キャラクターの移動とカメラコントローラー

キャラクターの移動とカメラコントローラー

 Charactor Controllerを用いたキャラクターの移動とカメラをコントロールするScriptの作成をしました。

Script

 WASDキーで前後左右斜めに移動できます。マウス移動でプレイヤー及びカメラの向きを変更、マウスホイールでカメラのズームイン/アウトができます。また、矢印キーでカメラ位置の調整ができます。

 このScriptを使用するには、Edit→Project Settings→Input ManagerからHorizontal_2(Negative Button→a、Positive Button→d)、 Vertical_2(Negative Button→s、Positive Button→w) 、 Camera_Horizontal(Negative Button→left、Positive Button→right)及びCamera_Vertical(Negative Button→up、Positive Button→down) を新しく作成する必要があります。また、Charactor Controllerも必要となります。

キャラクターの移動

 Input.GetButtonによって得られる値と Input.GetAxisによって得られる値(h、v)から 移動方向(前後、横及び斜め)を判別しています。

移動方向を判別した後に、その移動方向へプレイヤーを回転させています。

横方向から前方もしくは前斜め方向、前方から横方向へ方向転換する際、一度立ち止まってから加速します。例えば、横方向から前方へ方向転換する時、横方向の速度にはh(Input.GetAxis(“Horizontal_2”))を使用しており、また、前方の速度にはv(Input.GetAxis(“Vertical_2”))を使用しています。そのため、横方向から前方へ方向転換した時、v=0なので一旦停止した後に加速となります。これを回避するために以下のコードを入れています。

Input.GetAxisはキーが離されたときすぐに0となるわけでなく、gravityの値に応じて徐々に減少していきます。そのため、キーが離されたとき移動速度が0とならないように以下のコードを入れています。

カメラコントローラー

カメラの移動

 v3_right_dirはプレイヤーが前方(wキーもしくはsキーを押したときに向く方向)を向いたときに右方向を示すベクトルです。このベクトルを軸として鉛直方向を示すベクトル(Vector3.up * radius)を回転させることでカメラの位置を決定しています。

また、カメラのズームイン/アウトは

で行っています。

カメラの中心を移動

 矢印キーで カメラの中心を移動できます。中心の移動範囲は直方体内側とります。v3_camera_offset_hは中心から横方向へどれだけ移動したかを示すベクトルです。また、v3_camera_offset_vのx、z成分が前後方向をy成分が上下方向へどれだけ移動したかを示しています。この二つのベクトルを使用することでカメラの移動範囲を制限する処理を行っています。

障害物の検知と処理

 Linecastによってプレイヤーとカメラの間に障害物があるかを検出しています。障害物を検出した際、radius = hit.distance + 0.1fとしていますが、もし、radius = hit.distanceであると、次フレームでLinecastに接触しなくなりradius += 10.0f * Time.deltaTimeが実行されカメラが少しズームアウトされ、さらに次フレームでLinecastと接触してradius = hit.distanceとなります。これが繰り返されるためカメラがガタガタ震えるようになります。そのため、少しカメラを障害物にめり込ませることでこれを回避しています。

その他

 カメラに関わる処理はLateUpdate内に書いています。もし、カメラの移動をUpdate内に書くと、Scriptからオブジェクトの移動を行っている場合、オブジェクトが移動してからカメラが移動するのか、カメラが移動してからオブジェクトが動くのかが決まっていません。そのため、ガタツキ等が生じたりします。そのため、LateUpdate内にカメラの移動処理を書いています。

実行結果

 実行結果は以下の通りです。コントロールキーを押すとカーソルがロックされます。もう一度、コントロールキーを押すと解除されます。


本当は、斜め後ろ方向から横方向へ方向転換する際、速度を0から加速するようにしたかったのですが、速度をそのまま保ってしまいます。

このコンテンツはユニティちゃんライセンス条項の元に提供されています


    Warning: Trying to access array offset on value of type bool in /home/empty/karanokan.info/public_html/wp-content/themes/lionblog/single.php on line 192

    Warning: Trying to access array offset on value of type bool in /home/empty/karanokan.info/public_html/wp-content/themes/lionblog/single.php on line 193

    Warning: Trying to access array offset on value of type bool in /home/empty/karanokan.info/public_html/wp-content/themes/lionblog/single.php on line 194
  • 前の記事
    NO IMAGE

    Scriptによるレンダーテクスチャへの数値書き込みについて 2019.11.06

  • 次の記事
    キャラクターの移動(Input.GetAxisRaw)

    キャラクターの移動(Input.GetAxisRaw) 2019.12.01