Unity5の教科書5日目

学習内容

◇Physicsを使ってオブジェクトに物理挙動をさせる

  • Physics : Rigidbodyコンポーネント、Colliderコンポーネントの二つからなる。
  • Rigidbody:力の計算(物体にはたらく重力や摩擦などの力の計算)を担当。
  • Collider:物体のあたり判定

・Physicsを使って物理挙動をさせる際には、RigidbodyとColliderの2つをアタッチする必要がある。

・コライダーを設定する際に、対象のオブジェクトに合うコライダーがなければ、形状を修正する。

・RigidbodyコンポーネントはAddForce関数を持っている。
AddForce関数:プレイヤに力を加える関数。引数にはベクトルを渡す。
例えばtransform.up({0,1,0}のベクトル)などを引数として渡せば、上方向に長さ1だけ動くことになる。

AddForce関数はフレーム事に力をかけ続けるので、移動などをAddForce関数で実装した際には制限を設けないと、プレイヤーの速度がどんどん加速してしまう。
そのため、速度を制限するスクリプトを作っておく必要がある。

キャラの反転にはプレイヤーの進んでいる方向のスプライトを表示し、逆方向に進む際には、スプライトを反転させる。
これにはスプライトのX方向の拡大率を-1倍にすることで実現できる。
スクリプト上でスプライトの拡大率を変更する場合には、TransformコンポーネントのlocalScale変数の値を変更する。
localScale変数はオブジェクトが独自に持つ座標系だと考えられるのかも。
オブジェクトの持つx方向の基底ベクトルを(1,0,0)→(-1,0,0)に変えるイメージ?

これにはスプライトのX方向の拡大率を-1倍にすることで実現できる。
スクリプト上でスプライトの拡大率を変更する場合には、TransformコンポーネントのlocalScale変数の値を変更する。
localScale変数はオブジェクトが独自に持つ座標系だと考えられるのかも。
オブジェクトの持つx方向の基底ベクトルを(1,0,0)→(-1,0,0)に変えるイメージ?

◇アニメーション
Unity2Dゲームでキャラのアニメーションを作るにはパラパラマンガ方式が一般的。
ゲーム業界ではスプライトアニメーションと呼ばれている方式。少しずつ動きを変えたスプライトを用意して、一定間隔でそれを切り替える。
Unityでぱらぱらアニメを作るためには、アニメーションの作成と切り替えを一貫して行えるMechanimという仕組みを使う方法がある。
(ゲームの実行時にスクリプトで1コマずつイラストを差し替える方法もある。)

Mechanim:アニメーションの作成から実行までをUnityでエディタで一貫して操作できる機能。
・ゲーム設計時にパラパラアニメを作成し、各アニメーションの切り替えタイミングを指定しておく。
→ゲームプレイ時にMwchanimがオブジェクトの状態を判断して、自動的にアニメを切り替えて再生してくれる。
「スプライト」、「Animation Clip」、「Animator Controller」、「Animmatorコンポーネント」の4つの関係を理解する必要がある。

・スプライトとAnimation Clip
アニメ用のスプライトをまとめたものがAnimation Clip。
・Animation ClipとAnimator Controller
Animation ClipをまとめたものがAnimator Controller→どのタイミングでAnimation Clipを再生するかを指定する。
・Animator ControllerとAnimmatorコンポーネント
アニメにしたいオブジェクトが持つAnimatorコンポーネントにAnimator Controllerをセットすることで、Animator Controllerで定義したアニメを再生することが出来る。

◇physicsであたり判定

physicsを使ったあたり判定にはcollisionモード(衝突モード)とTriggerモード(すり抜けモード)の2種類がある。
前者は跳ね返りなど衝突応答も実行される。
後者は衝突の検出だけを行う。応答は実行されない。

