とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

Unity2D入門 スクロールアクションゲームを作る ダメージを受けると点滅し、1秒間無敵な処理を作る

さてさて、だんだん一筋縄では行かない処理にはいってきました。

前回せっかくダメージを受けるようになったのですが、ただ突進して
ダメージゲージが減っていくという処理でした。

これだと当たった際にガンガンHPが削られて、即死というスペランカーも真っ青なゲームになってしまうので、そこはダメージを受けたら1秒間無敵!という感じにしたいのです。

今回の処理のフロー

  1. ダメージを受ける(前回つくりましたdamage.cs)
  2. 向いている方向とは逆に飛ばせる
  3. ダメージを受けたら1秒間[on_damage]フラグを立てる
  4. [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の通常のエディタだと日本語使えないので
もしも挙動に不具合が出た場合は消してください。

さぁエミュレートしてみましょう!

f:id:raharu0425:20140114184157p:plain

んん!見づらいぞ!一応これでも点滅しているのです。 またフラグが立っている間は敵にぶつかってもダメージ処理に入らないので無敵です。

なかなかてこずらせてくれましたがこれにて完了!

次回は攻撃させたいなぁ。。

参考記事

ありがとうございますm( )m

GP10UnityGameDevelopment02 - vga-unity - Unityゲーム開発 (2) - Unity講義まとめページ - Google Project Hosting

C#でcoroutineを使う - Unityな日々(Unity Geek)

Unity関連記事

"Unity" - 記事一覧 - とあるプログラマの備忘録