Unity初心者がゲームを作ってみる②

前回①の続きから。

##ランダムな位置にネコ影を配置できるようになりました
コメントくださった方＋有識者兼友人のE氏により、無限増殖しないようにすることができました。
【原因】
ShadowGeneratorをネコ影オブジェクトにそのままアタッチしていたことにより、生成し終わった後にもう一度生成処理が走ってしまっていたため。
【解決方法】
空のオブジェクトを用意してそちらにShadowGeneratorをアタッチすることでゲーム開始時に１度だけ生成することが可能となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342106/c39ba72f-cad5-87cb-4645-ddac272ea0cf.png)

##ネコ影にウキを近づけたら「突っつくネコ影スプライト」へ変更する
ウキが近づいてきたらネコ影がウキを突っついているようなスプライトに変更させていきます。
ウキとネコ影の距離を判定する必要があるので、DistanceManagerを作成しました。

```DistanceManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/*
 * ネコ影とウキの距離判定をするクラス
 */
public class DistanceManager : MonoBehaviour
{
    GameObject shadow_1;
    GameObject uki_1;

    [SerializeField]
    private GameObject shadow_2;

    /*
    * ネコ影とウキのオブジェクトをみつける
    */
    public void FindNekoUkiObject()
    {
        this.shadow_1 = GameObject.Find("neko_1(Clone)");
        this.uki_1 = GameObject.Find("uki_1");
    }

    /*
    * オブジェクト間の距離を判定する
    */
    public void JudgeDistance()
    {
        Vector3 shadowPosition = shadow_1.transform.position;
        Vector3 ukiPosition = uki_1.transform.position;

        float distance = Vector3.Distance(shadowPosition, ukiPosition);

        if (distance <= 1.0f)
        {
           // つつくネコ影(shadow_2)へスプライト変更
           shadow_1.GetComponent<SpriteRenderer>().sprite = shadow_2.GetComponent<SpriteRenderer>().sprite;
        }
        else
        {
            // なにもしない
        }
    }
}

```
JudgeDistance()はウキとネコ影の距離を常に測っていたいのでUkiController.csのUpdate()で呼ぶように追加しました。

```UkiController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/*
 * ウキの動きを制御するクラス
 */
public class UkiController : MonoBehaviour
{
    GameObject distanceManager;

    void Start()
    {
        // DistanceManagerを設定する
        distanceManager = GameObject.Find("DistanceManager");
        distanceManager.GetComponent<DistanceManager>().FindNekoUkiObject();
    }

    void Update()
    {
        // 左クリックされた場合
        if (Input.GetMouseButton(0))
        {
            // ウキ→カーソル方向のベクトル取得
            Vector3 vector = Camera.main.ScreenToWorldPoint(Input.mousePosition) - this.transform.position;
            // 正規化(ベクトルの大きさが1になる)
            Vector3 vectorUki = vector.normalized;

            vectorUki = new Vector3(vectorUki.x, vectorUki.y, 0);
            // ベクトルの向きにウキを移動
            this.transform.position += vectorUki;
        }

        // DistanceManagerの距離判定を呼び出す
        distanceManager.GetComponent<DistanceManager>().JudgeDistance();
    }
}
```
これでウキにネコ影が近づくと突っつくネコ影スプライトが表示されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342106/03d21cab-6ea7-7797-dd67-c6f0c9c123f2.png)

##ランダムな秒数待機して「沈むウキスプライト」へ変更する
次に、ランダムな秒数待機しウキが沈むようなスプライトへ変更させます。
待機してから処理を行う方法については下記サイトを参考に作成しました。
http://tsujitaku50.hatenablog.com/entry/2017/01/11/204150

```DistanceManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/*
 * ネコ影とウキの距離判定をするクラス
 */
public class DistanceManager : MonoBehaviour
{
    GameObject shadow_1;
    GameObject uki_1;

    [SerializeField]
    private GameObject shadow_2;
    [SerializeField]
    private GameObject uki_2;

    /*
    * ネコ影とウキのオブジェクトをみつける
    */
    public void FindNekoUkiObject()
    {
        this.shadow_1 = GameObject.Find("neko_1(Clone)");
        this.uki_1 = GameObject.Find("uki_1");
    }

    /*
    * オブジェクト間の距離を判定する
    */
    public void JudgeDistance()
    {
        Vector3 shadowPosition = shadow_1.transform.position;
        Vector3 ukiPosition = uki_1.transform.position;

        float distance = Vector3.Distance(shadowPosition, ukiPosition);

        Sprite shadow1Sprite = shadow_1.GetComponent<SpriteRenderer>().sprite;

        if (distance <= 1.0f)
        {
            // shadow_1のスプライトが変更されていなかった場合
            if (shadow1Sprite.Equals(shadow_1.GetComponent<SpriteRenderer>().sprite))
            {
                // スプライト変更処理呼び出し 
                StartCoroutine("changeSprite");
            }
        }
        else
        {
            // なにもしない
        }
    }

    /* 
     * ネコ影とウキのスプライト変更を行う
     */
    IEnumerator changeSprite()
    {
        // つつくネコ影(shadow_2)へスプライト変更
        shadow_1.GetComponent<SpriteRenderer>().sprite = shadow_2.GetComponent<SpriteRenderer>().sprite;

        // ランダムな秒数待機する
        yield return new WaitForSeconds(Random.Range(4.5f, 7.5f));

        // 沈むウキ(uki_2)へスプライト変更
        uki_1.GetComponent<SpriteRenderer>().sprite = uki_2.GetComponent<SpriteRenderer>().sprite;

    }
}
```
JudgeDistance()を呼び出しているのがUkiControllerのUpdate()なので、changeSprite()が何度も呼ばれないように「shadow_1のスプライトが変更されていなかった場合」で処理の呼び出し判定を行っています。
以上の処理で、
ネコ影にウキを近づける→ウキを突っつくネコ影スプライトが表示
→何秒か待つ→沈むウキのスプライトが表示
ができあがりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342106/6767bedb-a831-e37f-0001-8850f739f543.png)

次はユーザーの釣り上げ処理を作っていきます。
コードの改善点などありましたら是非お気軽にコメントください！