ColliderにはIsTriggerと呼ばれる衝突の検出を行うかどうかを決めるダイアルボックスが存在する。2つのオブジェクトの衝突を検出する際、どちらか一方のIsTriggerにチェックが入っていれば、衝突の検出が可能。その際、両者のともにRigidbodyとColliderコンポーネントがアタッチされていなければならない。

また、両方のオブジェクトのIsTriggerをOnにすると、お互いがお互いをすり抜けてしまう。例えば、プレイヤーと足場の両方のIsTriggerをOnにしてしまうと、プレイヤーが足場をすり抜けて、落ちてしまう。これはIsTriggerが衝突検出は行うが、衝突応答を実行しないため、お互いがお互いをすり抜けあってしまうためである。

◇シーン間の遷移

Unityではタイトル画面、メニュー画面、ゲーム画面など、それぞれのゲーム場面をシーンという形で管理する。複数のシーンをつなぎ合わせ、1つのゲームを作成する。シーンを遷移させるには、遷移を行いたいタイミングで、そのシーンファイル名を指定するだけ。
スクリプトでシーンを遷移させるには、LoadScene(“MenuScene”)などと記入することで遷移させられる。

SceneManager.LoadScene(“シーン名”)でシーンの遷移が行われる。

今回はこんな感じで勉強しました。何やかんやで本通りのゲームを作ることが出来ました。ゲームオーバーなど、シーンの遷移はかなり勉強になりました。これがあると、ぐっとゲーム感がでて、完成した時はかなりうれしかったです。

このブログの記事は作業しながら書いているので、だんだんとメモっぽい書き方になってしまっていて申し訳ないですw

ただ、作業性を考えると、この書き方のほうが勉強しやすいので、このスタイルで今後は書いていこうと思います。

次の章からは3Dのゲームの作成に入るので、気合い入れて頑張りたいです。

最後までお付き合いくださりありがとうございました。それではまた。

Unity5の教科書4日目

どうも。みりんです。

実は3日目の内容に取り組んだ後、余裕が出来たので、5章に取り組みました。

学習内容

  • ゲーム作りの流れ
  • あたり判定
  • prefabとジェネレータスクリプト

◇ゲーム作りの流れ

5章では以下のような流れでゲーム作成をしました。大まかな流れは実際にゲームを自作する際も変わらないと思いますので、少しずつ慣れていきたいです。

プロジェクトの作成→プレイヤーの移動→矢の移動→あたり判定→工場の作成→監督の作成


・ GetKey関数:GetMouseButton関数に似た関数。引数を任意のボタン(画面上の矢印ボタンなど)にしておくことで、そのボタンの入力によっブール代数(trueなど)を返す。-up、-downも存在する。

矢印の動作はUnityのPhysicsコンポーネントを使うことで、重力計算などを行ってくれ、スプリクトを書かなくても、矢を下方向に移動させることが可能です。
しかし、デフォルメした動作など、独自の動作を組み込むことが難しくなるため、本のほうでは使用していませんでした。

Destroy関数:引数に渡したオブジェクトの破棄を行う関数。
gameObject変数:自分自身を指す変数。変数として「gameObject」を渡すと、オブジェクトとして自分自身を渡すこととなる。

◇あたり判定
あたり判定には、衝突を検知する部分(衝突判定)と衝突を検知した後の動きを決める部分(衝突応答)が存在し、両者をまとめてあたり判定と考えています。

・あたり判定のアルゴリズム
厳密なあたり判定はオブジェクトの輪郭線が接しているかを見ないといけないが、計算が膨大となる。
簡単なあたり判定として、オブジェクトの形状を単純に円形で近似する。
判定範囲を中心座標と半径を使ってあたり判定をする方法を考える。

あたり判定については、たしか、Unityではあたり判定の範囲をメッシュ?で決めることが出来た気がします。

というのも、1日目で紹介しているUbemyの無料Unity講座では、3Dのボールゲームを作成する際に、メッシュであたり判定を定義したような気がします。

衝突判定をする際には、メッシュで当たり判定の範囲を決定する方法もあると思いますので、その辺はもう少し勉強していきたいと思います。

