[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(3)動くボール

  • 16
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

この解説は

Unityのサイトに昔からあるチュートリアルに、以下があります。
「はじめてのUnity」(旧)
http://tutorial.unity3d.jp/archive/my-first-unity/

これを独自にC#化したものをベースとしています。以下を
この解説は以下の段階があります、前の内容を実行した上でのものとして参照して下さい。現時点(20151026)では、新しい「はじめてのUnity」の玉転がしゲームが公開されています。本サイトのブロック崩しと併せて学習すると広がりがあり、初期の学習にはとても有効です。

動く物体を作る

ここでは、Sceneに物体(GameObject)を配置し、動きを与える、ということを進めます。前段階の配置をしている前提ですが、他のものでも同様になるので応用できます。

ボールを配置

上に在るメニューの[GameObject]>[3D Object]>[Sphere]を選択して下さい。
Gyazo
新規にSphereという名前のGameObjectが出来上がります。
そのままでも良いのですが、なじみにくいので名前をBallに変えます。
Gyazo
動作が観察しやすいように、場所を原点付近に置いておきましょう。
[Inspector]タブの[Transform]のところにあるギアをクリックし、[Reset]を選択すると、値がリセットされて原点で大きさが1、回転なしの状態になります。
Gyazo

ボールに物理属性を与える

Unityでは簡単にゲームを作りやすくするために、物理演算を組み込んでいます、Rigidbodyコンポーネントです。これを用いると、落下や衝突、摩擦や空気抵抗など、物理的な動作をUnityで作られた機能で実現できます。

RigidbodyコンポーネントをBallに追加

Ballを選択している状態で、[Compornent]>[Physics]>[Rigidbody]を選びます。
Gyazo
[Inspector]タブにRigidbodyが追加されました。
Gyazo

Rigidbodyコンポーネントを調整

必要に応じて、設定をします。内容は、以下になっています。

プロパティ 説明
Mass オブジェクトの質量 (単位 : kg)。
Drag 空気抵抗。0 の場合、空気抵抗が 0
Angular Drag 回転する際の空気抵抗。0 の場合、空気抵抗なし。
Use Gravity 有効にすると、オブジェクトは重力の影響を受けます。

くわしくは以下を参照してください。
Unity-マニュアル:リジッドボディ
http://docs.unity3d.com/ja/current/Manual/class-Rigidbody.html

状況を確認

まず、現在の状況を確認します。'Rigidbody'があるので、この物体は物理的な動きをします。
エディタ画面中央の実行ボタンを押してみましょう。
Gyazo
ゲーム画面に切り替わり、ボールが真下に落下していくのが判ります。

重力を無効にする

今回のゲームはxz平面(左右と奥行き)上に作っています。y軸で重力の影響を受ける必要が無いので、重力設定を無効にします。コンポーネントのUse Gravityのチェックを外します。
Gyazo
これで玉は落下しなくなりました。

Ballに力を加える

Ballにかかる力は重力も無効なので、現状だとなにも起きません。意図的にBallに力を加えることで、Ballを動かします。意図的な力は、プログラミングの必要があります。Unityでの特殊な処理はScriptコンポーネントを作ってはめることで実現します。

BallにScriptコンポーネントを追加する

[Inspector]タブの一番下にある[Add compornent]をクリックして、Scriptアセットを作成、追加します。ファイル形式はcsを選びます。
Gyazo

ファイル名をBallとします。そうすると、Assetの中にBall.csが出来ています。
Gyazo

Ball.csを編集する

Asset内の'Ball'スクリプト(C#のアイコン)をダブルクリックすると、エディタが開きます。
優先的に開かれるエディタは、多くの場合はMonoDevelopというソフトが起動されます。自分で使いたいコードエディタがある場合は、それも可能です。調べてみましょう。

Ball.cs
using UnityEngine;
using System.Collections;

public class Ball : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

エディタで開かれた直後の状態です、それぞれに意味がありますが、知りたい人はこちらを参考にして下さい。

[超初心者向け]やっと納得、Unityを初めて触ると出てくるC#の何だあれの答え
http://qiita.com/JunShimura/items/3c2e23bb77cc9085bfda

今回は、初速を与えるのに、以下のコードを追加して力を加えます。

Ball.cs
using UnityEngine;
using System.Collections;

public class Ball : MonoBehaviour {

    private float speed = 20.0f;    //これを追加

    // Use this for initialization
    void Start () {
        //以下を追加
        this.GetComponent<Rigidbody>().AddForce(
            (transform.forward + transform.right) * speed,
            ForceMode.VelocityChange);

    }

    // Update is called once per frame
    void Update () {

    }
}

部分的に解説します。

    private float speed = 20.0f; 

変数名speedという小数が使える変数で、初期値を20にして宣言しています。これを速度とみなしています。

        this.GetComponent<Rigidbody>().AddForce(
            (transform.forward + transform.right) * speed,
            ForceMode.VelocityChange);

ここでは、このスクリプトの結びついたRigidbodythis.GetConpornent<Rigidbody>()から、備わっているメソッドのAddForceを使って、力を加えています。
AddForceには、どちらの向きに力を加えるのかを、3次元のベクトルで指定します。この例では、前方向きの単位ベクトルtransform.forwardと右向きの単位ベクトルtransform.rightを加算し、右前方方向のベクトルを求め、それに対してspeedを乗算しています。speedは変数なので、ベクトルの大きさを変える役割になります。

AddForceに関しては、以下を参考にして下さい。
Unityスクリプトリファレンス Addforce
http://docs.unity3d.com/jp/current/ScriptReference/Rigidbody.AddForce.html

これを保存して実行してみましょう。
Gyazo

カメラの位置を調整

現状だと動きが観察しにくいので、Maincameraを操作します。Maincameraオブジェクトは、ゲーム画面を撮影しているカメラのことです。どこから撮影するか、向いている角度などを設定して、見やすい形にしましょう。
Maincameraを選択して、適宜、見やすい位置に'Transform'を変えましょう。このとき、真上近くから見下ろすと全体が判りやすくなります。そのためには回転角度を加えるとよいです。x軸に対して回転したい場合は、Rotationxを変えると見やすくなります。値を大きくするとしたにうつむいて、見下ろす方向になります。

Gyazo

Gyazo

物理的な属性を変更する

現状だと壁に跳ね返らず、最後に失速して終わります。また、動作方向がxz平面だけでよく、回転に関する動作も要りません。エネルギー損失が全く無い状態が、今回のゲームでは向いていおり、まとめると以下になります。

  • 空気抵抗が無い
  • 摩擦が無い
  • 回転に関する摩擦が無い
  • 移動するのはxz平面上に限定する
  • 回転しない
  • 速度を維持して跳ね返る(エネルギー損失が無い)

Rigidbodyで抵抗や軸固定を設定する

空気抵抗などの影響を受けないように、設定を変えます。
Gyazo
DragAnguar Dragが0になると、空気抵抗が消えます。
xz平面だけの移動で、尚且つ回転しない設定にするには、Rigidbodyコンポーネントの最下部にあるConstrainで設定できます。これで固定したい値にチェックを入れます。今回は位置(Position)のY、回転角度(Rotation)のxyzにチェックを入れました。
Gyazo

これで動作を確かめると、、以下になります。
Gyazo

物理的な材質Physic Materialを設定し、跳ね返り係数を設定する

ボールは壁に当たりますが、跳ね返りません。跳ね返る係数を設定するには、物理的な材質を設定するPhysic Materialが必要になります。
下のAssetタブの左上の[Create]>[Physic Material]を選択します。
Gyazo

Asset内にNew Physic Materialが出来上がるので、名前をBall Physic Materialに変えます。
Gyazo

Physic Materialに関しては、以下に解説があります。
Unity-マニュアル:物理属性マテリアル
http://docs.unity3d.com/ja/current/Manual/class-PhysicMaterial.html

これを選択状態し、[Inspector]タブで設定を変更します。

プロパティー 説明
Dynamic Friction 動摩擦。通常は、0 (なし)から 1(重力なしで素早く停止) の間。
Static Friction 静止摩擦。
Bounciness 面の跳ね返し度合い。0 (なし)から1(損失なし)
Friction Combine 衝突時の摩擦の結合方法
Bounce Combine 跳ね返し度合の結合方法

今回は、以下を設定します。

  • 摩擦は全く無い
  • エネルギー損失の無い跳ね返り
  • 衝突時の摩擦の計算は最小に
  • 衝突時の跳ね返りは最大に

Gyazo

出来たBall Pysic MaterialBallオブジェクトのSphere Colliderコンポーネントに与えます。
Sphere ColliderコンポーネントのMaterialのところにある○をクリックし、Ball Pysic Materialを設定します。

Gyazo

設定が変わって、跳ね返るようになりました。
Gyazo

Gyazo

まとめ

  • 力を加えるにはスクリプトを用いる
    • スクリプトはアセットで新規に作成する
    • 内容を変更するにはダブルクリックでエディタを開く
    • Startのところに処理を書く
    • 力を与えるメソッドはRigidbodyコンポーネントのAddforce
  • 空気抵抗や摩擦、軸の固定はRigidbodyコンポーネントで設定する
  • 跳ね返りなど衝突時の演算が必要な物理属性は'Physic Material'コンポーネントをアセットで用意し、用いる

この解説は以下の段階があります、前の内容を実行した上でのものとして参照して下さい。