なんかつくってうろう

Qiita で商品の宣伝するなとコメントに付くと思うんだが　やるだけやってみよう。
Qiita にも **画像アップロード容量の上限** があるようで、あんまり載せれなくてつまらない。
半月ぐらいヒマだ。何やると　金になることに近いのか。


Windowsプログラミングやる気起きないし Unity2D でなんかしてみる。

プロジェクト名は 何も思い浮かばないので 6月3日から RokuSan とでもしておく。

プロジェクト作成時に 2D を選んでおくと、カメラがパースのかかってないやつになる。これはあとで変更できる。

# 画質

[Edit] - [Project Settings] - [Quality] と進む。

Levels というところを Fastest にする。

こうすることで、画質は落ちるが、アンチエイリアスは無しにして、
スプライトをタイル詰めしたときに　隙間がちらついたり　線が入ったりすることを　控えめにすることができる。

# 解像度

[File] - [Build Settings...] からダイアログボックスを出して [Player Settings...] を出す。

この Player というのは　再生プレイヤー　みたいな意味なのかもしれない。

[Resolution and Presentation] - [Resolution]欄を見る。

[Default Is Full Screen*] に最初チェックが入っていると思うが これを外すと 画面のタテ・ヨコ　ピクセルを指定することができる。
ここで指定しても　なんの意味があるのか分からないが。

とりあえず　ヨコ 960、タテ 560 にしてみる。


[Run In Background*]チェックボックスにチェックを入れる。
こうすることで、ウィンドウからフォーカスを外してもゲームは動き続ける。スクリーンショットを撮影しようというときに　チェックを入れればいい。



# [Ctrl]+[S] で保存

.unity 拡張子は　シーンを保存するということだが
Assetsフォルダーの下に Resources/Scenes フォルダーを作って　そこに保存しておく。

シーンの名前は Main とでもしておけばいいだろう。


# Assertion failed on expression: 'device.IsInsideFrame()'

ウィンドウ下のステータス・バーに

```
Assertion failed on expression: 'device.IsInsideFrame()'
```

と出ているんだが、放置しておく。

# ゲームパッド入力

自分でスマホゲー遊ばないんで　画面タッチもしないし
ＰＣゲー向けのゲームパッドだけ考慮する。

[Edit] - [Projet Settings] - [Input] と進む。

[Axes] をクリックすると初期状態で 18個の入力ボタンが設定されている。

```
Size 18
Horizontal
Vertical
Fire1
Fire2
Fire3
Jump
Mouse X
Mouse Y
Mouse ScrollWheel
Horizontal
Vertical
Fire1
Fire2
Fire3
Jump
Submit
Submit
Cancel
```

同じのが２個あるやつがあると思うが、何かというと、

キーボード、マウス、ジョイスティック　とで分かれている。

例えば 上の Fire1 は

|||
|---|---|
|Name|Fire1|
|Positive Button|left ctrl|
|Alt Positive Button|mouse 0|
|Type|Key or Mouse Button|
|Joy Num|Get Motion from all Joysticks|

とある。
Positive というのは　レバーを倒す方向が正の方向(Positive)と　負の方向(Negative)があるというだけで、押すボタンは Positive だけ考えていればいい。

Joy Num はゲームパッド番号だが、left ctrl や mouse 0 はゲームパッドではないので無視される。

下の Fire1 は

|||
|---|---|
|Name|Fire1|
|Positive Button|joystick button 0|
|Type|Key or Mouse Button|
|Joy Num|Get Motion from all Joysticks|

となっていて、「joystick button 0」はジョイスティックのどこかのボタンだ。
「Get Motion from all Joysticks」は、指しているジョイスティックのどれでも、ぐらいの意味なので、リストボックスから「Joystick 1」など個別に設定することもできる。

**Unityの基本操作**として 「Fire1」といったツリー状の項目名を右クリックすると、メニューが出てくるものがある。
慣れてきたときには C# を使って自分でこの Unity備え付けの GUIの仕組みを使うこともできる。

[Delete Array Element]をクリックすると、「Fire1」を削除できる。

**消して不具合が起こる**ボタン設定は 「Submit」ぐらいだろうか。Submitは１つだけ残しておこう。Unityの何かが Submit ボタンの状態を見にくるのか、消しているとエラーを出すようだ。

それ以外は　いったん消して全部自分で作り直してもいいのではないか。


# どんなゲームにするのか？

自分の力で完成できるゲーム　がベスト。

自分の場合　ほとんど何やっても完成しないようだ。

そこで **Ａボタンを連打するだけのゲーム** を考えてみる。

レバーも使わない。メニューも出さない。


ゲームと言うと　キャラクターが出てきて、動いて、というところを　すぐ想像してしまったりするんだが、**絵を描くのが疲れた** りしたので、自分が **やり続けられるもの** は何かという自分の特性を知っておくといいだろう。

たとえば、画面に数字を出して　Ａボタンを押すとその数字が増える、といった **ゲームとはほど遠いもの** を作るというのも　特性　によっては選択肢として十分ある。


# ゲームオブジェクトの配置

