【unity】コマンドバトル作ってみた➀（下準備）

# はじめに
ドラクエみたいなバトルシーンを作ろうと記事を探したのですが、見つからなかったので試行錯誤で作ってみました。おそらく効率の悪いコードかもしれないですが、記事書いてみます。

# 完成すると
![bandicam-2023-01-30-18-01-41-767.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3122301/6a8315ce-1b56-0cfe-a50d-45917b34b03f.gif)

# はじめはPlayer, Enemyの配置
![スクリーンショット 2023-01-30 214810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3122301/c2cd6560-5300-e65e-9c85-db41b697896a.png)
上がEnemy、下がPlayerとなるように配置。ここから作業！
・BoxCollider2Dを付ける。
・Rigidbodyを付ける。Rigidbodyの中のGravityScaleは0に。
・Playerには「Player」、Enemyには「Enemy」とタグづけ。

ここからスクリプトを張り付けていきます！
```cs:Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour
{
    private float speed = 0.05f;
    public int PlayerHp;
    public int PlayerMp;

    //playerの動き制御（※今後重要になります）
    public bool playermove;

    // Start is called before the first frame update
    void Start()
    {
        //playermoveをtrue(今だけ)
        playermove = true;
    }

    // Update is called once per frame
    void Update()
    {
        //playerの動きを制御trueだったら動ける
        if (playermove == true)
        {
            Vector2 position = transform.position;
            if (Input.GetKey("up"))
                {
                    position.y += speed;
                }
            transform.position = position;
        }
    }
}
```

```cs:Enemy.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyScript : MonoBehaviour
{
    //Enemyの初期設定
    public int EnemyHp;

    // Start is called before the first frame update
    void Start()
    {
        
    }

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

<h5>コード解説

```cs
    //Enemyの初期設定
    public int EnemyHp;
```
このように記述することで、unity側で敵によって敵のHPを変更することが出来ます！

ここから作業！
・それぞれにスクリプトを張り付ける
・Enemyを選択。Inspectorビュー上で、EnemyHpを設定。今回は1000に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3122301/2b2eb9cd-a29b-aa2f-246e-dbcb2c76b1c5.png)

# 当たり判定の実装
今回はEnemyにPlayerが当たったらまでを実装します。
コードは以下の通りです。今回のScriptはBattleManagerにします。このスクリプトはPlayerに張り付けてください。

```cs:BattleManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BattleManager : MonoBehaviour
{
    //スクリプトの取得
    PlayerScript player;
    EnemyScript enemy;

    //Playerの情報
    public int PlayerHp;
    public int PlayerMp;
    public bool PlayerMove;
    //敵の情報
    private int EnemyHp;
    private GameObject Enemy;

    // Start is called before the first frame update
    void Start()
    {
        PlayerMove = true;
    }

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

    }
    void OnCollisionEnter2D(Collision2D col)
    {
        if (col.gameObject.tag == "Enemy")
        {
            //当たったら表示
            Debug.Log("当たったよ");

            //playerの情報取得
            player = this.gameObject.GetComponent<PlayerScript>();
            PlayerHp = player.PlayerHp;
            PlayerMp = player.PlayerMp;

            //当たったenemyの情報取得
            enemy = col.gameObject.GetComponent<EnemyScript>();
            EnemyHp = enemy.EnemyHp;
            Enemy = col.gameObject;

            //playerの動きを止める
            PlayerMove = false;
        }
    }
}

```

<h5>コード解説

```cs 
//playerの情報取得
player = this.gameObject.GetComponent<PlayerScript>();
```
このように書くことでplayerについてるPlayerScriptを取得することが出来ます。

<br>
<br>

Playerスクリプトを変更
```cs:Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour
{
    private float speed = 0.05f;
    public int PlayerHp;
    public int PlayerMp;

    //追加：BattleManagerスクリプトの取得
    BattleManager player;

    //playerの動き制御（※今後重要になります）
    public bool playermove;

    // Start is called before the first frame update
    void Start()
    {
        //playermoveをtrueをコメントアウト
        //playermove = true;
    }

    // Update is called once per frame
    void Update()
    {
        //playermoveの取得
        player = this.gameObject.GetComponent<BattleManager>();
        playermove = player.PlayerMove;

        //playerの動きを制御trueだったら動ける
        if (playermove == true)
        {
            Vector2 position = transform.position;
            if (Input.GetKey("up"))
                {
                    position.y += speed;
                }
            transform.position = position;
        }
    }
}
```

<h5>コード解説

```cs
        //playermoveの取得
        player = this.gameObject.GetComponent<BattleManager>();
        playermove = player.PlayerMove;
```
この部分では、BattleManagerのPlayerMoveの情報を取得しています。


# 再生
これでプレイヤーを動かせるようになり、敵に当たるとデバックで「当たったよ」とコンソールに表示されるようになります。

<br>
<br>

次回は、UIの設定を行います。