【Unity2D 入門】横スクロールアクションゲームを作ってみたい -攻撃アクションを作る1回目

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

前回ダメージを受けて点滅したり後ろにノックバックしたりできる処理をかきましたが、
今回はこっちから攻撃してやんよ!という事で攻撃処理を作りたいと思います。
長いので2回位に分けます。

攻撃Sprite画像を用意する

毎回の事ながらN氏にお願いしてまた攻撃画像を用意してもらいました!N氏GJ!ww

f:id:raharu0425:20140114204023p:plain

攻撃アニメーションの作成

キャラクターがエンターキーを押したら口を開けるというアニメーションを作成します。

N氏に作ってもらった画像をSptite化してスライスしておきます。

f:id:raharu0425:20140115124027p:plain

口を開けるアニメーションを長めに作成します。
名前はplayer@attackとでもしておきましょう。

f:id:raharu0425:20140115124233p:plain

この状態からAnimetorタグを開いて、アニメーションに対してフラグを指定します。

f:id:raharu0425:20140115124416p:plain

isAttackフラグを作成して
Walk > Attack は isAttack = true;
Attack > Walk は isAttack = false
指定します。

f:id:raharu0425:20140115124640p:plain

ここまでできたらisAttackフラグでモーションを移動できるようになりました。

プレイヤーにアタッチされているplayer.csを編集します。

player.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
using UnityEngine;
using System.Collections;

public class playermove : MonoBehaviour {

    public GameObject firePrefab;

    private bool isRight = true;
    private bool isAttack = false;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update ()
    {
        //攻撃フラグをAnimatorに設定する
        GetComponent<Animator>().SetBool("isAttack",isAttack);
    }

    void FixedUpdate ()
    {
        //  エンターキーが押されたら攻撃フラグを立てる
        if(Input.GetKeyDown("return")){
            isAttack = true;
            StartCoroutine("WaitForAttack");
        }

        //左右キーの入力
        float h = Input.GetAxis("Horizontal");
        rigidbody2D.AddForce(Vector2.right * h * 300f);

        //右を向いていて、左の入力があったとき、もしくは左を向いていて、右の入力があったとき
        if((h > 0 && !isRight) || (h < 0 && isRight))
        {
            //右を向いているかどうかを、入力方向をみて決める
            isRight = (h > 0);
            //localScale.xを、右を向いているかどうかで更新する
            transform.localScale = new Vector3((isRight ? 2 : -2), 2, 2);
        }
    }

    IEnumerator WaitForAttack()
    {
        yield return new WaitForSeconds(0.5f);
        isAttack = false;
    }
}

これでプレイヤーがエンターキーを押すと口を開けるというモーションができあがりました。

f:id:raharu0425:20140115125322p:plain

攻撃本体のSprite作成

f:id:raharu0425:20140115122527p:plain

Spriteのオブジェクトを作成してfireとでも名付けておきます。

f:id:raharu0425:20140115122641p:plain

※この際にOrder In Layer を11にセットしておきます(プレイヤーより前面に出すため)

オブジェクトを選択した状態でAnimationを作成します
今回はattack@fireと名付けておきます。

f:id:raharu0425:20140115122845p:plain

これで一応ゲーム画面上ではアニメーションすると思います。

これを飛ばすように見せたいので
スクリプトを作成します。

moveattack.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using UnityEngine;
using System.Collections;

public class moveattack : MonoBehaviour {

    public float spd = 0.01f;

    // Update is called once per frame
    void Update() {
        transform.Translate(Vector3.right * spd);
        Destroy(gameObject, 1.0f);
    }

}

これで炎は右に飛んでいき1秒後にかってに消えるという処理ができました。
これをfireオブジェクトにアタッチしておきます。

f:id:raharu0425:20140115123532p:plain

ここまでできたらfireをPrefab化しておきましょう。

ここまでやると。
1. プレイヤーはエンターを押すと口を開ける
2. 炎はエミュレートすると勝手に右に飛んでいく

という別々の動きができあがりました。
次回はこれを繋げます。

なかなかこの処理つくるの大変ですね、最近風邪が流行っていますので皆さん気をつけましょう!