Unity3d 入門の一覧

Unity3d 入門の記事の一覧です。
これで基本的なことはできるようになると思います。
1.まずは動かしてみよう
2.ゲームオブジェクト
3.コンポーネント
4.スクリプト
5.ボタン・キー入力
6.衝突判定
7.モデルインポート
8.関節
9.アニメーション


最後に、これらの知識・技術を使って作ったゲーム「マミさんぱっくんちょ」を宣伝しておきたいと思います。
こちらもよろしくお願いいたします。
https://market.android.com/details?id=com.hidetobara.unity.hello

Unity3d 入門 09 「アニメーション」

今回はアニメーションについて説明します。
アニメーションをつけることで、
オブジェクトに物理演算とは違ったさまざまな動きをさせることができます。

まず、下のように球を用意します。


続いて、メニューの Window > Animation を選びます。
そうすると、下のようなウインドウが開きます。
赤枠で囲まれた部分を押し、Create New Clip を選びます。
これで、新しいアニメーションのクリップを作成することができます。
ここでは、名前は act1 としました。

これによって、Transform などのコンポーネントが選択・編集できるようになりました。
試しに、Sphere > Transform > Position.y を編集したいと思います。
この Position.y の右[-]を押すと、Add Curves と現れるので選びます。
これで、Position.y を編集できるようになりました。
続いて、下の赤枠を右クリックすると、Add Keyframe と現れるので選びます。
これは編集するポイントを指定します。

この新しい Keyframe 上の Position.y の値を
ドラッグ&ドロップまたは、値の直接入力によって変更します。
ここで、下の赤枠で囲まれた再生ボタンを押してみましょう。
そうすると、Scene あるいは Game ビューのオブジェクトが
動いているのが確認できると思います。


同様に、別のコンポーネントも編集してみます。
ここでは、Sphere > Default-Diffuse (Material) > Color.r を編集しました。
時間が経つにつれ、r の値が減るようにしました。

ここで、球の Inspector を確認してみましょう。
下のように、アニメーションコンポーネントが追加されているのが分かります。

最後に、ゲームの実行ボタンを押すと・・、
球が動くと同時に色が変わっていくのが確認できると思います。

このように、アニメーションの設定もアニメーションウインドウを通して
直感的・簡単にできるようになっています。

Unity3d 入門 08 「関節」

今回はオブジェクトの関節について説明します。
オブジェクトが関節を持つことで、動きをより多彩にすることができます。

まず、オブジェクトを用意します。
メニュー GameObject > Create Other > Capsule からカプセルを3つ、
Sphere から球を1つ作ります。

説明のために、下から Capsule1, Capsule2, Capsule3, Sphere4 とします。
続いて、Capsule1 に Rigidbody コンポーネントを貼り付け、
Capsule2, Capsule3, Sphere4 に メニュー Component > Physics 内の Character Joint を貼り付けます。
関節にも色々なものがありますが、Character Joint が2軸関節で色々使い勝手が良いです。
この関節の設定はコンポーネントを貼るだけでは不十分で以下のように設定を行います。
1.親となる Rigidbody コンポーネントを持つオブジェクトを
Inspector 内の Character Joint > Connected Body 要素にドラッグします。
例えば、Capsule2 の Connected Body には、Capsule1 をドラッグします。

2.Anchor 要素では、回転軸の中心を指定します。
例えば、Capsule1 と Capsule2 との間に中心が来るように、Capsule2 の Anchor は (x,y,z)=(0,-1,0) に設定します。
下の図の赤枠で囲んだ、オレンジ・緑の軸がこの関節の回転軸です。

これを、Capsule3, Sphere4 にも同じように設定します。


さっそく、このオブジェクトを図のように傾けてみます。

そして、ゲームを実行します。
少しクネクネして床に落ちました。

本当に関節になっているのか分かりにくいですね?
では、Sphere4 の Rigidbody コンポーネントの Is Kinematic 要素にチェックを入れ、
再び、ゲームを実行します。
矢印の Sphere4 だけが固定された状態で、他のオブジェクトが揺れるようになり、床には落ちなくなりました。
確かに関節になってるのが分かります!

また、Capsule1 の Rigidbody コンポーネントの Is Kinematic 要素にチェックを入れ、
ゲームを実行します。
今度は、矢印の Capsule1 だけが固定された状態で、他のオブジェクトがフラフラするようになりました。


この Is Kinematic は何なのでしょうか?
これにチェックを入れることで、
そのオブジェクトだけ、重力などの外力を一時的に無効にすることができます。
では、これは何のために役に立つのでしょうか?
答えは、次回へと続く、アニメーションなどの設定する時に役に立ちます。
腕を振る、足を上げるなどの、アニメーションを実行している間、
Is Kinematic を有効にすることで外力を無効にします。
こうすることで、意図どおりのアニメーションを実行することができます。
一方、アニメーションが終われば、Is Kinematic を無効にすることで、
外力からの作用を受けるようにします。
このように、関節は様々なコンポーネントと合わせて使うことでより、
真価を発揮します。

Unity3d 入門 07 「モデルインポート」

今回はモデルのインポートについて説明します。
Unity3d はさまざま3Dモデルのインポートに対応しているようですが・・・、
インポートは癖がありなかなかうまくいかないことが多いです。
いろいろ試した結果、
私はメタセコイア上でモデルを編集し、
その後、FBXエクスポータープラグインで、
FBX 形式に変換し、Unity3d に取り込んでいます。
また、流行の MMD のモデルデータ PMD は
pmqimpMQプラグインを使って取り込んでいます。
インポートの仕方は、モデルファイルを Project ビュー上にドラッグすると完了です。
インポートが成功すると、Project ビュー上にモデルが表示されます。


