LoginSignup
25
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-12

この解説は

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'コンポーネントをアセットで用意し、用いる

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

25
26
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
26