[Hierarchy]ビューが　ゲーム空間に置くゲーム・オブジェクトの一覧になっている。

右クリックして [UI] - [Text] と進む。

ゲーム空間に置いておくものではなく、視聴者に向かって画面表示するものは、
まず入れ物として Canvas ゲームオブジェクトが作らる。
そして　その中に　Text ゲームオブジェクトが作って入れられる。
EventSystem も勝手に作られる。

```
-- Main
    |
    +-- Main Camera
    |
    +-- Canvas
    |    |
    |    +-- Text
    |
    +-- EventSystem
```


[Game]ビューでは画面の中心に「New Text」が表示されているはずだが、
- 小さかったり
- 色が見づらかったり

するので、それぞれ次のように解決しよう。

[Inspector]ビューの中に [Text(Script)] という区画が表示される。
この中の [Text] 欄に例えば 「あいうえお」と打ち込んで
[Color] 欄では適当に 白っぽい色を選ぼう。

[Font Size] は、大きすぎると　改行して文字が次の行に行ってしまい、画像サイズの中に収まらなくなる　といったことがおこって見えなくなる。Font Size を指定するときは、対象を目で捉えながら数字を入れよう。

[Game]ビューの [Scale] スライダーを 1x に合わせると等倍表示になる。

![20170603a1b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/ba900c39-ba98-2fda-7484-5bd9c9d51abb.png)

# C#スクリプト

じゃあ、このテキストを最初 0 にしておいて、Ａボタンを連打するたびに１増える　という簡単なプログラムを書く。

[Inspector]ビューの一番下に[Add Component]ボタンがあるので、これをクリックする。
リストボックスが出てきて、下の方に[New Script]というのがあるはずなのでクリックする。

Name (ファイル名)は「Counter」
Language (スクリプトの種類)は C Sharp (C#) にする。

[Create And Add]ボタンを押す。

[Assets]ビューに「Counter」が増えているが、ここに増えると邪魔なんで [Assets]ビューを右クリックして [Create] - [Folder] を選んでフォルダーを作成する。

フォルダーの名前は 「Scripts」 とする。
C#スクリプトは、このフォルダーに入れていくことにする。

```
-- Assets
    |
    +-- Resources
    |    |
    |    +-- Scenes
    |
    +-- Scripts
```

開発が進むと　フォルダーはもっと細分化されていくと思うが、とりあえず　今はこれでいく。

Scripts フォルダーの下に Counter スクリプト・ファイルをドラッグ＆ドロップする。

# C#スクリプト編集

[Assets]ビューの Counter C#スクリプトをダブルクリック。
C#ファイルに対応付いているエディターが開く。

わたしの場合 Visual Studio 2017 をインストールしてC#の編集に使っている。

「Visual Studio 2017」
https://www.visualstudio.com/ja/vs/whatsnew/?rr=https%3A%2F%2Fwww.google.co.jp%2F

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Counter : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}
```

といったコードが既に作成されている。

冒頭の using が並んでいるところに

```C#
using UnityEngine.UI;
```

を追加する。
Start() と書いているあたりには

```C#
	// Use this for initialization
	void Start () {
        GetComponent<Text>().text = "0";
	}
```

といった感じで書く。

日本国内で C# の本なんか読んで勉強していると　なんだこのコードの書き方は、と思ってしまうことが Unity を触っていると　たくさん　あるんだが、

これから先　もっと　いっぱい「なんでこんなコードの書き方をしなくてはいけないのか」ということが　出てくると思っていい。

**Unity のスクリプト** として C#という方言を使っている、ぐらいに考えておくこと。構文が C# なだけ新たに覚えることは少なくてマシだろう。

Visual Studio 2017 で編集したファイルを保存して
Unityエディターに戻ろう。

画面上部の三角ボタン（再生ボタン）をクリックする。

![20170603b1b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/fb33de62-db5e-a16f-2841-929cfb95b024.png)

これで テキストは `0` になった。

# ゲームパッドのボタンの入力受付

C#のバージョンは 4 を超えてたりするんだが、Unity で使えるC#のバージョンは　それより古いのか　コンパイル・エラーになることがある。とりあえず Update() のあたりを次のように書けば動く。

```C#
	// Update is called once per frame
	void Update () {
        if (Input.GetKey(KeyCode.Joystick1Button0))
        {
            Debug.Log("0ボタンを押しました");
            int count;
            if(int.TryParse(GetComponent<Text>().text, out count))
            {
                count++;
                GetComponent<Text>().text = count.ToString();
            }
        }
    }
```

ゲームパッドのどのボタンが 0ボタン なのかは分からない。
開発時に キー・コンフィグができないなど、至っていない点がある。

再生すると、Ａボタンを押していると　ずっと数字が増えていく。

連打にするには、ボタンが放されたかも判定しないといけない。
キー操作が大きなプログラムになりそうなときは　Unityの[**Animator**]という仕掛けを使うことで　キー操作だけをプログラムから切り離して実装することが、できるケースがある。

ただ、Animator の使い方を説明し出すと長いので　今回は Animator を使わずに　ボタン連打　のプログラムを組んでみる。

```
        if (Input.GetKeyDown(KeyCode.Joystick1Button0))