続いて、
Project ビュー上のモデルを Scene ビュー上にドラッグすると、
モデルをゲーム上に配置できます。
Hierarchy 上にも配置したモデルが表示されます。


ここで、よく見ると Hierarchy 上の配置したモデル名が青くなっているのが分かります。
これは何でしょうか?
これは Prefab と呼ばれる特殊なオブジェクトです。
ゲーム内で、「同じモデル」を複数描写する場合、
モデルごとにデータを確保していてはメモリなどのリソースを無駄に使ってしまいます。
そこで、データは1つだけ確保し、あとは雛形のように使いまわすことができる prefab を使うことで、
リソースを効率よく使うことができます。
モデルをインポートした際は、自動で Prefab オブジェクトになっていますが、
自分で Prefab を作る際は、
Project ビュー内の Create > Prefab から空の Prefab を作ることができます。
そして、Prefab にしたいオブジェクトを Hierarchy ビューから、
ドラッグすることで Prefab を設定することができます。

Unity3d 入門 06 「衝突判定」

今回は衝突判定について説明します。
まず、ゲームオブジェクトのカメラ、光源、床、GUI Text、そして球を配置します。

さらに球には、コンポーネントの Rigidbodyと、新しいスクリプト NewBehaviourScript を貼り付けます。

NewBehaviourScript には以下のようなコードを書きます。

public class NewBehaviourScript : MonoBehaviour {
	void Start()
	{
	}
	void Update()
	{
	}
	void OnCollisionEnter(Collision collision)
	{
		GameObject gui = GameObject.Find("GUI Text");
		if(gui != null) gui.guiText.text = "Hit !";
	}
}

ではゲームを実行してみましょう。
球が床に着いた時に、Hit と表示されたでしょうか?


では、衝突するオブジェクトに応じて動作を変えたい時はどうするのでしょうか?
Collision クラスのプロパティの gameObject を使うことでできます。
この gameObject には衝突してきたオブジェクトのデータが入っており、
name やこれから説明する tag を使うことで動作の変更ができます。
ただ name を使うことで個別のオブジェクトの判定ができますが、
オブジェクトの数が増えてきた時、name の数もそれだけ増え管理が大変になります。
そこで、オブジェクトを一つのグループ化できる tag を使うことで楽に判定ができます。
tag の作り方・設定は次のように行います。
Inspector ビューから Tag > Add Tag を選択します。
空のエレメントに付けたい tag の名前を入れることで新しいタグができます。
ここでは、TestCollision としました。

続いて、球の Inspector ビュー内の tag で、新しくできた TestCollision を選択します。
これで、この球には TestCollision タグが付けられました!

続いて、NewBehaviourScript も以下のように編集します。
タグが TestCollision の時だけ、画面に Hit と出す、という処理になっています。

public class NewBehaviourScript : MonoBehaviour {
	void Start()
	{
	}
	void Update()
	{
	}
	void OnCollisionEnter(Collision collision)
	{
		if(collision.gameObject.tag != "TestCollision") return;
		GameObject gui = GameObject.Find("GUI Text");
		if(gui != null) gui.guiText.text = "Hit !";
	}
}

で、Hierarchy 上で球をいっぱい複製します。
ここでは球を2つ複製しました。

ゲームを実行しますと・・、
球が他の球に触れたときに、Hit と出るようになります!

Unity3d 入門 05 「ボタン・キー入力」

今回は、画面上のボタンやキーからの入力について説明します。
まず、カメラ・光源・床・GUI Text のオブジェクトを配置します。
続いて、コンポーネントスクリプト NewBehaviorScript を作り、
それを GUI Text に貼り付けます。


まず、ボタンを画面上に出してみましょう。
以下のようにスクリプトを編集します。

public class NewBehaviourScript : MonoBehaviour {
	void Start () {	
	}	
	void Update(){
	}
	void OnGUI(){
		if(GUI.Button(new Rect(50,100,50,50),"Click")) this.guiText.text = "Button is clicked !";
	}
}

引数の new Rect(50,100,50,50) では、ボタンを配置する場所(左、上)とボタンのサイズ(横、縦)を指定してます。
また、"Click" はボタンに表示する文字です。
さっそくゲームを実行してみます。
GUI Text」と表示されていたのが、ボタンを押すと「Button is clicked !」に変わります!


次は文字入力を表示してみましょう。

public class NewBehaviourScript : MonoBehaviour {
	void Start () {	
	}	
	void Update(){
	}
	void OnGUI(){
		if(GUI.Button(new Rect(50,100,50,50),"Click")) this.guiText.text = "Button is clicked !";
		this.guiText.text = GUI.TextField(new Rect(50,200,50,50),this.guiText.text);
	}
}

よく分からない仕様なのですが、
GUI.TextField の第2引数と返り値に渡す変数は同じでなければならない、
とのこのなので、これらには this.guiText.text を渡しています。
今後、改善されることを期待しましょう。
ゲームを実行し、文字を入力するとその文字が真ん中にも出てくるようになりました!


続いてキー入力です。
以下のようにスクリプトを編集します。

public class NewBehaviourScript : MonoBehaviour {
	void Start () {	
	}	
	void Update(){
		if(Input.anyKeyDown) this.guiText.text = "Any key is down !";
	}
}

ゲームを実行し、何かキーを押すと、
GUI Text」から「Any key is down !」へと文字表示が変わります。

また、特定のキーにだけ対応したいならば以下のようにします。

if (Input.GetKeyDown(KeyCode.Space)) this.guiText.text = "Space !";

この場合は、スペースキーを押した場合のみ文字表示が変わります。