【Unity2D 入門】横スクロールアクションゲームを作ってみたい -ダメージを受けると点滅し、1秒間無敵な処理を作る

raharu(仮名)(プログラマー)
これがダイバージェンス1%の先の世界か。。。

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

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

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

今回の処理のフロー

  1. ダメージを受ける(前回つくりましたdamage.cs)
  2. 向いている方向とは逆に飛ばせる
  3. ダメージを受けたら1秒間[on_damage]フラグを立てる
  4. [on_damage]フラグが立っている間は点滅&ダメージを受けないようにする
    というもの

とりあえず全部damage.csに書くので前回までのcsが必要です。
[http://raharu0425.hatenablog.com/entry/2014/01/11/091028]

スクリプト全文

damage.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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

[https://code.google.com/p/vga-unity/wiki/GP10UnityGameDevelopment02]
[http://unitygeek.hatenablog.com/entry/2012/11/10/173937]