magnitude : Vector2の持つメンバ変数。任意のベクトルの長さを求めることが出来る。 「ベクトル名.manitude」で長さを返す。

◇prefabとジェネレータスクリプト

prefab:インスタンスを量産する際の、インスタンスの設計図のこと。prefabをジェネレータスクリプトに渡すことで、prefab通りのインスタンスを量産してくれる。同じ物をいくつか作りたい場合にはprefabを使うことになる。

アウトレット接続:ジェネレータスクリプトにprefabを渡す際に便利な方法。具体的にはスクリプト内の変数に、オブジェクトの実態を代入(関連付け)できるようになる方法。

ジェネレータスクリプト内のprefabを表す変数にpublic指定市を付けて宣言しておく。→ヒエラルキービューのジェネレータスクリプトを選択すると、インスペクタ内にpublic宣言していた変数が表れているので、ここに目的のprefabをドラック&ドロップして代入。

Instantiate関数は「Object型」を返すが、受け取りたいのは「GameObject型」の場合、キャストと呼ばれる強制変換型変数を使って、無理やり目的の型に変換している。関数の後に as GameObjectと記載すれば、型を強制的にGameObjectに変えられる。

Prefabはかなり重要だと思うので、アウトレット接続も併せて覚えておきたいです。

あと、UIを制御するスクリプトも作成しました。基本的にはGetComponentで制御するUIを探して、スクリプトを書いていくって感じでした。

UI周り少し凝ったものを作成したりしたいので、少しずつ勉強して行きたいと思います。

そんな感じで、ゲームが完成しました。

今日は、6章からいけるところまでチャレンジしてみたいと思います。

でき次第投稿しようと思います。

ありがとうございました。それではまた。

Unity5の教科書3日目

どうも。みりんです。

今日は4章に取り組んだ内容について書いていこうかと思います。

今日の学習内容

  • クラスってなんだっけ?インスタンス?コンストラクタ?
  • UIの設計、UIの書き換えスクリプト


勉強を進めているうちに「クラスって何だっけ?」とか「インスタンス?コンストラクタ?なんだそれ?」ってなってしまいました。

基礎中の基礎であるし、2章でも学習しましたがまったく身についていないとおもったので、復習もかねていろいろ調べてみました。

◇クラスって何だっけ?

クラス:操作したいオブジェクトの設計図

正直、いまいちピンと来なかったので、自分なりに解釈してみると…

現実世界の「1つ1つのモノ」に当たるものが「オブジェクト」で、その「オブジェクトの属しているくくり」のことを「クラス」といった感じでしょうか?

例えば、「ドトールのコーヒー」をオブジェクトだとすると、「コーヒー」というくくりが「クラス」となる。また、「コーヒー」を定義する要素として、「苦み」や「キレ」、「産地」などが存在しますが、そういったものを「メンバ変数」や「メンバ関数」と呼ぶのだろうと解釈しました。

また、上記の「ドトールのコーヒー」というものを「コーヒー」クラスをもとに作成していた場合には、「ドトールのコーヒー」のことを「インスタンス」と呼ぶようです。コーヒーという設計図を使ってドトールのコーヒーを作るというイメージなのかもしれません。

このインスタンスを作る際には、インスタンスにクラスの持つ特徴 or 性質(メンバ変数、メンバ関数)を決めてあげる必要があります。「ドトールのコーヒー」を例にするなら、ドトールのコーヒーの持つ苦みやキレ、産地などがそれに当たりますかね?

コンストラクタはインスタンスを作成する際に呼び出される関数(メソッド)のようです。

では何をしてくれるかというと、インスタンス作る際に「インスタンスの初期化」をしてくれるものとのこと。

インスタンスを作りますよーと宣言した時に、「じゃあこのクラスのインスタンスなら、この要素とこの要素が必要だね!値を初期化しておくから、ここに適切な値を入れて、インスタンスを作ってね!」といったことをしてくれる?らしいです。