```

さっき `GetKey` だったんだが、今度は `GetKeyDown` にする。これでいける。

よく使うだろうものは

|||
|---|---|
|Input.GetKey()|キーを押しているか|
|Input.GetKeyDown()|キーをこのフレームで押したか|
|Input.GetKeyUp()|キーをこのフレームで放したか|

という操作の受付と、

|||
|---|---|
|LeftArrow|左ボタン|
|Joystick1Button0|ジョイスティックの0ボタン|
|Mouse0|マウスの0ボタン|

といったボタン等だろうか。

例えば

```C#
	void Update () {
        if (Input.GetKeyDown(KeyCode.Joystick1Button0))
        {
// 中略
        }
        else if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            Debug.Log("マウス0ボタンを画面のどこかで押しました");
            int count;
            if (int.TryParse(GetComponent<Text>().text, out count))
            {
                count++;
                GetComponent<Text>().text = count.ToString();
            }
        }
    }
```

次のように書き足せば、画面上のどこかをマウスの0ボタンでクリックしたときに　数字が増える。


# ゲーム・オブジェクトをマウス・クリックしたときに数字が増えるようにしてみよう

画面のどこかをクリックして数字が増えても　おもんないんで、
ゲーム・オブジェクトをクリックしたときに数字が増えるようにしてみよう。

「【Unity】備忘録#1　クリックしたオブジェクトの取得について（3Dと2D）」ソースに絡まるエスカルゴ
http://rikoubou.hatenablog.com/entry/2016/01/29/163518

「Physics2D.OverlapPoint」
https://docs.unity3d.com/jp/540/ScriptReference/Physics2D.OverlapPoint.html

```
Vector2 tapPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
　　　Collider2D collition2d = Physics2D.OverlapPoint(tapPoint);
```

じゃあ　これで collition2d がヌルか、ヌルでないかを判定したらいいのか？

Text ゲームオブジェクトをクリックして[Inspector]ビューの下の方にある[Add Component]をクリックし、[Physics 2D] - [Box Collider 2D] をクリック。
これで[Inspector]ビューに [Box Collider 2D]が追加される。

C#スクリプトには次のように書き足す。

```C#
	void Update () {
        if (Input.GetKeyDown(KeyCode.Joystick1Button0))
        {
// 中略
        }
        else if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            Collider2D collition2d = Physics2D.OverlapPoint(Camera.main.ScreenToWorldPoint(Input.mousePosition));

            if(collition2d)
            {
                Debug.Log("数字オブジェクトをクリックしました");

                int count;
                if (int.TryParse(GetComponent<Text>().text, out count))
                {
                    count++;
                    GetComponent<Text>().text = count.ToString();
                }
            }
            else
            {
                Debug.Log("マウス0ボタンを画面のどこかで押しました");
            }
        }
    }
```

しかし　これだと　数字オブジェクトはクリックできないようだ。

公式だと Ray を飛ばしているが。

「Input.mousePosition」
https://docs.unity3d.com/ScriptReference/Input-mousePosition.html

「http://answers.unity3d.com/questions/596792/raycast-on-a-2d-collider.html」
http://answers.unity3d.com/questions/596792/raycast-on-a-2d-collider.html

OnMouse～( ) メソッドがあるのか？

「MonoBehaviour.OnMouseDown()」
https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html

```C#
    void OnMouseDown()
    {

    }
```

これの方がいいのか？

マウスクリックでは反応しない。Text はゲームオブジェクトと考えない方がいいのか？

# 2Dのゲームオブジェクト

3Dなら　球とか　長方形とかを置けるんだが、 2D では Sprite を置くことになるようだ。Sprite はドット絵や、ドットアニメといったものだ。

画像はなるべく描きたくないが、四角ぐらい描いてみるか。

とりあえず、画像作成の作業用フォルダーを作る。これは公式ではなく、わたしが使っているやり方で、この方法で何かゲームを完成させたことはない。

```
-- Unity
    |
    +-- RokuSan // ただのフォルダー
        |
        +-- RokuSan // UnityでOpenするフォルダー
        |
        +-- RokuSan_ImageSource // 画像作成の作業用フォルダー
```


![img_64x64.png](https://qiita-image-store.s3.amazonaws.com/0/159417/3899e02c-e4bb-d6fa-f7f4-2db0a56588cf.png)

こんな画像を描いてみる。

画像ファイルは、Unityエディターの [Project] ビューの Assets と書いてあるツリーに　ドラッグ＆ドロップすることができる。

```
-- Assets
    |
    +-- Resources
        |
        +-- Sprites
```

この Sprites フォルダーに画像をドラッグ＆ドロップする。
例えば img_64x64.png をドラッグ＆ドロップする。

そして Unityエディター上で img_64x64.png をクリックして [Inspector]ビューを見る。

**ドット絵の場合、Advanced の Filter Mode を、 Bilinear から Point(no filter) に変更することで、拡大縮小時のぼかし処理がかからず、ぼやけずに済む。**