音無サノトの空想録

4コマ漫画と創作日記

【ゲーム制作】イチから Unity の学びなおし ③玉転がしゲーム その2 Player の動作処理

どうも音無サノトです。

プログラミングの学習として、Unityでゲームを制作しています。

前回の続きからやっていきます。いよいよコードを書いていきます。

 

今回は Player を動かすスクリプトを追加します。

 

 

Rigidbody の追加

Hierarchy ウィンドウにある Player を選択します。

f:id:otonasisanoto:20190330092927p:plain

 

ツールバーの Component > Physics > Rigidbody を選択します。

Rigidbody とは、そのオブジェクトを物理特性によって操作するためにつけるものです。

オブジェクトに力を加えて操作したり、重力の影響を与えたり、他のオブジェクトと衝突させたりするのに使います。

f:id:otonasisanoto:20190330093000p:plain

Rigidbody は Inspector ウィンドウの一番下にある Add Component から選択することもできます。

f:id:otonasisanoto:20190330093359p:plain

 これで物理特性を与えることができます。

 

プライヤーを操作するスクリプトの追加

いよいよコードを書いていきます。

まず、Project ウィンドウから Create > Folder を選択し、 「Scripts」という名前のフォルダを用意します。

f:id:otonasisanoto:20190330094255p:plain


ツールバーより Assets > Create > C# Script を選択し、スクリプトを追加します。

f:id:otonasisanoto:20190330094414p:plain

 

Project > Create > C# Script から選択することもできます。

f:id:otonasisanoto:20190330094659p:plain

 

Inspector ウィンドウの Add Component からスクリプトをオブジェクトにアタッチした状態で追加することもできます。

f:id:otonasisanoto:20190330095046p:plain


追加したスクリプトの名前を「PlayerContoller」にします。

f:id:otonasisanoto:20190330095314p:plain

 

スクリプトをオブジェクトにアタッチしていない場合は、ドラッグ&ドロップで Inspector ウィンドウのところに持っていけば追加できます。

f:id:otonasisanoto:20190330095519p:plain


スクリプトをダブルクリックするとエディタが開きます。
Windows の場合、デフォルトでは Visiual Stutio が開きます。

自分が学生の頃は、MonoDeveopment  という使いづらいエディタがデフォルトで、Visiual Studio と紐づけるために別の設定をしなきゃならなかったのですが、そこら辺は変更されているみたいです。便利になったなと思います。

初めて Visiual Studio を開くとサインインしろとか出てきますが、後で行うでいいと思います。

無事に起動すると、下記の様な画面が出てきます。

f:id:otonasisanoto:20190330100131p:plain


デフォルトでは Start 関数と Update 関数が用意されています。

簡単に説明すると、Start 関数がゲーム開始前に行われる処理で、Update 関数がゲーム実行中に行われる処理です。

 

物理挙動の更新の前に実行させるには、FixedUpdate 関数を使う方がいいらしいです。

これはゲームのレンダリングによって、処理する関数の順番が違うことが関係しています。詳しくは公式のマニュアルをお読みください。

 

最終的に書くコードは以下の通りです。 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerContoller : MonoBehaviour
{
    public float speed;

    private Rigidbody rb;


    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }


    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.AddForce(movement * speed);

    }
}

 

コードの中身をざっと説明いたします。

まず、Unity では変数を public で宣言するとエディタ上から数値を入力することが可能になります。

f:id:otonasisanoto:20190330110519p:plain

 

この様に宣言すると、アタッチされたスクリプトのところから変更できるようになります。

f:id:otonasisanoto:20190330110940p:plain

ここの Speed の値がソースコード上の変数 speed に適用されます。

この Speed の値がボールの速さになります。試しに色々と変更してみると、ボールの動きが早くなったり遅くなったりします。

 

次に Rgitbody 型の変数 rb を用意して、Start 関数内でコンポーネントを取得しています。

f:id:otonasisanoto:20190330111048p:plain

 

イメージとしては下の様に、スクリプトがアタッチされているオブジェクトの Rigidbody をゲーム開始前に取得している感じです。

f:id:otonasisanoto:20190330111418p:plain

 

次に FixedUpdate 関数内の説明です。

f:id:otonasisanoto:20190330112840p:plain

最初の2行がキーボード入力の数値を取得している処理になります。

Input クラスのGetAxis という関数を使って、Horizontal (左右)、Vertical(前後)のキーボード入力の値を取得しています。

それぞれの値が変数 moveHorizontal と moveVertical に代入されます。

 

その値を元にVctor3 型の変数 movement を作成しています。

Vector3 とは (x, y, z) の三次元の値をそれぞれ持っているクラスです。

上記のコードでは、X軸に moveHorizontal の値(キーボードの左右の入力)を Y軸は0、Z軸に moveVertical の値(キーボードの前後の入力)が入ります。

 

そして、最後に Rigitbody クラスの AddForce 関数を使って、ボールにキーボード入力の Speed 分の速さで力を加えています。

イメージとしては、下のようにスクリプトが Rigidbody に対して、処理をしている感じです。

f:id:otonasisanoto:20190330112523p:plain

 

実際に動作を確認してみます。

再生ボタンを押してキーボードの矢印で操作してみてください。

キーボードの入力に応じてボールが動くはずです。

エラーが出た場合はコードを見直し、ボールが早すぎる場合は Speed の値を変更します。

f:id:otonasisanoto:20190401092839p:plain

これで Player を動かすことができました。

コードに関して詳しく知りたい場合は公式のスクリプトリファレンスがおすすめです。

 

ただ、これだとカメラが固定されたまんまなのでゲームぽくないです。

次回はカメラの動作処理を作成します。

 

本日は以上となります。最後まで読んでいただきありがとうございました!