ユニティちゃんを動かして、カメラの追従を行う所まで完了しました。
今回は、ユニティちゃんの操作方法を少し変更してみようと思います。
というのも、このままの状態では縦横無尽に移動可能なので、敵が出現しようとプレイヤー自らぶつかりにいかない限り、敵との衝突が実現できません。
ですから、ユニティちゃんはステージ上を常に前方に走り続けるようにしたいと思います。
これによりプレイヤーの操作は、左右移動とジャンプのみにするわけです。
最終的には、Androidでの動作を目標にしているので、画面上にボタンを配置してタップにより対応の動きをするようにする予定です。
キャラクターを自動的に前方に走らせる方法
前々回、ユニティちゃんの基本的な動作は実装していますので、その時のスクリプト「UnitychanController」を修正していきます。
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class UnitychanController : MonoBehaviour | |
{ | |
CharacterController controller; | |
Vector3 movedir = Vector3.zero; | |
int Lane; | |
public float speedX; | |
public float speedZ; | |
public float acceleratorZ; | |
// Start is called before the first frame update | |
void Start() | |
{ | |
controller = GetComponent<CharacterController>(); | |
} | |
// Update is called once per frame | |
void Update() | |
{ | |
if (Input.GetKeyDown("left")) | |
{ | |
if (controller.isGrounded && Lane > -2f) | |
{ | |
Lane--; | |
} | |
} | |
if (Input.GetKeyDown("right")) | |
{ | |
if (controller.isGrounded && Lane < 2f) | |
{ | |
Lane++; | |
} | |
} | |
if (Input.GetKeyDown("space")) | |
{ | |
if (controller.isGrounded) | |
{ | |
movedir.y = 10f; | |
} | |
} | |
movedir.z = Mathf.Clamp(movedir.z + (acceleratorZ * Time.deltaTime), 0, speedZ); | |
float ratioX = (Lane * 1.0f - transform.position.x) / 1.0f; | |
movedir.x = ratioX * speedX; | |
movedir.y -= 20f * Time.deltaTime; | |
Vector3 globaldir = transform.TransformDirection(movedir); | |
controller.Move(globaldir * Time.deltaTime); | |
if (controller.isGrounded) | |
{ | |
movedir.y = 0; | |
} | |
} | |
} |
ステージ上に5つのレーンを用意して、左右キーの入力によってレーンを移動するようにします。
こちらは、シーンビューを俯瞰からスクリーンショットしたイメージ図です。
この黒い線の上をユニティちゃんが前方に自動的に走るようになります。ゲーム開始時は原点になる「0」のレーンからスタートします。
右キーが1回押されるとLaneの値がインクリメントされて「0」→「1」となりユニティちゃんが0から1のレーンに移動します。左キーも同じような流れですね。
Laneの範囲は「-2」~「2」と指定しているので、原点からだと左右どちらも2回までの移動となります。現在地xが移動するレーンの位置と離れているほど、速度が大きくなります。近づくにつれて小さくなり目的のレーン到達で速度0となり移動しなくなります。
前に走り続ける処理は、movedir.zに値を設定することで常にユニティちゃんを前進させます。
acceleratorZを毎フレーム加えることで、徐々に加速させるようにします。無限に加速し続けることを防ぐために最高速度を指定します。Mathf.Clamp関数を使う事で、speedZ以上にならないようにしています。
Mathf..Clamp関数は、第一引数の値を、第二引数と第三引数の間で収まるようにする処理です。
スクリプトを修正したら、インスペクターからSpeedX、SpeedZ、AcceleratorZに移動するスピード等を入力しましょう。
ゲームを実行するとこんな感じになります。
前方に自動で進み、入力によって左右に滑らかに移動していることを確認出来ると思います。
ゲームの内容にもよりますが、操作方法も多ければ良いってもんじゃないんですよね。制限をつけることで、シンプルかつ面白いゲーム性になる事もあります。
ゲームをプレイするイメージを膨らませて、操作方法を考えることが大切ですね。