なぜか映像ガビガビ、黒い線が出ちゃってる。。気にしないでね。
育成ゲーム制作記録 パート②
パート①はこちら
<目次>
(1) 畑内の時のみ選択枠を表示。
(2) 選択枠を動かせるようにする。
(3) plantボタンで植物を選択枠へ出現させる
続きはパート③で作成します。
(0)今回のプロトタイプ
(1)畑内の時のみ選択枠を表示
①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ボタンで植物を選択枠へ出現させる
(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);
}