Unity5の教科書7日目

今日の学習内容

  • ライト(光源)の種類
  • Raycast関数の使い方
  • Tagを使ったオブジェクトの識別
  • 効果音を鳴らすタイミングと鳴らす音源の指定
  • レベルデザイン

◇ライト(光源)の種類

  • Directional Light:無限遠から平行に光を放つ。距離に依存して光の強さが変化しない。
  • Point Light:光源から全方位に光を放つ。距離に依存して光の強さが減衰する。
  • Spot Light:特定方向に光を放つ。光の強度が距離に依存して減衰。

◇Raycast関数の使い方

Physics.Raycast関数:ある地点からRay(光線)を飛ばして、飛ばしたRayの先にコライダーがあるのかを検出する関数。銃弾やレーザービームなどのあたり判定に使ったりする。

関数の詳細は以下の通り

Raycast (Vector3originVector3direction, float maxDistance= Mathf.Infinity, int layerMask= DefaultRaycastLayers,QueryTriggerInteractionqueryTriggerInteraction= QueryTriggerInteraction.UseGlobal);

<Rayがヒットしたコライダーの位置を検出するスクリプト>

引用:Unityスクリプトリファレンス RaycastHit.point
https://docs.unity3d.com/ja/2017.4/ScriptReference/RaycastHit-point.html

ここで使われているRaycastHit変数はコライダの衝突に基づいて情報を格納します。
どういうことかというと、Raycast関数で見えない線を飛ばし、その先にあるオブジェクトのコライダーにその線がぶつかったら、そのオブジェクトの情報が入ることになります。
10行目の引数hitの前にoutとありますが、これは「outに続く変数(ここではhit)に関数の中で取得した値を入れて返してくれ」という意味があるそうです。
つまり、上述の見えない線がぶつかったらhitにオブジェクトの情報を格納してくれということを意味していることになります。
Raycast関数の引数には線の原点と線を放つ方向を指定する必要がありますが、Ray変数を使うことで、この原点と方向を同時に指定することが出来ます。

◇Tagを使ったオブジェクトの識別

Unityではオブジェクトそれぞれに特定の名前(タグ)を付けることが出来、スクリプトからもそのタグを使ってオブジェクトの判断をできます。
ScreenPointToRayを使う際、メインカメラのタグがUnTaggedになっていることが原因でScreenPointToRayが機能しないといったエラーがありました。
こういった具合にタグ付けされているオブジェクトを参照したいのに、オブジェクトがタグ付けされておらず、エラーがでるなんてこともあるので、全オブジェクトが正しくタグ付けされているのかは注意しないといけないですね。

タグの作成はEdit→ProjectSetting→Tags and Layersを選択。Tagsを展開し。+をクリックでタグの作成ができる。その後、作成したタグをタグ付けしたいオブジェクトの インスペクタ―ビュー内から選択することで、タグ付けできる。

◇効果音を鳴らすタイミングと鳴らす音源の指定

オブジェクトから音を鳴らしたい場合にはAudio Sourceコンポーネントをアタッチし使用するが、Audio Sourceコンポーネントに登録できる音源は1つしかない。
状況に応じて音源を鳴らし分けたい場合には、スクリプトから音源を指定する必要がある。
public変数としてAudio Source型の変数を定義して、スクリプトのコンポーネントから任意の音源を取り出せるようにすると、鳴らしわけが可能。

memo
RandomクラスのRange関数
→Range(a, b)でa以上、b未満の整数をランダムに返す。ある範囲内のランダムな整数を使いたいときに便利。

◇レベルデザイン

ゲームオブジェクトの生成を行う際には、生成に関する様々なパラメータを使用することになる。これらのパラメータは値を変えることで、ゲームの難易度を変えることが可能だ。
レベルデザインとは、これらのパラメータを調整して、ゲーム中の面白さを継続するように設定することである。
面白さを継続させるには、ゲームの進行に応じて難しさに変換を付ける「レベルデザイン」が必要である。

