育成ゲームをunityで作る

![新規プロジェクト.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959805/4e38f193-3586-44e6-9374-b3a86544dacf.gif)
なぜか映像ガビガビ、黒い線が出ちゃってる。。気にしないでね。


# 育成ゲーム制作記録　パート②
パート①は[こちら](https://qiita.com/waccanacchi/items/073aac08db69c0d95c67)
 
 <目次>
(1) 畑内の時のみ選択枠を表示。
(2) 選択枠を動かせるようにする。
(3) plantボタンで植物を選択枠へ出現させる
続きはパート③で作成します。

# (0)今回のプロトタイプ
https://scratch.mit.edu/projects/1132962685

# (1)畑内の時のみ選択枠を表示
![スクリーンショット 2025-03-19 10.36.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959805/5c53cbec-9c51-4526-b898-dadc0673e6a9.png)

①field_selectがtrueの時のみ、表示する。
②表示する時座標は、fieldの左上になるように指定
メモ：script名 ▶︎SelectFrame
（解説）ほとんどパート①でやったplantボタンの制御と同じ。今回はrenderを使った。

```
public class SelectFrame: MonoBehaviour
{
    private fieldMove fieldMoveScript;  // fieldMove スクリプトを保持する変数
    public GameObject targetObject;  // fieldMove がついているオブジェクトを Inspector でセット
    void Start()
    {

        //field_touch変数を使えるようにするために、変数を取得
        fieldMoveScript = targetObject.GetComponent<fieldMove>();
    }

    // Update is called once per frame
    void Update()
    {
        if (fieldMoveScript.field_touch == true)    
        {
        //表示する
        Debug.Log("表示する");
        GetComponent<Renderer>().enabled = true; //表示
        } else{
        //隠す
        Debug.Log("隠す");
        GetComponent<Renderer>().enabled = false; //非表示
        }
    }
}
```

# (2)選択枠を動かせるようにする。
プロトタイプでは、スペースキーで選択枠を動かしていたが、今回は上下左右キーで動かせるようにしたい。
やること：field内だけ自由に動けるようにする。

### 試作品1 失敗
>（やったこと）
fieldに触れている間のみ動かしたかったので、OnTriggerStayにfieldに触れている時のみという条件をつけて制御を試みた。
（結果）
しかし、この方法だと、一部でもfieldに触れていると問題なく動くため、fieldからはみ出てしまう。また、fieldから完全に出た時に止まってしまう。
（実装時のメモ）
OnTriggerStay() を使う時の注意点
①(is Trigger) にチェックが入っていないと反応しない。
②プレイヤー or 当たり判定を持つオブジェクト のどちらかに Rigidbody を追加する必要がある。

```
private void OnTriggerStay(Collider other)
    {
     Debug.Log("触れてる判定");
        //fieldタグに触れている間だけ
        if (other.CompareTag("Field"))
        {
            //矢印移動↓↓
            if (Input.GetKey(KeyCode.UpArrow))
            {
                //前へ移動
                transform.position += transform.TransformDirection(Vector3.forward * moveSpeed * Time.deltaTime);
            }
            //Sキーが押されたとき
            if (Input.GetKey(KeyCode.DownArrow))
            {
                //後ろへ移動
                transform.position += transform.TransformDirection(Vector3.back * moveSpeed * Time.deltaTime);
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                //前へ移動
                transform.position += transform.TransformDirection(Vector3.left * moveSpeed * Time.deltaTime);
            }
            //Sキーが押されたとき
            if (Input.GetKey(KeyCode.RightArrow))
            {
                //後ろへ移動
                transform.position += transform.TransformDirection(Vector3.right * moveSpeed * Time.deltaTime);
            }
        }
    }
```

### 試作品2
> 反省を生かして、当たり判定ではなく、座標で管理することを試みる

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

public class SelectFrame: MonoBehaviour
{
    float moveSpeed = 5; //枠の移動
    private fieldMove fieldMoveScript;  // fieldMove スクリプトを保持する変数
    public GameObject targetObject;  // fieldMove がついているオブジェクトを Inspector でセット


    private Vector3 minBounds; // 地面の最小座標
    private Vector3 maxBounds; // 地面の最大座標
    private float playerSize = 0.025f; // プレイヤーの半径 (一辺5cmの立方体なら 2.5cm)
    void Start()
    {

        //field_touch変数を使えるようにするために、変数を取得
        fieldMoveScript = targetObject.GetComponent<fieldMove>();


        GameObject field = GameObject.FindWithTag("Field");
        if (field != null)
        {
            Collider fieldCollider = field.GetComponent<Collider>();
            if (fieldCollider != null)
            {
                // プレイヤーのサイズを考慮して、移動範囲を少し縮める
                minBounds = fieldCollider.bounds.min + new Vector3(playerSize, 0, playerSize);
                maxBounds = fieldCollider.bounds.max - new Vector3(playerSize, 0, playerSize);
            }
        }

    }

    // Update is called once per frame
    void Update()
    {
        if (fieldMoveScript.field_touch == true)    
        {
        //表示する
        GetComponent<Renderer>().enabled = true; //表示
        } else{
        //隠す
        GetComponent<Renderer>().enabled = false; //非表示
        }

        Vector3 move = Vector3.zero;

        // 矢印キーで移動
        if (Input.GetKey(KeyCode.UpArrow))
        {
            move += transform.TransformDirection(Vector3.forward * moveSpeed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            move += transform.TransformDirection(Vector3.back * moveSpeed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            move += transform.TransformDirection(Vector3.left * moveSpeed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            move += transform.TransformDirection(Vector3.right * moveSpeed * Time.deltaTime);
        }

        // 仮の新しい位置
        Vector3 newPosition = transform.position + move;

        // 位置を制限 (プレイヤーのサイズ分、内側に調整)
        newPosition.x = Mathf.Clamp(newPosition.x, minBounds.x, maxBounds.x);
        newPosition.z = Mathf.Clamp(newPosition.z, minBounds.z, maxBounds.z);

        // 移動
        transform.position = newPosition;
        
    }


}

```

# (3) plantボタンで植物を選択枠へ出現させる
![スクリーンショット 2025-03-23 22.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959805/47362f34-fc61-4eaa-ad60-d23f159260e9.png)


(1)SelectFlameの子オブジェクトに、plantを設置
(2)SelectFlameに子オブジェクトを取得させる。
(3)スペースキーを押された時に出現させる。
メモ　▶︎スクリプト名：SelectFlame_Spawner, アタッチオブジェクト：SelectFlame

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

public class SelectFlame_Spawner : MonoBehaviour
{
    // plantオブジェクトの取得
    public GameObject Plant;

    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown("space") ==true)
        {
            Instantiate(Plant, this.transform.position, this.transform.rotation);
        }
    }
}
```

(4)出現タイミングの変更：スペースキーが押された時　→　「plant」押された時に変更

(4-1)Event_triggerの追加
注釈:OnClickとEvent Triggerの違い
>On Clickはボタンを押されて離された時という条件が実行された時に、イベントを発生させるものだが、Event Triggerはボタンを押した時、ボタンを離した時など、条件を細かく設定できることが特徴！
pointerUp  → ポインター(ここではボタン)を押した状態から離れた時に発生するイベント
pointerDown  → ポインター(ここではボタン)を押した時に発生するイベント


```
    public void PlantButtonDown()
    {
            Instantiate(Plant, this.transform.position, this.transform.rotation);
    }
```