Unity2D入門 スクロールアクションゲームを作る ダメージを受けると点滅し、1秒間無敵な処理を作る
さてさて、だんだん一筋縄では行かない処理にはいってきました。
前回せっかくダメージを受けるようになったのですが、ただ突進して
ダメージゲージが減っていくという処理でした。
これだと当たった際にガンガンHPが削られて、即死というスペランカーも真っ青なゲームになってしまうので、そこはダメージを受けたら1秒間無敵!という感じにしたいのです。
今回の処理のフロー
- ダメージを受ける(前回つくりましたdamage.cs)
- 向いている方向とは逆に飛ばせる
- ダメージを受けたら1秒間[on_damage]フラグを立てる
- [on_damage]フラグが立っている間は点滅&ダメージを受けないようにする
というもの
とりあえず全部damage.csに書くので前回までのcsが必要です。
Unity2D入門 スクロールアクションゲームを作る ダメージを受けるとHPゲージが減る処理 - とあるプログラマの備忘録
スクリプト全文
damage.cs
using UnityEngine; using System.Collections; public class damage : MonoBehaviour { public GameObject hpbar; public bool on_damage = false; //ダメージフラグ private SpriteRenderer renderer; // Use this for initialization void Start () { //点滅処理の為に呼び出しておく renderer = gameObject.GetComponent<SpriteRenderer>(); } // Update is called once per frame void Update () { // ダメージフラグがtrueで有れば点滅させる if(on_damage){ float level = Mathf.Abs(Mathf.Sin(Time.time * 10)); renderer.color = new Color(1f,1f,1f,level); } } // 敵とぶつかった際の処理 void OnCollisionEnter2D(Collision2D col){ // 敵とぶつかったかつダメージフラグがfalse if(!on_damage && col.gameObject.tag == "mob"){ hpbar.gameObject.SendMessage("onDamage", 10); OnDamageEffect(); } } // ダメージを受けた際の動き void OnDamageEffect() { // ダメージフラグON on_damage = true; // プレイヤーの位置を後ろに飛ばす float s = 100f * Time.deltaTime; transform.Translate(Vector3.up * s); // プレイヤーのlocalScaleでどちらを向いているのかを判定 if(transform.localScale.x >= 0){ transform.Translate(Vector3.left * s); }else{ transform.Translate(Vector3.right * s); } // コルーチン開始 StartCoroutine("WaitForIt"); } IEnumerator WaitForIt() { // 1秒間処理を止める yield return new WaitForSeconds(1); // 1秒後ダメージフラグをfalseにして点滅を戻す on_damage = false; renderer.color = new Color(1f,1f,1f,1f); } }
わかりやすいように日本語でコメント書いたんですけど、Unityの通常のエディタだと日本語使えないので
もしも挙動に不具合が出た場合は消してください。
さぁエミュレートしてみましょう!
んん!見づらいぞ!一応これでも点滅しているのです。 またフラグが立っている間は敵にぶつかってもダメージ処理に入らないので無敵です。
なかなかてこずらせてくれましたがこれにて完了!
次回は攻撃させたいなぁ。。
参考記事
ありがとうございますm( )m
GP10UnityGameDevelopment02 - vga-unity - Unityゲーム開発 (2) - Unity講義まとめページ - Google Project Hosting
C#でcoroutineを使う - Unityな日々(Unity Geek)