LoginSignup
1
1

More than 3 years have passed since last update.

[Unity2D対戦ゲーム] 攻撃モーション/非ダメ/当たり判定の実装方法 #2 (一から作るチュートリアル) Mac版

Posted at

今回のポイントは、キャラクターを移動させる事と敵を配置させる事。
(攻撃アクションは次回から)

敵キャラの配置

左下のプロジェクトビューの[Sprites]からLightBanditの画像数字の4.5.6.7.を複数選択し、真ん中のシーンビューにドラッグ&ドロップをしてください。
スクリーンショット 2020-01-29 19.09.22.png

スクリーンショット 2020-01-29 19.10.10.png

また保存先を聞かれるので、このように[Animations]先に[LightBanditIdle]と名前を付けて「Save」をクリック。
スクリーンショット 2020-01-29 19.13.06.png

[Save]をしたらこの画面になります。
スクリーンショット 2020-01-29 19.13.30.png

これで入れたことが確認出来ましたね。
スクリーンショット 2020-01-29 19.13.47.png

[再生]を押すと敵も動いていることが分かります。
スクリーンショット 2020-01-29 19.14.38.png

次は、敵キャラのサイズを合わしたいと思うので、前回に紹介したピクセル画像についてを見て頂けたら、分かると思うので、このまま設定していきます。
敵キャラ画像の全体を選択した状態で、ピクセルサイズを48に変えて下にスクロールをしたら[Apply]があるのでクリックします。
スクリーンショット 2020-01-29 19.43.22.png

これでキャラクターのサイズが合いましたね。
スクリーンショット 2020-01-29 19.44.22.png

スクリーンショット 2020-01-29 19.58.32.png

次に、左側にあるヒエラルキーの『HeavyBandit_4』→ (Player)『LightBandit_4』→ (Enemy)に変えてあげる。

変更前
スクリーンショット 2020-01-29 20.00.53.png

変更後
スクリーンショット 2020-01-29 20.09.20.png

次に前回と同様で、Enemy(敵キャラ)にも[Rigidbody2D]を付けてあげる。
スクリーンショット 2020-01-30 9.55.47.png

スクリーンショット 2020-01-30 10.02.29.png

スクリーンショット 2020-01-30 10.03.43.png

再生をしたら、こういう感じになります。
スクリーンショット 2020-01-30 10.05.00.png

[BoxCollider2D]も付けると
スクリーンショット 2020-01-30 10.15.34.png

落下する事が無くなりましたね。
スクリーンショット 2020-01-30 10.16.08.png

まだ見た目的には、宙に浮いている状態なので、[BoxCollider2D]を修正して上げましょう。
スクリーンショット 2020-01-30 10.28.26.png

[BoxCollider2D]も大きく囲む必要がないので、小さくしましょう。
スクリーンショット 2020-01-30 10.30.02.png

これで立つ事が出来ました。
スクリーンショット 2020-01-30 10.30.31.png

プレイヤーの移動

プレイヤーを動かせるのはプログラムになるので、まず[Assets]をクリックしてこの画面にします。
スクリーンショット 2020-02-01 17.01.27.png

その次に[Create]を開き[Folder]をクリック
スクリーンショット 2020-02-01 17.01.40.png

スクリーンショット 2020-02-01 17.01.51.png

[Now Folder]を[Scripts]に変更します。
スクリーンショット 2020-02-01 17.02.45.png

先ほど作った[Scripts]をクリックして開いた状態で[Create]をクリックして[C# Scripts]をクリックします。
スクリーンショット 2020-02-01 17.11.51.png

スクリーンショット 2020-02-01 17.12.02.png

[C# Scripts]の名前を[PlayerManager]に変更します。
スクリーンショット 2020-02-01 17.22.13.png

[PlayerManager]のスクリプトをプレイヤーにアタッチします。
スクリーンショット 2020-02-01 20.38.23.png

アタッチが出来たらインスペクターに付いている事が分かります。
スクリーンショット 2020-02-01 20.40.30.png

次に[PlayerManager]のスクリプトをクリックして開きます。

PlayerManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}


このスクリプトで実行してみましょう

PlayerManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    Rigidbody2D rb;
    // 1回だけ実行される
    void Start()
    {
        //ここは重要 プレイヤーのコンポーネント(インスペクターからRigidbody2D)を取得するため
        rb = GetComponent<Rigidbody2D>();
    }

    // 0.02秒に1回実行される(パラパラ漫画みたいなイメージ)
    void Update()
    {
        // GetAxisRawとGetAxisはどちらでも良い Horizonは水平の意味
        float x = Input.GetAxisRaw("Horizontal");  //方向キーの横
        Debug.Log(x);  //試しにDebug.Logで確認する
        // velocityは速さか速度に関わる  Vector2(1f, rb.velocity.y)は、右を押すと右に一回動く(1fが1回の意味)
        rb.velocity = new Vector2(1f, rb.velocity.y);
    }
}

