Edited at

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

More than 3 years have passed since last update.


この解説は

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


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