(Unity初心者向け)ブロック崩しの作り方 #2 ボールに物理挙動を与える
前回で、大体のオブジェクトの配置が完了しました。
今回は、ボールに動きを与えます。(物理挙動)
Ball を インスペクターの中の一番下にある
Add Component を選択します。
そして
物理挙動をオブジェクトに取得させることができる
Rigidbody
をコンポーネント(要素)をつけてあげます。
Rigidbody と入力して選択してください。
画像右下のAdd Component があります。画像を参考にしてください。
これで実際ゲームを実行してみます。
画面中央の一番上にあるの再生ボタンを押して、
#Scene のとなりに#Gameで
実際のゲーム画面を確認してみます。
重力が働いて、ボールが下に落ちているのがわかります。
今回は重力は使わないので、
use Gravity の チェック は外しておきます。
今回はずっと同じ動きを与えます。
よってボールに一度力を与えて、その力だけで動くようにしたいので、
重力は不要です。
これで再度確認してもらえば、ボールが動かなくなった(重力がなくなった)ことが確認できます。
では、新しく力を加えてあげましょう。
初速だけあたえるために、初速を追加するスクリプトを作成します。
左のProjectの中で、右クリックをして
Create > C# Script を選択します
名前はBallにします。
ではついにコードを書きます。Ballスクリプトをダブルクリックして開きます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ball : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
中身を軽く説明します。
1行目から説明します。
・using
これは、後に書かれるもの(今回ならSystem.Collections)の中身ににあるものを、このソースコードで簡単にするというものです。
なぜ必要かというとソースコード(CSのファイル)は、その中で使えるオブジェクトがその中ですべて明らかになっている必要があります。
C#では、定義されたオブジェクトのみ使用できます。
なんでも適当な名前でコードを書いていくと、書いたものがあらかじめ用意したものかわからなくなります。それを防ぐために、なにかオブジェクトを使うときに、明示するものを記録して集めているのが UnityEngine の部分です。そしてこの集合体が名前空間と呼ばれます。
少し難しいですが、
コードを書くための準備をしてくれるもの
です。1~3行目がそれです。
・public class Ball : MonoBehaviour{クラスの中身}
これはクラスの名前を決めています。
C#ではプログラムをクラスという単位で管理します。
ここでは、
クラス名 = スクリプト名
となっているので覚えておきましょう。
・void Start(){ 処理の中身 }
これはStartメソッドが実行されています。
Startメソッドとは、最初のフレームで一度だけその処理の中身が行われます。
・void Update(){処理の中身}
これもUpdateメソッドが実行されています。
Updateとは、最初のフレームの後に毎フレーム処理の中身が行われます。
・//Start is called before the first frame update
C#では、 // をつかうことでコメント化することができます。
これによりコードの説明をします。
今回なら、英語を翻訳すると
スタートは一番最初のフレームが更新される前に呼び出されます
という意味です。
これはStartメソッドの説明ですね。
ちなみにもう一つのコメントはUpdateの説明です。
では、スクリプトの中身について理解したところでコードを書きます。
最初に初速をの力を加える処理を追加します。
メソッドに記述する前に、
入力値の準備するためにあらかじめ値をよびだしときます。
毎フレーム呼ばれたら、どんどん速くなってしまうので
Start メソッドに以下のように記述してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ball : MonoBehaviour
{
// Start is called before the first frame update
//初速を入力値として準備します
public float speed = 100;
void Start()
{
//rigidbodyを取得
Rigidbody rb = this.GetComponent<Rigidbody>();
//力を設定
Vector3 force = new Vector3(10.0f, 10.0f, 0.0f) * speed;
//力を加える
rb.AddForce(force);
}
// Update is called once per frame
void Update()
{
}
}
Rigidbodyを取得して、
Vector3 を用いて、x、y軸方向に力が働くように設定しています。
そして、最後に実際に両方用いて、実行しています。
C#の基本の考え方である、準備 => 実行
のながれを感じることはできたでしょうか。
では、BallスクリプトをBallにアタッチすること忘れないように気をつけて、
HierarchyウィンドのなかのBallオブジェクトに
Ballスクリプトをドラッグ&ドロップでアタッチしてください。
Ball のインスペクターで実際にスクリプトがあるか確認してください。
右下で確認できました。
それではゲームを実行してみましょう。
壁にぶつかると、うまく跳ね返りません。
正しく跳ね返るようにするには
Physic Material(物理特性マテリアル)
というものを使用します。
Projectウィンドのなかで右クリックして
Create > Physic Material を選択 名前は Physic Material にします。
右のインスペクターの値を調整します。
・Dynamic Friction
動摩擦。通常は、0 (なし)から 1(重力なしで素早く停止) の間。
今回は摩擦は不要なので
0にします
・Static Friction 0
静止摩擦。 これも摩擦で不要なので
0にします。
・Bounciness 1
面の跳ね返し度合い。0 (なし)から1(損失なし)
ボールは跳ね返ってほしいので1にします。
・Friction Combine max
衝突時の摩擦の結合方法
maxにするとぶつかり合ったオブジェクト大きい方が採用されるので、
maxにしてぶつかっても、力が分散しなくなります。
よってmaxに値を変更。
・Bounce Combine max
跳ね返し度合の結合方法
maxにして、力が多き方が採用されるようにして
力が分散しないようにします。
よってmaxに値を変更
設定が完了できたので、
四方の壁(Wallright,Wallleft、Walltop,Wallbottom、)
とボール(Ball)とラケット(Racket)
にそれぞれ Physic Material
をアタッチします。
Physic Material を それぞれのオブジェクトにドラッグ&ドロップして、
インスペクターでアタッチされているか確認してください。
Box collider の コンポーネントの中身(Material)にPhysic Materialが追加されているはずです。
これにて無事にボールが動くようになりました。
次回は、ラケットを操作できるようにします。
この記事が気に入ったらサポートをしてみませんか?