Unityの2Dアセット騎士に攻撃判定をつけてみた 

<h1>2D騎士を用いたゲーム</h1> 

剣士が1対1で戦うゲームを作ってみたかったので、 
Unityを使って騎士ドット絵を使って作ろうと思った。 
Unityは初めてだったので、考えることが少なそうな2Dゲームで作ろうとした。 
↓のAssetを使ってみた。
https://assetstore.unity.com/packages/2d/characters/hero-knight-pixel-art-165188
しかし問題が... 
2Dドット絵は武器にcolliderつけても、攻撃時にcolliderがくっついて動いてくれない。 
(3Dは人型モデルの武器・手足にcolliderつければ当たり判定が効く。） 
そこで、どうにか攻撃判定させる方法を考えてみた。 

<h1>Colliderによる攻撃判定</h1> 

<b>Colliderに関する詳細な説明は「引用・参考文献」をご覧ください。</b> 

<h3>1.Collider同士がぶつかると</h3>
例えばボールが重力で落ちて、箱にぶつかるとする。 
ボールと箱それぞれにcolliderをつけると、落ちたボールが箱に当たるようになる。
このcolliderを用いて、当たり判定をつけることができる。 
ボールと箱のそれぞれにcollider2Dをつけ、ボールにrigidbody2D(物理エンジン)をつける。
ボールが重力で落ちて箱に当たると、箱が赤くなる。
![Collider.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/c18d2ea6-c7c4-12b8-610e-dc507c2362a5.gif)

<h3>2.Triggerによる当たり判定</h3> 
例えば、横にボールを動かして当てるとする。
動くボールが重力で落ちないように、rigidbody2Dを「Kinematic」にする。
そうすると当たらずにすり抜けてしまう。
![kinematic.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/d177e913-45d4-bb7c-21d0-ff04322505b8.gif)
Kinematicの場合は、collider同士が当たってもすり抜けてしまう。
この場合は、colliderのどちらか（今回は四角）に「Is Trigger」をつける。
![IsTrigger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/17c5fc14-66e1-4728-a8d8-8aa8ee293efb.png)
Is Triggerはすり抜ける際に当たり判定が起こるモードである。

Triggerで当ててみると、当たったとき(正確にはボールが四角の中に入ったら）
箱が緑色になった。
![Trigger.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/1e389412-6450-652a-da6c-56f5560e097b.gif)
2Dゲームなどでは横に攻撃することが多いため、
横移動オブジェクトをtriggerで判定させれば攻撃判定が作れる。
 
<h1>攻撃判定のつけ方　“攻撃オブジェクト”</h1>
攻撃オブジェクトと攻撃判定のスクリプト, 受け側の判定スクリプトを紹介する。

<h3>1.攻撃オブジェクト</h3>
![AttackObject.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/ba91661d-089b-bf1b-2e6e-2cc74b1de217.png)
騎士の首元に丸いオブジェクトを配置
これを「攻撃オブジェクト」とする。 
攻撃オブジェクトにはCircul colliderをつけておく。(サイズはオブジェクトと同程度)
丸いオブジェクトは2D ObjectのSpriteを新しく作って適当に丸くした。
攻撃オブジェクトにRigidbody2Dをつけておく。
(よく忘れがち。Collider判定する場合はぶつかるもののどちらかにつける。)

攻撃オブジェクトに下記設定のPhysics 2Dをつけた。
重力で落ちないように、「Kinematic」にした。
![AttackObject_Physic2D.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/8c4a35bc-816e-f426-8d8e-9cfcd12a8ffb.png)


↓攻撃オブジェクトを動かすスクリプトは下記の通り。 

```C#:AttackController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AttackControllerTest : MonoBehaviour
{
    Rigidbody2D rd; //Rigidbodyオブジェクト
    float attspeed = 6.0f;  //オブジェクト移動スピード

    void Start()
    {
        rd = GetComponent<Rigidbody2D>();   //Rigidbodyコンポーネント取得
    }

    void Update()    
    {
        if(Input.GetKeyDown(KeyCode.Space))     //攻撃開始時(Spaceキーを押すと攻撃開始)
        rd.velocity = new Vector2(attspeed, 0); //スピードをつけて攻撃オブジェクトを移動
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        Destroy(gameObject);    //攻撃オブジェクトの破棄
    }
}
```
Spaceキーを押すと騎士攻撃が始まり、それと同時に攻撃オブジェクトが前方へ行く。
攻撃オブジェクトは速度6.0fで右へ向かっていく。
OnTriggerEnter2dになったら(Colliderがもう一方のcolliderに入り込んだら)
オブジェクトが破棄されるようにした。(敵に当たったら消える)

<h3>2.受けキャラの受け判定</h3> 
敵役の鬼？の首元にBox colliderをつける。
![OniCollider.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/27b0a5e5-59ed-bbe9-6edd-005e34ec3d23.png)
鬼用colliderのサイズ・XYは下図のように調整しました。
鬼のcolliderを「Is Trigger」にした。
![Oni_Physic2D.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/762c6950-837a-60e8-0895-e05327f45827.png)

↓鬼が攻撃オブジェクトを受けるときに、倒れるためのスクリプト

```C#:BanditController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BanditController : MonoBehaviour
{
    Animator animator;    //アニメオブジェクト

    // Start is called before the first frame update
    void Start()
    {
        this.animator = GetComponent<Animator>();  //アニメコンポーネントの取得
    }


private void OnTriggerEnter2D(Collider2D collision)
    {
        animator.SetTrigger("Death");   //倒れるアニメに移行
    }
}
```

OnTriggerEnter2dになったら(攻撃オブジェクトが鬼に入り込んだら)
鬼が倒れるようにしてる。

<h1>試しに切ってみた</h1> 
騎士が鬼を切ってみる。 
![AttackObject.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/1ad19810-ad4b-9f0c-64f0-8d745301b863.gif)

攻撃オブジェクトが鬼の首についたら、鬼が倒れた。

![適正.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/7942a18e-c225-de61-7aee-92da749cb5bb.gif)
攻撃オブジェクトを透明にしてもう一度。
剣で切るのと、攻撃オブジェクトが当たるのがちょうどいい。 

![ToQuick.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/f0afb8e2-6219-b5be-6428-56dbd238470a.gif)
攻撃オブジェクトの速度を倍にしてみた。
速度が速すぎるとと剣切る前に倒れる。(斬撃をかわす？）

![ToSlow.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/87802b7c-a754-e017-9287-6294ac54b44a.gif)
逆に遅いと、切られてることに気づいていない。
<b>剣士「振り向くなっ！」</b>

<h1>最後に</h1> 
https://www.youtube.com/watch?v=a8bI_725U7k
2Dで↑のようなゲームが作れた。 
1対1のバトルなら攻撃オブジェクトも有用かもしれないが、 
騎士を動かして沢山の敵を倒すアクションRPGは難しいかも... 

<h1>引用・参考文献</h1>  
この記事には基本的なことはほぼ書いていませんでした。すみません...
そのくらいUnityは奥が深いですね笑

https://qiita.com/azumak/items/b45e90705e25bd9d49d0
https://qiita.com/kanatatara/items/363a3a429dfa9cb2b92c
https://www.sejuku.net/blog/58775
当たり判定やcolliderについて解説している記事・サイト。

https://www.sejuku.net/blog/51770
今回省略した物理エンジンの要・rigidbodyについて解説しています。

https://www.sbcr.jp/product/4815606657/
<b>(書籍)Unityの教科書</b>
私はこれでUnityや当たり判定を学びました。
今回使用したrigidbodyや基本的なUnityの使い方が全て書いてあります。