正直、ちゃんと理解できているか微妙です…w

◇UIの設計

UIはヒエラルキービューのCreate→UIから作成可能。4章ではTextを作成しました。UITextを作成するとヒエラルキービューにcanvasとEventsystemが追加されます。前者の子としてTextが作成されます。UI用の枠として役割を果たすためのオブジェクトとしてCanvasが作成されるってことなのかもしれません。

Eventsystemはユーザーの入力などをUIの部品へ中継するオブジェクトだそうです。入力割り当ての無効化、キーやマウスの設定変更が可能だそうです。

正直、まだよくわかりませんw

・UIの書き換えスクリプト

UIオブジェクトをスクリプトで使用するためには、UnityEngine.UIをインポートする必要があるので、UIを使用する際には忘れないようにしなければ!

シーン中からオブジェクトを探すには「Find関数」を使用します。

この関数はオブジェクトの名前を引数として、引数と同じ名前のものがゲームシーン中にあれば、そのオブジェクトを返してくれるようです。

Find関数を使うことで、ゲームオブジェクトの位置なんかを取得することが出来るという事ですね。

また、ゲームオブジェクトの座標をスクリプト上で取得する場合には、「ゲームオブジェクト名.transform.position」で取得できるようです。

ToString関数は数値を文字列に変換する関数で、引数には数値みを表示する際のフォーマットを指定することが出来るものだそうです。

代表的なフォーマットとして、D型とF型があるようで、Dは整数、Fは小数を表示する際に使うみたいです。

(表示したい数値).ToString(”Dx”)でxには表示したい桁数を入れるそうです。

DをFに書き換えると小数に対応できるようです。ただFの場合にはxは小数点以下の桁数を意味するそうで、(12.345).ToString(“F2”)→12.34となるそうです。

UIの書き換えスクリプトはゲームの監督としての役割を果たします。ただ、ゲーム上にこれに対応するオブジェクトは存在しません。こういったゲーム全体を管理するスクリプトは「空のオブジェクト」を作成し、これにスクリプトをアタッチすることで、監督としての役割を果たしてくれるそうです。

本書の中に「コンポーネント」が出てきたので、メモで残しておきたいと思います。

コンポーネントとは「ゲームオブジェクトの設定資料」だそうで、物理挙動をさせたいオブジェクトにはRigidbody、音を鳴らしたいときにはAudioSourceコンポーネントをアタッチすることで、そういった性質を持たせることが可能になります。

スクリプトで動作の制御を行ってきましたが、これもコンポーネントの1つという事になります。

スクリプト上によく出てきていたTransformコンポーネントはオブジェクトの動きに関する機能を提供するコンポーネントだそうです。

スクリプト上でこのコンポーネントにアクセスするためには、GetComponent関数を使う必要があるようです。例えば、GetComponent<Rigidbody>()などです。

Transformはよく使用するコンポーネントなので、関数化されているようです。

自分の作ったスクリプトコンポーネントにもアクセスすることが出来るらしく、GetComponentで呼び出した後、コンポーネント内の関数も使うことが出きるようです。

GetComponent<コンポーネント名>.関数名()といった形で使用できるようです。

何やかんやで、サンプルゲームが完成しました。

本当はリスタート機能を付けたいところです。

1日目の記事のほうに紹介したUnityちゃんのボールゲームではリスタート機能を実装しているので、それを参考に実装してみようかと思いました。

とりあえず、Unity5の教科書を進めることを優先しようと思うので、終わり次第やってみようと思います。

ここまで読んでくださり、ありがとうございました。

では、今日はこの辺で。

Unity5の教科書2日目

どうも。みりんです。

前回の投稿からだいぶ時間が経ってしまいました。

というのも、実家が引っ越しするにあたり、引っ越し作業を手伝っておりました。

もともと住んでいた家には18年住んでおり、思い出がいっぱいの家ですが、それに伴って荷物もいっぱいでした。

