【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

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]