はまっている状態を「フロー状態」と呼び、プレイヤの能力と挑戦内容の難易度が釣り合っていると、フロー状態になるとのこと。
フロー状態を作り出すためには、ユーザーにとって最適な難易度の設定が重要となる。

難易度にかかわるパラメータは一括で変更することが出来たほうが都合がよい場合が多いので、それらパラメータをひとくくりにしたpublicの関数を作成しておくと便利である。

そんなこんなで、8完成したゲームがこちら。

ついに「Unity5の教科書」終了しました!
日数としては1日1章なので1週間ですが、間を挟んでしまったりたので、2、3週間かかってしまいました。
次にやる本は「UnityではしめるC#」に取り組もうと思います。
選定理由は、評判が良く、この本の次作が「Unityの寺子屋」という本らしいのですが、次作ではサンプルが収益化しやすいジャンルのゲームで、作ったアプリの収益化をする方法なども載っているので、自分の目指したい方向と合致していると思ったからです。

最終的には大規模な3Dゲームだったりを作りたいとも思っていますが、まだまだ先は長そうなので、目先の目標としてアプリとしてリリースしやすいジャンルに挑戦したいと思います。

UnityではじめるC#はもっとサクサク進んで行きたいと思います。
(できるだろうか…w)

ここまで読んでくださってありがとうございました。
それではこの辺で。

Unity5の教科書6日目

今日の学習内容

  • 3Dゲームの作り方
  • Terrainを使った地形の作成
  • タップした場所にオブジェクトを飛ばす

◇3Dゲームの作り方

ほぼ2Dゲームと同じ。座標系が3次元になっているだけ。オブジェクトを配置する際、画面をくるくる回し

ながら作業をするため、自分がどこを向いているのか見失いがちになるので、画面右上のシーンギズモを

見ながら、自分の方向を確認する。

◇Terrainを使った地形の作成

・Terrain:Unityに用意されている地形オブジェクト。山や川などの地形をペイント感覚で作成可能。テ

クスチャも作成でき、草や木などもの地面を塗るだけで塗った場所にはやすことが出来る。
・Terrainで地形の作る
起伏などは、作成したTerrainのインスペクタから、Raise/Lower Terrainボタンを選択し、その状態で起

伏を付けたい部分をドラッグするとドラッグした部分が隆起する。シフトを押しながらドラッグすると隆

起させた部分を沈み込ませることが可能。

・Terrainにテクスチャをペイント
テクスチャはテクスチャ柄のブラシを使って地形を塗るイメージで配置できる。
テクスチャはEnvironment Packageをプロジェクトにインポートすることで使用可能になる。
ツールバーのAssets→ImportPackage→Environmentを選択すると、Importing Unity Packageウィンドが表示されるので、好きなテクスチャや3Dモデルを選択しImportする。

※自分の場合はImportPackageの後の選択肢が、Custom Packageのみでした。
どうやら、現在自分が使用しているVer(2018 2.18f)ではStanderd AssetsというAssetをAsset StoreからダウンロードしてImportする必要があるようです。

Import方法:シーンビューにAsset Storeのタブがあるので、そこからStanderd Assetsと検索すると、Topに目的のAssetが出てくるのでクリック→ダウンロード→インポートと進めて、使用可能になります。

Asset StoreのStandard Assetsのページ。画像はダウンロード後のため、Importと表示されている。

TerrainのペイントからEdit Textureを選択すると、Import前にはなかったテクスチャが表示され、使えるようになっているはずです。

Import後

