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章終了後、どういったことに取り組めばいいのかを少し調べながら考えております。
もしこの投稿を見られた方で、こんなことに取り組めばいいよというのがありましたら、ぜひコメントに残していただけると幸いです。

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です