今回の移動は自分が転がることが出来ることを前提にしています。(プレイヤーが球形ってかなり特殊なのでは…?という疑問はさておいて。)
共通認識
前にも書きましたが一応こちらにも。プレイヤーが球の状態で転がって移動するときなどは滑らかに動かしたい、キューブ型のプレイヤーならカックカクでもOK~!みたいに、動作の付け方にもいろいろなパターンがありますが、まずそれらの共通認識として頭に入れておきたいのがこちら。
- 手前に動かしたい→back
- 奥に動かしたい→foward
- 上に動かしたい→up
- 下に動かしたい→down
ややこしいけれども、手前(back)と言えばこっちに近付いてくるイメージ。奥は逆に遠ざかる(foward)イメージ。上(up)と言うのはジャンプした時などに向かう真上のことで、下は穴に落っこちたりしたときの方向。後々方向を指示する必要が出て来るので、頭パーン!ってなりそうだけれども覚えておかないと…。
方向キーを押すと奥に転がってくプログラム
public class タイトル : MonoBehaviour
{
public int power; //力の調整の変数宣言をして、後程力加減の調整を出来るように
Rigidbody player; //rigidbodyを入れる為の型と変数playerを宣言
void Start()
{
player = GetComponent<Rigidbody>();
//playerという変数の中にゲームが始まった瞬間
//コンポーネントを捕まえて来て入れる。
//その時のコンポーネントはrigidbodyですよと言う意味
}
void Update()
{
//十字キーで動かす
if (Input.GetKey(KeyCode.RightArrow)) //右矢印キーが押されたら
{
player.AddForce(Vector3.right); //右に動く
}
if (Input.GetKey(KeyCode.LeftArrow)) //←矢印キーが押されたら
{
player.AddForce(Vector3.left); //左に動く
}
if (Input.GetKey(KeyCode.UpArrow)) //上矢印キーが押されたら
{
player.AddForce(Vector3.forward); //奥に動く
}
if (Input.GetKey(KeyCode.DownArrow)) //上矢印キーが押されたら
{
player.AddForce(Vector3.back); //手前に動く
}
if (Input.GetKeyDown(KeyCode.Space)) //スペースキーが押されたら
{
player.AddForce(Vector3.up * power);//上に動く
}
//動かす力を変化させたい場合はこんな感じに書く↓
//player.AddForce(Vector3.forward * power);
//playerの中にはrigidbodyが入っていて、力を加えます(AddForce)よ。
//手前の方(z)に動きますよ。powerは公共のものにしているので簡単に変更可
}
}
今回はRigidbodyという、物理演算を簡単に行ってくれる便利なものを利用させていただきました。
コンポーネント(GetComponent<Rigidbody>();)って何?
本当、コンポーネントって何だろう?って思いますよね?一文字は思いました。そこで、現時点で分かっているコンポーネントについての記事をまとめたのでこちらに載せておきます。
ここでやっていることと言うのはつまり、このオブジェクトのRigidbodyをお触りしたいからゲットしてきて頂戴ねってことですね。
Input.GetKeyって?
指定のキーが入力されるとtrueを返してくれるというものです。返って来るのがtrueというのが大事ですね。つまりif文で活躍してくれるってことです。
もしもこのキーが押されていたら、~をしますよって命令文が書けるということですね。
if (Input.GetKey(KeyCode.RightArrow)) //もしも右矢印キーが押されたら
{
player.AddForce(Vector3.right); //右に動く
}
AddForceでRigidbodyに力を加える
AddForceはRigidbodyに力を加える、という命令文です。つまり、
player.AddForce(Vector3.forward); //奥に動く
というのは、player(Rigidbodyが格納された変数名)のRigidbodyに力を加えますよ。じゃあどこに?Vector3(xyzの座標を持つ)のforward(奥)に。と言う意味ですね。
player.AddForce(Vector3.forward * power);
こうした場合、powerというのは変数で、具体的にどれくらいの力をもってして動かしたいのかというのを指定することが可能になって来るってことです。
ちなみにですが、キューブ型のオブジェクトに同じことをしたら全然転がってくれませんでした。カタマリダマシイみたいにならないかなって思ったんですけどね…(笑)