対して荷物もなければ療養に専念したり、こういったUnityの勉強をすることが出来たのですが、父子家庭なうえに一人では運べないような荷物も多かったので引っ越し作業を手伝っておりました。

やっと引っ越し作業も落ち着いたので現在は彼女の家に転がり込んで、こうしてUnityの勉強を再開しております。

それでは前振りはこの辺で今日の学習内容を振り返りたいと思います。

今日の学習内容

ゲーム設計のステップ

  1. 必要となるすべてのゲームオブジェクトの決定
  2. オブジェクトのコントローラスプリクトの決定
  3. オブジェクトを生成するジェネレータスプリクトの決定
  4. UIを更新する監督スプリクト
  5. スプリクト作成の流れ

ゲーム設計では上記の5つのステップが存在するそうです。3章では3,4以外の部分に取り組みました。1ではゲーム上に現れるすべてのオブジェクト(モノ)を決定すること、2ではそれらオブジェクトのうち、動作するものについては動作を制御するスクリプトを記述する必要があるため、その決定、5では2~4のスクリプトを実際に作成することを意味します。

今回作成したアプリでは外部入力を取り込むスクリプトとしてGetMousuButton関数が使われていたので、関数の特徴や種類について、下記のとおりまとめました。

  • GetMouseButton:マウスがクリックされている間ずっとtrueを返す。
  • GetMouseButtonDown:マウスがクリックされた瞬間trueを返す。
  • GetMouseButtonUp:マウスボタンが離された瞬間だけtrueを返す。

→引数:0→左クリック、1→右クリック、2→中ボタン

Unity上での動作をgifにしてみました。

減衰処理未実装
減衰処理実装後



こんな感じでアプリを作ることが出来ました。

アプリ完成後、「build and run」でスマホのほうに作成したアプリをインストールしようとしたのですが、うまくいかなかったので、動作までの方法をメモも兼ねて簡易的ではありますが、残しておこうと思います。

メモ:作成したアプリをインストールするまでの手順

現在、使用しているスマホはHuawei P20 Liteです。

Androidですので、スマホの設定から開発者向けオプションを使えるようにする必要があります。

開発者向けオプションは「設定」→「システム」→「端末情報」とすすみ、「端末情報」内の「ビルド番号」を複数回タッチすることで開放することが出来ます。

解放後、「システム」まで戻ると下から二つ目あたりに「開発者向けオプション」の項目が追加されます。これを解放することで作成したapkファイルを端末に移すことが出来るようになります。

「開発者向けオプション」内の「デバッグ」の「USBデバッグ」がONになっていなければONにしてください。

ただ、P20ではこの作業後も「build and run」で端末にアプリをインストールすることが出来ませんでした。

そもそも、PC上で端末を認識してくれず、インストールどころではなかったです。

調べてみると、Huaweiでは「HiSuite」なるソフトで端末を管理するらしく、これをPCにインストールする必要がありました。

インストール後、端末がHiSuite上で認識されると、PC上でも端末が認識されるようになりました。

この状態で「build and run」を実行してみましたが、Unityがフリーズしてしまい、結局インストールできませんでした。

仕方がないので、PC上にapkファイルを「build」してからapkファイルを端末に移動し、端末上でapkファイルをインストール&実行しました。

無事に動作確認できたので良かったですが、ちょっと面倒でした。

使用しているandroid端末によっては、このような作業が必要になるかもしれません。



スマホにインストールしたアプリ

何やかんやあって、インストールしたアプリは無事動作しました!

右の写真は端末上で動いてるアプリのスクショです。

これでひとまず、ゲーム作成→スマホに実装まで行うことが出来ました。

4章では3章で取り扱わなかったゲーム設計の3,4の項目に取り組みます。

ではまた!

Unity5の教科書1日目

どうも。みりんです。

現在、Unityを使ったゲーム開発の勉強をしており、勉強した内容の復習や気が付いたことのメモ代わりとして、このブログに残していこうと思っています。

