UnityでGameObjectのPrefab化、動的インスタンス生成&物理演算エンジンRigidbodyを使う基本:ゲーム開発初心者のためのUnity入門(12)(6/6 ページ)
Unityで3Dゲームを作るまでのいろいろな処理を解説する連載。今回は、引数で指定したゲームオブジェクトのインスタンスを作成する「Instantiate」関数や、物理演算エンジンRigidbodyの基本的な使い方を解説する【Windows 10、Unity 5.4に対応。C#のコードを追加】。
3DキャラクターがCubeを蹴散らすスクリプトを記述する
次に、3DキャラクターがCubeを蹴散らすスクリプトを書いていく。Hierarchyから「UnityMan」を選択し、表示される「Add Component」から「New Script」を選択する。
「Name」に「CharacterAction」と指定し、「Language」に「C Sharp」を指定して、「Create and Add」をクリックする。Inspector内に「Character Action Script」が追加されるので、「Script」の「CharacterAction」をダブルクリックして、Visual Studioを起動する。
起動したVisual Studioのエディター内にリスト2のコードを記述する。
void OnControllerColliderHit(ControllerColliderHit hit) { checkItem(hit.collider.gameObject); } void checkItem(GameObject obj) { Animator anim = GetComponent<Animator>(); if(obj.name=="Cube(Clone)") { anim.SetBool("is_kicking", true); } AnimatorStateInfo state = anim.GetCurrentAnimatorStateInfo(0); if(state.IsName("Locomotion.SpinKick")) { anim.SetBool("is_kicking", false); obj.GetComponent<Rigidbody>().AddForce(Vector3.forward * 100, ForceMode.Force); } }
当たり判定をする「OnControllerColliderHit」関数
1行目の「OnControllerColliderHit」はゲームオブジェクトで当たり判定をする関数だ。引数に「ControllerColliderHit hit」と指定すると、「hit」に接触情報が渡される。この関数の中で接触情報を引数として、6〜19行目の「checkItem」関数を実行する(3行目)。
無数に作成されたCubeを蹴ったときのスクリプト
checkItem関数内では、まずGetComponent関数でAnimatorコンポーネントを取得し、変数「anim」で参照する(8行目)。
「obj」の「name」が「Cube(Clone)」であった場合は(9行目)、animのSetBool関数で「is_kicking」の値を「true」にしている(11行目)。「スペース」キーでCubeを自動生成した場合、図26のようにHierarchy内に「Cube(Clone)」が無数に作成される。この作成される「Cube(Clone)」に接触しているのだ。
11行目の「is_kicking」のAnimatorでの設定は、図24、図25で行っている。
初期化をしておく
13行目では、ステートの情報を取得し、変数「state」で参照する。「Locomotion.SpinKick」ステートになれば(14行目)、「is_kicking」パラメーターは使用しないので、次の「SpinKick」のために元の状態に戻す(16行目)。「is_kicking」の値を「false」で初期化している。
物理的な力をオブジェクトに与える「GetComponent<Rigidbody>().AddForce」関数
17行目のobj.GetComponent<Rigidbody>().AddForce関数で物理的な力をオブジェクトに与えて、指定した方向にオブジェクトを動かす。
前方のベクトルを表す「Vector3.forward」
17行目の「Vector3.forward」は実際には(0,0,1)のベクトルになっていて、Z軸の値が「1」の前方を表している。力を考慮したい場合は、任意の数値を掛け算すると力が働いて加速する。今回は「100」を掛け算している。
継続的な力を追加する「ForceMode.Force」
17行目の「ForceMode.Force」は、オブジェクトの質量を使用してRigidbodyに継続的な力を追加している。
なお瞬時の衝撃力を追加するには、「ForceMode.Impulse」を使用する。しかし、これを使用すると、UnityManがCubeに触れた瞬間、キックする間もなく、Cubeが跳ね飛ばされて都合が悪いので、使い方には注意が必要だ。
JavaScriptのコード
JavaScriptのコードも記載しておく、コードの解説はC#と同じだ。
function OnControllerColliderHit(hit:ControllerColliderHit) { checkItem(hit.collider.gameObject); } function checkItem(obj:GameObject) { var anim=GetComponent(Animator); if(obj.name=="Cube(Clone)") { anim.SetBool("is_kicking",true); } var state:AnimatorStateInfo=anim.GetCurrentAnimatorStateInfo(0); if (state.IsName("Locomotion.Kick")){ anim.SetBool("is_kicking",false); obj.GetComponent(Rigidbody).AddForce(Vector3.forward * 100, ForceMode.Force); } }
Planeの床にpsdファイルのテクスチャを適用して保存・実行
最後に、床が白のままでは、面白味がないので、Planeにテクスチャを適用しよう。Projectの「Locomotion Setup」→「Locomotion」→「Textures」にある、「tileConcreteFlooring var01 DFF.psd」をPlane上にドラッグ&ドロップする(図27)。
これで完成だ。Unityメニューの「File」→「Save Scene」で上書き保存しておこう。実行すると、動画5のような動作になるはずだ。
次回は、無数のゲームオブジェクトを管理しやすいようにタグ付け
今回はこれで終わりだ。今回無数のゲームオブジェクトを動的に作成したが、本格的なゲームを作成する場合は、最初から(静的に)複数の3Dキャラクターやゲームオブジェクトを用意することになるだろう。その場合は、無数のゲームオブジェクトに「タグ」付けすると管理しやすくなる。次回は、その方法を紹介するので、お楽しみに。
参考文献
- 『Unity4入門 最新開発環境による簡単3Dゲーム制作』(SBクリエイティブ刊)
■更新履歴
【2017/2/6】Windows 10、Unity 5.4に対応しました。C#のスクリプトを追加しました。
著者プロフィール
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Gear VRとは――UnityでAndroidアプリを開発するための環境構築
HMDの中でも比較的扱いやすいGear VRで体験できるVR/ARコンテンツをUnityで開発する方法を紹介する連載。初回は、Unityや、Androidアプリを開発するのに必要なAndroid Studioをインストールして、Gear VRコンテンツの開発環境を構築する。 - HoloLens用Unity 5のプロジェクトをUWPとして書き出しエミュレータで動かす
拡張現実(AR)用ヘッドマウントディスプレイ「HoloLens」のエミュレーターを使ってHoloLens用アプリの作り方を解説する本連載。今回は、HoloLens用Unity 5で簡単なUnityプロジェクトを作成し、それをUWPに書き出してHoloLens Emulatorに配置する方法について。 - UnityでWebカメラの画像をリアルタイムで複数テクスチャとして表示する&Kinectセンサーと連動させる
ゲーム開発環境Unity 5の「Personal Edition」では、Unity 4.6以前では有料だった機能が無料で使えるようになった。本連載では、Unity 5で無料になった機能の使い方について解説していく。初回はWebカメラと、「Kinect for Windows v2」を使ったサンプルを紹介する。