0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

育成ゲームをunityで作る

Posted at

新規プロジェクト.gif
なぜか映像ガビガビ、黒い線が出ちゃってる。。気にしないでね。

育成ゲーム制作記録 パート②

パート①はこちら

<目次>
(1) 畑内の時のみ選択枠を表示。
(2) 選択枠を動かせるようにする。
(3) plantボタンで植物を選択枠へ出現させる
続きはパート③で作成します。

(0)今回のプロトタイプ

(1)畑内の時のみ選択枠を表示

スクリーンショット 2025-03-19 10.36.03.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

(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);
    }
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?