【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう！その６【基礎】【完結】

## 目次
【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう！
[その１](http://qiita.com/kuuki_yomenaio/items/07a3214eb518c21a10b1)
[その２](http://qiita.com/kuuki_yomenaio/items/0b0cac2846a4ffef514d)
[その３](http://qiita.com/kuuki_yomenaio/items/f9be3083afc19fb0f86c)
[その４](http://qiita.com/kuuki_yomenaio/items/33cc2d234f3394bd0eab)
[その５](http://qiita.com/kuuki_yomenaio/items/95f54a7404d71c80cbaf)
[その６(完結)](http://qiita.com/kuuki_yomenaio/items/03ed5212de0a93f0de13)

## ボールの作成
[前回](http://qiita.com/kuuki_yomenaio/items/95f54a7404d71c80cbaf)でゲームステージの作成が完了しました。今回はキャラクターが蹴るためのボールを作成します。

GameObject→Create Other→Sphereを押下し、Sphereを追加します。

![スクリーンショット 2014-04-01 20.50.28.png](https://qiita-image-store.s3.amazonaws.com/0/26453/39950204-5dbe-2edc-1675-f02c82faed58.png)

追加したら、キャラクターより少し前に置きたいので、
名前をBall
position x:0 y:1 z:-5
に設定してください。

そして物理演算したいので、AddComponent→Physics→Rigidbodyを追加しておきます。
そして、以下のように設定します。
Mass : 10
Use Gravity : false
IsKinematic : false

![スクリーンショット 2014-04-01 21.13.08.png](https://qiita-image-store.s3.amazonaws.com/0/26453/84c959f2-4d77-092c-769a-25ffbfb9fe13.png)

massは質量の事です。
飛ばした時にcubeより軽いと弾かれてしまうので、
重めに設定しています。

合わせてgontaも移動させておきましょう。
position  x : 0 , y : 0 , z : -10
にしましょう。

## 蹴っ飛ばすスクリプトを作成

そして、キャラクターが触れたらボールが飛ぶようにスクリプトを作成します。Create→C# ScriptでBallSetupという名前にしてください。

```csharp:BallSetup.cs
using UnityEngine;
using System.Collections;

public class BallSetup : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	void OnTriggerEnter(Collider col){
		Vector3 pos = col.transform.forward;
		Vector3 newVector = (pos).normalized;
		rigidbody.velocity = newVector * 30;
	}
}

```




OnTriggerEnter
これは物体同士衝突した時に一度だけ呼ばれるメソッドです。
ボールとプレイヤーが触れたらボールを飛ばしたいのでここに処理を記述します。

引数で渡ってくるcolliderは当たったゲームオブジェクトそのものです。
transform.forwardはgontaが向いている向きです。
その方向を取得し、ぶっ飛び係数(ここでは30)を掛けてvelocityにその方向を加えて飛ばします。

このスクリプトが出来たらballにD&Dして追加して、実行！

![スクリーンショット 2014-04-01 21.16.54.png](https://qiita-image-store.s3.amazonaws.com/0/26453/1f3e6fc7-fd60-e667-aafc-b8b7f734c375.png)


動きませんね。
ボールに触れたはずなのに、障害物のように横をするーっと滑って通り過ぎてしまいました。

実はOnTriggerEnterのイベントを発行するためにはColliderのIsTriggerフラグをONにしなければなりません。

![スクリーンショット 2014-04-01 21.20.19.png](https://qiita-image-store.s3.amazonaws.com/0/26453/fe2feb34-4735-fb24-3eab-4b29a784ef3c.png)

ということはballのisTriggerをONにしてあげれば動くはずです！
早速ONにして実行！きたー！！！！

![スクリーンショット 2014-04-01 21.23.03.png](https://qiita-image-store.s3.amazonaws.com/0/26453/fe340245-a95e-cb28-cd44-3a93bc9108c2.png)

(遠くに小さく見える白い丸がボールです）
(よく見えるようにSmoothFollowのLook At Angleを45に設定しています)

あれ？

ボールは飛んだ！蹴った！だけど、cubeの山をすり抜けてしまいました。
理想としては、蹴ったボールの勢いでcubeの山が貫かれ、吹き飛びながら崩れ落ちるような動きを
してほしいです。

## なんですり抜けたのか？

理由は先ほどのIsTriggerにあります。
このIsTriggerフラグをONにすると、イベントの判定を行うが、物理エンジンの影響を受けなくなるのです。

[Sphere Collider](http://docs-jp.unity3d.com/Documentation/Components/class-SphereCollider.html)

よって、ちょっとスクリプトを修正します。

```csharp:BallSetup.cs
using UnityEngine;
using System.Collections;

public class BallSetup : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	void OnTriggerEnter(Collider col){
		Vector3 pos = col.transform.forward;
		Vector3 newVector = (pos).normalized;
		rigidbody.velocity = newVector * 30;
		this.collider.isTrigger = false;
	}
}

```


飛ばす瞬間にIsTriggerをOFFにするだけなんですけども。

実行しましょう…。蹴った！ぶっ飛びました！！！！

![スクリーンショット 2014-04-01 21.35.17.png](https://qiita-image-store.s3.amazonaws.com/0/26453/874c7eb1-98e1-b8d3-c15b-990e53264c50.png)


気持ちいいですね！
ついにMMDモデルを動かし、ボールを蹴って、物体を壊す事が出来ました！

# 最後に
随分と長くなってしまいましたが、
MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう！
はここで一旦完結と致します。

さらにゲームらしくするとしたら
・壊すcubeの山を家や城に見立てたものに変えたりしてみる
・音を追加する
・パーティクルを使いさらに派手な演出を追加してみる
・Materialで物質のリアリティを高める
などなどが考えられますが、
キリが無いので一旦ここまでとさせて下さい。

MMDの追加の仕方だけ、
ステージをスクリプトで作る部分だけ、
Animatorの使い方だけ、

など部分部分だけでもいいので、これからUnityをやろう！と
思っている人の参考になれば幸いです。

初めてUnityの記事を書いてみましたが、これは大変…。
次はtips的なちょっとしたことにしよう。そうしよう。