勉強に使っている参考書は少し古いですが、

「Unity5の教科書 2D&3Dスマートフォンゲーム入門講座」

を使っております。

現在、UnityではUnity 2018.~が使われており、2世代ほど前のverの本です。

実は2年ほど前にUnityでゲーム開発をやろうと思い取り組んでいたものの、4章終了時点で勉強を中断してしまいました。(研究や就活等で忙しく、ひと段落ついてしまったので中断してしまった気がします。。。)

現行バージョンであるUnity.2018に対応したもの購入しようか迷いましたが、内容にあまり差異がなさそうだったので、すでに持っている本書に取り組んでおります。

学習初日の本日は1章は飛ばし、2章の終わりまで取り組みました。

「あれ?1章は?」と思われるかもしれませんが、以前4章まで取り組んでいたことと、2,3カ月前に「Ubemy」というサイトで無料のUnity講座を受けていたこともあり、1章の内容については不要かと思い飛ばしました。

「Ubemy」で受けたUnity講座は、Unity本家のチュートリアルに取り組み、最終的には実際に「球ころがしゲーム」を完成させるところまで解説してくれます。
講座は動画形式でユニティちゃんが進行役&先生としてわかりやすく解説してくれます。

動画だけで2時間くらいあり、動画を止めて自分の作業をすると、総学習時間は4~5時間くらい?だったと思います。まとまった時間が取れれば半日ほどで講座を終えられるので、Unityの基本的な操作からゲーム開発の一連の流れをサクッと学習するにはとても良く、Unityでゲーム開発するイメージを付けるにはとても良かったと思いました。

ただ、これだけでは基礎知識に不足が出そうだと思ったので、入門書に取り組んでいるというわけです。

UbemyのUnity講座のリンクを張っておくので、自分と同じようにUnityでゲーム開発したい or 始めたいと思っている方はぜひ視聴してみて下さい。

https://www.udemy.com/unity-chan-tutorial-01/

前振りが長くなってしまいましたが、以下が本日取り組んだ内容です。

今日の学習内容

Chapter2 C#スクリプトの基礎

学習内容:C#でスクリプトを記述するうえでの基礎知識

  1. スクリプトの作成とアタッチ
  2. スクリプトの具体的な内容

ざっくりこんな感じ。(ざっくりすぎか?w)

1については、Unity上のゲームオブジェクトにいろんな処理をしたいと思ってスクリプトを書いたら、そのスクリプトファイルをドラッグ&ドロップで目的のゲームオブジェクトにアタッチしないといけないよ。というお話。もう当たり前のことだと思うのですが、自分の性格的に忘れてしまいそうなので、自戒もこめて書きました。

2については、定番の Hello,World をコンソールウィンドウに表示させるところから始まり、変数の型や関数、制御文、クラスなどプログラミングをするうえで絶対知らなければいけない基礎中の基礎みたいなところに取り組みました。

一応、研究でプログラミング経験があるので言語の差はあれど、基本的な考え方みたいなところは一緒だと思ったので、割とすんなり理解できたと思います。

ただ、変数、関数の定義の仕方やクラスといった考え方は、自分の扱っていた言語とは文化が異なるなぁと思ったので、そこに慣れる意味で少し丁寧に取り組みました。

変数の型なんかはまだいいですが、関数の定義では引数と返り値のあるなしで記述が変わるので、その辺は気を付けてやらないといけない気がしました。

(mathematicaという言語?は一般的な言語とはかなり文化の違う言語なので、Cやjavaといったメジャーな言語を使用している方々から見ると、こんなこと当たり前のことを気にしているのは変に見えるかもしれませんw)

まぁ、文化の違いはありましたが、お作法的なものだと思うので慣れてしまえばなんてことはないだろうと思います。

次回は3章に取り組みますが、3章ではルーレットを作成してスマホに実装するところまで取り組むので、実装できた様子を写真で載せられたらいいなと思っています。

それでは、今日はこの辺で。