制作中の勘違いというかもう二度とそんなことないでしょうけど、一応書いておこうと思います。僕みたいな勘違いを起こす人が全くいないとも言い切れないので。
まず基本ですが、ゲームオブジェクト(やコンポーネント)を削除する方法として、Destroyメソッドがあります。
よく見かけるコードで
1 |
Destroy(gameObject); |
と書いてゲームオブジェクトを削除します。
で、僕はみんなでゲーム制作をする前にサンプルコードやらでこの書き方を見て、実際の制作でも使うようになりました。
で、作ったゲームは吹っ飛びが一つのポイントです。
そうなるとどうやって弾にあたった瞬間敵を消すんじゃなくて、敵が倒れてから消せばいいんだ?という疑問が。
そこで僕は思いつきました。
当たった瞬間にフラグを立ててUpdate関数内で時間を測る!そして時間が来たらDestroyすりゃいいんだ!そしたら倒れきった後にちょっとしたら削除できるじゃん!名案!(まだ突っ込まないでねw)
で書きました。コード。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using UnityEngine; using System.Collections; public class DestroyManager : MonoBehaviour { protected bool onDestroy = false; protected float destroyCount = 0.0f; protected float destroyTime = 10.0f; void Update() { if (onDestroy) { destroyCount += Time.deltaTime; if (destroyCount >= destroyTime) { Destroy(gameObject); } } } void OnCollisionEnter(Collision collision) { onDestroy = true; } } |
1.衝突したらOnCollisionEnterメソッドが実行されonDestroyフラグがtrueに。
2.onDestroyがtrueになったのでUpdate関数内のdestroyCountの時間をTime.deltaTime分加算しつづける。
3.destroyCountがdestroyTime(今回は10秒)を上回ったら、そのゲームオブジェクトが削除される。
(UpdateやTime.deltaTimeが???な方は書籍『Unity入門』 – Unity におけるフレームと Updateを見ると分かりやすいです)
処理としてはこんな感じです。コレを敵に実装したわけです。
書いた時は思いました。
「してやったり(キリッ」
でも思うわけです。実装の回数も増えて作業を重ねてDestroyを何度も使ううちに。
おかしい、と。
毎回こんなこと書くのか?変数作って秒数数えてってコードを時間差が必要な時は毎回?
で調べました。
Unity – オブジェクトの削除 – ActionScript入門Wiki
「第二引数にfloat型の秒数を入れると、その秒数後にオブジェクトが削除されます。」
・・・
・・・・・
・・・・・・・
・・・・・・・・・第二引数・・・・・だと・・・?!
チーン・・・・・なんと無駄な事を・・・・・
最初に見たコードを鵜呑みにしてしばらく気付かなかったなんて・・・・
リファレンスにも載ってましたよ・・・当然orz
Object.Destroy
つまりさっきのコードは
1 2 3 4 5 6 7 8 9 10 |
using UnityEngine; using System.Collections; public class DestroyManager : MonoBehaviour { void OnCollisionEnter(Collision collision) { Destroy(gameObject,10); } } |
だけで良かったという・・・・
後削除までの時間をUnity Editor上でいじくりたい時は、
「public float destroyTime = 10.0f;」みたいな感じでpublicな変数として宣言しておくといいと思います。この場合10.0fはデフォルト値になります。
しかし思い込みって怖いなーっていうね・・・
新しい関数や変数が出てきたら必ずリファレンス見ましょうっていうお話でした。あー恥ずかしい・・・
コメント
No Trackbacks.