このように再生ボタンを押すと0の数値がずっと続いてキャラクターが勝手に右に進む
スクリーンショット 2020-02-05 18.00.39.png

再生を押しながら左のキーを押せば -1になり、
スクリーンショット 2020-02-05 18.01.48.png

右のキーを押せば 1になる というのが確認できる
スクリーンショット 2020-02-05 18.02.03.png

1fをxに変えるとキャラクターが移動する

PlayerManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    Rigidbody2D rb;
    // 1回だけ実行される
    void Start()
    {
        //ここは重要 プレイヤーのコンポーネント(インスペクターからRigidbody2D)を取得するため
        rb = GetComponent<Rigidbody2D>();
    }

    // 0.02秒に1回実行される(パラパラ漫画みたいなイメージ)
    void Update()
    {
        // GetAxisRawとGetAxisはどちらでも良い Horizonは水平の意味
        float x = Input.GetAxisRaw("Horizontal");  //方向キーの横
        Debug.Log(x);  //試しにDebug.Logで確認する
        // velocityは速さか速度に関わる  Vector2(1f, rb.velocity.y)は、右を押すと右に一回動く(1fが1回の意味)
        rb.velocity = new Vector2(x, rb.velocity.y);
    }
}

moveSpeedを追加する事によってキャラクターのスピードが上がる

PlayerManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    public float moveSpeed = 3f;
    Rigidbody2D rb;
    // 1回だけ実行される
    void Start()
    {
        //ここは重要 プレイヤーのコンポーネント(インスペクターからRigidbody2D)を取得するため
        rb = GetComponent<Rigidbody2D>();
    }

    // 0.02秒に1回実行される(パラパラ漫画みたいなイメージ)
    void Update()
    {
        // GetAxisRawとGetAxisはどちらでも良い Horizonは水平の意味
        float x = Input.GetAxisRaw("Horizontal");  //方向キーの横
        Debug.Log(x);  //試しにDebug.Logで確認する
        // velocityは速さか速度に関わる  Vector2(1f, rb.velocity.y)は、右を押すと右に一回動く(1fが1回の意味)
        rb.velocity = new Vector2(x*moveSpeed, rb.velocity.y);
    }
}

moveSpeedの数値を変える事でスピード調整出来る
スクリーンショット 2020-02-06 11.05.59.png

次にキャラクターの向きを左右にする方法(2つ方法がある)
スクリーンショット 2020-02-06 11.13.31.png

今回は、2の方法(Transform)をします。このようにコードを書きます。

PlayerManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    public float moveSpeed = 3f;
    Rigidbody2D rb;

    void Start()
    {

        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        float x = Input.GetAxisRaw("Horizontal");  //方向キーの横
        Debug.Log(x);
        // 右向きだったら
        if (x > 0) 
        {
            transform.localScale = new Vector3(-1, 1, 1);
        }
        // 左向きだったら
        if (x < 0)
        {
            transform.localScale = new Vector3(1, 1, 1);
        }
            rb.velocity = new Vector2(x*moveSpeed, rb.velocity.y);
    }
}

このように、再生で右のキーを押すと右に向き
スクリーンショット 2020-02-06 11.32.21.png

再生で左のキーを押すと左に向きます。
スクリーンショット 2020-02-06 11.32.31.png

ここまで出来たら次にアニメーションの切り替え方法を実装します。

アニメーションの切り替えについて

(走るアニメーション)

[HeavyBandit]の8,9,10,11,12,13,14,15を複数選択してヒエラルキーの[Player]にドラッグ&ドロップします。
スクリーンショット 2020-02-06 11.52.29.png

スクリーンショット 2020-02-06 11.54.20.png

スクリーンショット 2020-02-06 11.55.44.png