ただ、この方法ですと、この本のように使いたいテクスチャだけインポートするということが出来ないので、少し不便かもしれません。試せていないので可能なのかは不明ですが、本のとおり、Import PackageからインポートしたいアセットだけImportするには、Standard Assetsの拡張子をunitypackageにする必要があります。
上記のAssetのダウンロードを行うと、プロジェクトビュー内にダウンロードしたStandard Assetsのフォルダが出来ているかと思います。
おそらく、このフォルダの拡張子をunitypackageにすることが出来れば、本の通り、目的のアセットのみインポートすることが出来るようになるのかと思います。
ですので、Export PackageでStandard AssetsフォルダをStandard Assets.unitypackageとしてエクスポートすれば、ImportPackageから本通りにインポートすることが出来るかもしれません。
もし、ImportPackageにStandard Assetsが表示されていなくても、Custam PackageからImportできるのではないかと思います。
一応、Standard Assetsフォルダの拡張子をunitypackagに変えることはできたので、おそらくできると思います。

・OnCollisionEnter関数:Physicsを使ったオブジェクトの衝突時に呼び出される関数。
isKinematic:OnCollisionEnter関数内のbool型のメンバ変数。この値をtrueにするとオブジェクトの動きが停止、falseでオブジェクトが動く。

◇パーティクル:Unityではパーティクルをコンポーネントとして用意されているため、パラメータをエディタで簡単にいじることが出来る。
パーティクルを表示するにはオブジェクトにparticleSystemコンポーネントをアタッチ。
ParticleSystemのパラメータを調整して、エフェクトを作成。
スクリプトでパーティクルの再生を指定。

◇タップした場所にオブジェクトを飛ばす

タップした場所にオブジェクトを飛ばすには、タップした場所をInput.mousePosition関数で取得可能であるが、3Dではその値をそのまま使うことはできない。
これは、mousepositionの値が、スクリーン座標系の値であるからである。
スクリーン上の座標はゲーム画面上の座標を表すときに使う2Dの座標系である。実際のオブジェクトは3Dのワールド座標系であるため、スクリーン上の座標をワールド座標系に変換する必要がある。
UnityにはScreenPointToRayという関数が用意されている。これは、スクリーン上の座標を渡すと、「カメラ」から「スクリーン座標」に向かうワールド座標系でのベクトルを取得することが出来る関数である。

これを使うことで、カメラからタップ地点に向かうベクトルを計算することが可能になる。

※本のほうでは、
Ray ray = GameCamera.ScreenPointToRay(Input.mousePosition);
と記述していましたが、この部分でエラーが発生。
エラー分は以下の通り
NullReferenceException: Object reference not set to an instance of an object
igaguriGene.Update () (at Assets/igaguriGene.cs:21)

修正前

いろいろと調べてみると、MainCameraのオブジェクトをシーン上から探せていないらしいことが判明。
原因は、MainCameraのインスペクタ―画面中の「Tag」が「Untagged」なっているためらしい。これを「MainCamera」に選択すると、シーン中からMainCamaraを認識できるようになり、エラーも出なくなりました。

修正後

昔のバージョンではデフォルトでシーン中のMainCameraのTagはMainCameraだったようなのですが、2018.2からはデフォルトがUntaggedになってしまったようです。
ver2018.2以降でScreenPointToRay関数を使う場合はこの点は注意だと思います。
(このエラーを直すのに結構時間取られました…)

なんとか完成したゲームがこちら。

よくわからないですが、なぜかパーティクルがピンクになっていますw
(本来は白い光の粒のようなものになるらしい…)

今回は少し忙しかったのと、テクスチャのインポートやエラーの修正に時間を取られてしまい、予定よりも更新が遅くなってしまいました。
毎日投稿できればよいのですが、そうもいかないと思いますので、やめてしまわない程度にほどほどに更新していこうと思います。
いよいよ次はラストの8章です。
8章終了後、どういったことに取り組めばいいのかを少し調べながら考えております。
もしこの投稿を見られた方で、こんなことに取り組めばいいよというのがありましたら、ぜひコメントに残していただけると幸いです。

では、今日はこの辺で。
ありがとうございました。

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章ではルーレットを作成してスマホに実装するところまで取り組むので、実装できた様子を写真で載せられたらいいなと思っています。

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