子ノ刻ラボラトリィ

子ノ刻[23:00-01:00]に右脳系ディベロッパが時々お送りするAndroidアプリ開発日誌。主にUnity。最近LINEスタンプ。時々雑記。

Ragdollを適用した後に適用前のオブジェクトが残ってしまう状態を解決してみた

こんばんは! しんがです。

だいぶ間が空いてしまいましたが、前回の課題を解決。
(キャラクターをタッチ(クリック)したらRagdollが適用されてぐったりする - 子ノ刻ラボラトリィ)

タッチして、Ragdollを生成して吹っ飛ばすところまではできました。
でも、生成元のオブジェクトが残っていました。

f:id:shinga0221:20130817005404p:plain

Unity Web Playerのサンプル
解決策はいたってシンプル。
生成元のオブジェクトを削除すればいいだけ。

Destroy(gameObject)

スクリプト内でDestroy(gameObject)とすることで、GameObjectを削除できます。

ソースはこんな感じ

void Update ()
{
	// タッチしたオブジェクトとこのゲームオブジェクトが等しい
	if (TouchManager.selectedGameObject == gameObject) {
		Debug.Log ("Enemy - OnMouseDown");

		// 初速をランダムで生成
		float x = Random.Range (-4.0f, 4.0f);
		float y = Random.Range (5.0f, 20.0f);
		float z = Random.Range (20.0f, 50.0f);
			
		// タッチしたオブジェクトを未設定にする
		TouchManager.selectedGameObject = null;

		// ラグドールを生成
		gameObject.GetComponent<RagdollGenerator>().Generate(transform, new Vector3 (x, y, z));
			
		// このオブジェクトを削除
		Destroy(gameObject);
	}
}

解決策事態は、前回の時点でわかってたんだけど、PCがなくて検証できずでした。

Ragdollイメージ

今までの実装をまとめるとこんな感じ。

f:id:shinga0221:20130817011625p:plain
Ragdollを適用するGameObjectからRagdollGeneratorを呼び出す
②RagdollGeneratorからRagdollを適用したGameObjectを生成する
Ragdollを適用するGameObjectをDestroyする

DestroyするときにDestroy(this)ってやりたくなるけど、それをやるとScriptそのものが消えるので注意(笑)

GameObjectとコンポーネントの関係についてはチュートリアルにも書いてあるけど、読んだ本にわかりやすい説明があった。

ゲームの作り方  Unityで覚える遊びのアルゴリズム

ゲームの作り方 Unityで覚える遊びのアルゴリズム

chapter.2あたりだったかな?

スクリプトにおいて

this → スクリプト自身
this.gameObject → スクリプトがアタッチしているGameObject
gameObject → this.gameObjectと同じ

みたいな感じ。

モデルやアニメーションなどのリソースに時間がかかりそうだなぁ…
AssetStoreつかってうまいことできないかなぁ。

まずは簡単なのでいいから一本作り上げたい。

なかなかゲームになりませんが、夜も更けてきたので今回はこの辺りで。
それでは、おやすみなさい。