[Save]が出来たら、[AnimatorのController]をダブルクリックします。
スクリーンショット 2020-02-06 11.56.49.png

このように開きます。
スクリーンショット 2020-02-06 12.04.42.png

右クリックで[Make Transition]を選んで矢印をつけましょう。
スクリーンショット 2020-02-06 12.08.19.png

スクリーンショット 2020-02-06 12.08.35.png

こちらも右クリックで[Make Transition]を選んで矢印をつけましょう。
スクリーンショット 2020-02-06 12.08.47.png

スクリーンショット 2020-02-06 12.08.58.png

このように両方に矢印をつける事が出来たら、先ほどつけた矢印をクリックしてこのようにします。[Has Exit Time]を外します

スクリーンショット 2020-02-06 12.17.53.png

[Transition Duration]の0.25を0に設定します。
スクリーンショット 2020-02-06 12.19.00.png

スクリーンショット 2020-02-06 12.20.05.png

次に逆の矢印も同じように設定しましょう。
スクリーンショット 2020-02-06 12.34.07.png

次は[Conditions]を設定します。「Idle」状態から走る状態と、走ってる状態から「Idle」状態に戻る事がしたいので。
スクリーンショット 2020-02-06 12.42.55.png

とりあえず名前を[Speed]にしましょう。
スクリーンショット 2020-02-06 12.44.17.png

下の矢印の設定
スクリーンショット 2020-02-06 12.55.51.png

上の矢印の設定
スクリーンショット 2020-02-06 13.02.39.png

動作確認をしたいので、[Animator]をドラッグ&ドロップで[インスペクター]に配置します。
スクリーンショット 2020-02-06 13.09.24.png

このようになります。1度確認しましょう。
スクリーンショット 2020-02-06 13.09.49.png

スクリーンショット 2020-02-06 13.10.15.png

Speedを1に設定すると
スクリーンショット 2020-02-06 13.10.36.png

走りましたね。Speedを0.5にすると
スクリーンショット 2020-02-06 13.10.54.png

こちらも走りましたね。絶対値をかけて0.1より大きかったら、走るようになります。
スクリーンショット 2020-02-06 13.11.47.png

インスペクターの[Animator]を操作する事が分かったので、スクリプトに戻りましょう。
スクリーンショット 2020-02-06 13.28.05.png

このコードを書きましょう。

PlayerManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    public float moveSpeed = 3f;
    Rigidbody2D rb;
    Animator animator;

    void Start()
    {

        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        float x = Input.GetAxisRaw("Horizontal");  //方向キーの横
        Debug.Log(x);
        // 右向きだったら
        if (x > 0) 
        {
            transform.localScale = new Vector3(-1, 1, 1);
        }
        // 左向きだったら
        if (x < 0)
        {
            transform.localScale = new Vector3(1, 1, 1);
        }
        animator.SetFloat("Speed", x);
            rb.velocity = new Vector2(x*moveSpeed, rb.velocity.y);
    }
}


再生で動かすと、左のキーを押したら、走っているアニメーションじゃなくて、右のキーを押すと走っているアニメーションになります。(止まっている画像なので、分かりづらいかもしれないのですが)
スクリーンショット 2020-02-06 13.40.47.png

Mathf.Absの絶対値をつけてあげると左右に走る事が出来る。

PlayerManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    public float moveSpeed = 3f;
    Rigidbody2D rb;
    Animator animator;

    void Start()
    {

        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        float x = Input.GetAxisRaw("Horizontal");  //方向キーの横
        Debug.Log(x);
        // 右向きだったら
        if (x > 0) 
        {
            transform.localScale = new Vector3(-1, 1, 1);
        }
        // 左向きだったら
        if (x < 0)
        {
            transform.localScale = new Vector3(1, 1, 1);
        }
        animator.SetFloat("Speed", Mathf.Abs(x));
            rb.velocity = new Vector2(x*moveSpeed, rb.velocity.y);
    }
}


これで、上手く動くと思います。もし分からない事があれば、動画もご一緒に見ながらこの資料も見ていただけると効果的だと思うので良かったらぜひ!

スタジオしまづのYouTubeチャンネル
https://www.youtube.com/watch?v=SXUT0yZtayY

スタジオしまづが運営する「Unityゲーム開発サロン」
https://community.camp-fire.jp/mypage/projects/149191

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1