ポイント獲得ゲーム -チェックワーク解説！-

#初めに
チェックワークの解説です！
テクテクストライクが終わったくらいの人ができるレベル感のものです。


#動画
![checkwork.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/938b1708-8bce-efbe-2af0-0235871d765e.gif)


**スペースキー**を押すとプレイヤーの白いブロックがジャンプします。
青いブロックは1点、赤いブロックは100点です。
コンソールに加点スコアと合計スコアを表示させましょう。

青はすり抜けるけど、赤にはぶつかります。

#作り方
##準備
###土台作り
まずゲームのステージを作りましょう！この段階は、何も見ずにできると良いです！

簡単に書くと、
・床を作る
・ブロックを3つ用意する
・それぞれわかりやすいように色をつける。

ここでつまづいてしまった人は、さらにヒント！
・床は、1枚の板を置いて作る。`Hierarchy`の`Create`タブから、3DオブジェクトのPlaneを選ぶよ
・ブロックはCubeという3Dオブジェクト
・色は、`Project`の`Create`から、Materialを選択。`Inspector`タブの上にある白い四角をクリックして、色を選択したら、そのMaterialを`Sceneビュー`にドラッグアンドドロップしてブロックに色をつける！

###要素を加えていく
さらに、完成動画を見てみると、プレイヤーが動く、つまり**重力**が必要です。また、青ブロックは**すり抜け**、赤ブロックには**ぶつかり**ます。この動きを作っていきましょう。何も見ずにできるともっとすごい！

やり方
①Playerのブロックに、`RigidBody`をつける。
　ヒント☆
　Playerブロックを選択した状態で`Inspector`タブを見ます。
　一番下の`AddComponent`をクリックしてRigidBodyを検索して取り付けます。

②FreezeRotationにチェック！
![スクリーンショット 2021-06-05 23.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/cc3838b8-6e0c-1869-74ac-8d6510719d71.png)

プレイヤーブロックには、縦方向にだけ動いて欲しいので、Freeze（凍らせるという意味！）RotationとPositionにチェックを入れます。Y軸のPositionのみを動かします。

③青ブロックの`isTrigger`にチェックを入れる
青ブロックを選択した状態で`Inspector`タブを見て、`BoxCollider`の**isTrigger**にチェックを入れます。こうすることで、このブロックは**すり抜けてぶつからないけど当たった判定だけはできる**状態になります。
![スクリーンショット 2021-06-05 23.08.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/e3a69d10-bf01-511e-88ea-55c2e86d5082.png)


④最後に、ProjectタブのCreateからC#スクリプトを選び、**PlayerScript**を作成して、オブジェクトに取り付けましょう。後はコードを書くだけ！

##スクリプトを書く
```
public class PlayerScript : MonoBehaviour
{
    public float power =  400f;
    Rigidbody _rigidbody;
    int score = 0;
  ```

まず、ちゃんと名前がPlayerScriptになってるか確認して、宣言を3つ書いていくよ。

・ひとつ目
ジャンプ力を入れる変数を宣言。powerと名付けました。**public**と付けるとUnityの画面でも数値が調整できます。

・2つ目
AddComponentした重力`Rigidbody`を使いたいので、_ rigidbodyと名付けて、宣言します。
☆型名と変数名の区別がわかりやすいように_（アンダーバー）を先頭に付けているよ

・３つ目
スコアを入れる箱を用意します

```
void Start()
    {
        _rigidbody = GetComponent<Rigidbody>(); 
        
    }
```

↑続いてStart関数の中に書きます。中身は、`RigidBody`をゲットしてねという命令です。

```
void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            this._rigidbody.AddForce(Vector3.up * power);
        }
        
    }
```

↑さらに、Update関数の中に書きます。
**Input.GetKeyDown(KeyCode.〇〇)**は、キーを押した時の命令の定型文です。ここではSpaceキーを使います。
今回は押した瞬間ふわっと上に行って欲しいので、GetKey **Down** にしましょう。

{}の中は、

「**もしスペースキーを押したら、このスクリプトが付いているオブジェクトの、RigidBodyに力を加えてね（上向きで、最初に宣言したpowerの速さで）**」

という意味になります。ここの説明はこれくらいにするので気になる人はAddForceとか調べてみてね

次はUpdateの外に書きます。↓

```
private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.name == "Blue")
        {
            score ++;
            Debug.Log(1);
            Debug.Log("合計"+ score + "点");
        }
   }
```

青ブロックを通るとスコアが+1になり、コンソールに表示されるスクリプトです。

`OnTriggerEnter`というUnityで用意してくれている変数を使います。これは、簡単に説明すると**トリガーがオンになったら{ }の中を実行するよ**　という意味です。さっきUnityでisTriggerにチェックを入れたけど、そのチェックがオンになっているとこの関数が使えます。

・{}の中では、初めに設定したscoreに、+1をする(++は+1と同じ意味）
そして、「スコアは1」とデバッグで表示しろ。という意味になっています。
合計点も表示しましょう。

さらにその外に、赤ブロックにぶつかるとスコアが+100になり、コンソールに表示されるコードを書きます

```
private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.name == "Red")
        {
            score += 100;
            Debug.Log(100);
            Debug.Log("合計"+ score + "点");
            
        }
    }
```

赤いブロックはすり抜けずぶつかったら加点ですが、その場合はTriggerではなく、`OnCollisionEnter`という関数を使います。Colliisionは衝突という意味の英語です。
なので**もしぶつかったら{}の中を実行してね**、という感じの機能になってます。

（実はいくつか種類があり、ぶつかり始めた時、ぶつかっている時、ぶつかり終わる時と分かれていますが今回は説明は省きます。）


####全体のスクリプト
![スクリーンショット 2021-06-05 23.41.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/6597408f-c686-ed3d-72a2-6c43247bc8e5.png)



#終わりに
どこまでできたかな？全てできなくても大丈夫！解説読んで理解できれば100点です。
何も見ずにできた人は本当にすごい！自信を持って今後も頑張ろう。

15分以内にできるポイントは
・Unityの基本操作が素早くできるか？
・ゲーム作成の手順がすぐに頭で組み立てられるか？
・コードをどこまで理解できているか？

おしまい〜！

学んだ技術まとめ
・Cubeの追加と配置
・すり抜け/IsTrigger
・Rigidbody
・if文
・AddForce
・衝突判定
・キー入力
・スコアの計算
・Debug.Log