Unity 講座 1 講師 : 三回生 まいとん
Unity って何 ゲームエンジン ( 統合型ゲーム開発環境 ) の一つ 3D 2D を問わずゲームを簡単に作成できる 年間 100,000$(1,200 万円 ) を超えなければ無料でゲームを出し放題
ここが凄い!Unity!! 本当に簡単にゲームが作れる ( 完成するとは言っていない ) アセットが豊富 低スペックでも動く モバイルゲーム パソコンゲームが一発で変換可能 話題の VR も簡単にできる
この Unity 講座 (2 回分 ) で行う内容の一覧 1 回目プロジェクト作成 UnityのGameObjectについて物理 (Rigidbody) について Update 関数,Start 関数について当たり判定とOnCollisionEnter 関数オブジェクトの削除キーボード ゲームパッド入力 2 回目 CharacterControllerについて Audioについて Game Controllerを作る UI(uGUI) を使う Sceneについて Animationについて
前書き 環境は Windows でやってますが Mac でも問題なく同じ動作ができます VisualStudio を使ってますが Mac でも問題なく MonoDeveloper で動きます 開発環境は 5.3.0 ですが最新版は 5.3.2 です おそらく問題なく動くと思います
早速起動してみよう
プロジェクトの作成
プロジェクトの作成
GameObject について 最初からHierarchyに配置されている MainCamera, DirectionalLight など HierarchyにあるものはすべてGameObjectです Unity では この GameObject を移動させたり 変化させたりすることで ゲームを作っていきます
とりあえずなんか置いてみよう Hierarchyの上で右クリックをすると色々出てくるので 3D Object -> Sphereを左クリックします
なんか作れた
物理を導入 説明をすべて省いて Rigidbody( 剛体 ) を導入します Sphereをクリックして Inspecterの中にあるAddComponentから Physics -> Rigidbodyを探してクリックします
物理を導入 できました
とりあえず実行してみよう 上部にある 再生ボタンで再生できます
重力に逆らえない ボールが落ちました Rigidbody を導入すると この世界の物理法則が通用されるようになります 色々いじると重力の方向変えたり 重力を受けなかったりすることができるのですが 今は説明を省きます あとでやります
受け皿用意 このまま落ちるのはどうかと思うので 平べったい受け皿を用意したいと思います ( 課題 1) Sphere を出した方法と同じ要領で Plane を出してみてください
答え合わせ
GameObject の位置を変える オブジェクトの位置がおかしい気がしますので 少しこのPlaneを下げたいと思います方法は2 通りあります Sceneからドラッグアンドドロップで動かす Inspecterから数値を直接いじる 今回はInspecterから直接いじってみます Planeの場所を X:0 Y:-1 Z:0 にしてください
自作クラスを作る 実行すると Sphere は Plane より下に落ちなくなりました が ゲーム作成には程遠い気がします 早速ですが このボールに初速を加えてあげたいと思います
自作クラスを作る Projectにある Assetsを右クリックして Create -> C# Scriptをクリックします 名前は BallController にします
自作クラスを作る こうなります 早速ダブルクリックして開きましょう WindowsならばVisual Studioが開くと思います ( ここにある GameScene はこっちの不手際で先 に作ったものなので気にしなくて大丈夫です )
自作クラスを作る いつもの Visual Studio が開くと思います 通常と違い 最初からある程度書いてあると思います 説明を省いて いきなり次のスライドの内容を書いてください ( 備考 : 絵は國光様のです )
using UnityEngine; using System.Collections; public class BallController : MonoBehaviour { Rigidbody rb; // Use this for initialization void Start () { rb = GetComponent<Rigidbody>(); rb.addforce(vector3.forward * 10); } // Update is called once per frame void Update () { } }
自作クラスを張り付ける 終わりましたら BallController を Sphere につけてあげたいと思います BallController をドラッグアンドドロップすることでつけることができます
実行してみてください
しょべぇ!!!! 速度が遅すぎますね とりあえず このままにしておいてスクリプトの説明に入りたいと思います
using UnityEngine; using System.Collections; public class BallController : MonoBehaviour { Rigidbody rb; // Use this for initialization void Start () { rb = GetComponent<Rigidbody>(); rb.addforce(vector3.forward * 10); } // Update is called once per frame void Update () { } }
Start() と Update() スクリプトを作成すると 最初から書いてあるこの 2 つの関数 Start は実行時に 1 度だけ呼ばれる関数で Update はフレーム毎に呼ばれる関数です 基本的にはこの中に ゲームの部分を書いていきます
Rigidbody と GetComponent<T>() Rigidbody は少し前にやった 物理剛体です Sphere に入っています GetComponent<T>() は そのクラスを取得する関数です 今回は Rigidbody 型の変数 rb に この Sphere の中にある Rigidbody を代入した ということになります
AddForce(Vector3) と Vector3 次の AddForce ですが これは Rigidbody クラスが元から持っている関数です 名前の通り力を加える関数です 引数は Vector3 型です これは単純に X,Y,Z を持った変数です 地味に正規化とかも簡単にできる便利なやつです 今回は Vector3.forward, つまり X,Y,Z = 0,0,1 のものを入れました 前に進みます また こういった関数は ( ほぼ ) すべてリファレンスに書かれているの で わからなくなったら見ることをお勧めします
あまりにも初速が遅すぎる ( 課題 2) あまりにも初速が遅すぎるので もっと早くしてください また 壁を生成して 落ちないようにしてみてください
答え合わせ 思考停止で数値をとりあえず 100 にしました 最初は動けばいいのです
当たり判定 まだまだしょぼいですが 当たり判定が判別できれば 少しはそれっぽくなるのでは? とりあえず 球が何かと当たったら デバッグ用にログを流すようにしてみましょう
さっきの BallController を書き足します 何も消さず こんな感じで書き足してください } // Update is called once per frame void Update () { } // ~~~ ここから下を書き足す ~~~ void OnCollisionEnter(Collision col) { Debug.Log(col.gameObject.name); } }
デバッグウィンドウを出す 実行する前にデバッグウィンドウを出しておきましょう 上の Window から Console を出します 出したら実行してみましょう
こんな感じになる
OnCollisionEnter(Collision col) 何か当たった時に 呼ばれる関数です 引数である col は当たったオブジェクトのことです Collision ってなに? って思う人は Sphere を見てください 実は最初から Sphere Collision というのが生成されていて これが当たり判定を担っているのですね!!
オブジェクトの消去の仕方 壁にぶつかったら その壁消したいな ~ なんて思いました 早速やってみたいと思います 以下のように書き換えます 終わったら保存して実行 void OnCollisionEnter(Collision col) { if (col.gameobject.name == "Cube") { Destroy(col.gameObject); } }
Destroy(GameObject) 名前の通りなので説明しません 引数は GameObject 型です
キーボード対応 そろそろ実行結果だけを見てるだけは飽きてきたと思います ゲームはインタラクティブなものです ずっと自動で動いていた Sphere を キーボードで移動できるようにしましょう
Update BallController.cs を書き換えます void Update () { Vector3 movedirection; movedirection = Input.GetAxis("Horizontal") * Vector3.right + Input.GetAxis("Vertical") * Vector3.forward; movedirection *= 10; } rb.addforce(movedirection);
備考 : 動かない! さっきのスクリプトをそのまま書いたら動くのですが よくエラーで実行できない時があります その時は焦らず Window から Console を開いて ( もしくは 一番下にあるエラーメッセージをクリックすると開ける ) エラーメッセージを確認してみてください よくあるのが Horizontal と Vertical のスペルを間違えることです
Input Input とは 名前の通り入力を受け付けるクラスのことです 様々な関数があります 今回使用したのは Input.GetAxis といって 上下左右を受け付ける関数です これはかなり優秀で 初期状態ならば 上下左右の矢印キー WASD 移動 ゲームパッド は Horizontal( 左右方向 ),Vertical( 上下方向 ) で 媒体にとらわれず対応することができます
Input また GetButton 関数でもいろいろ取得できます 引数はGetAxisもGetButtonでもstring 型です 引数は Edit -> ProjectSetting -> Input からいじることができます 今回は説明しません ぐぐってね
速度を変数化する movedirection *= 10 この部分は マジックナンバーを使っていますが ここを変数にしたいと思います * 備考 * いろいろ省略しています Rigidbody rb の下に変数を定義 movedirection を speed にしています public class BallController : MonoBehaviour { Rigidbody rb; public float speed = 10; void Update () { movedirection *= speed; }
Inspector の様子が? Sphere の Inspector の様子を見てみると BallController の中に Speed と書かれた変数が存在しています 変数を public で定義すると Inspector から直接変数を変更することができます 有効活用していきましょう
ここで第 1 回目終了 お疲れ様でした