質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.83%

  • Unity

    3391questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1133questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • Unity2D

    694questions

個数制限し、時間が経てば消去し値をーする方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 130

GOTOken

score 22

回数制限を設けて、生成時に上昇値を+し、Destroy後に上昇した値を-する。というような仕組みを考えています。
ですが、-にする処理が思った通りに動いてくれませんでした。解決案みたないなものを考えていますが、あまり良くない。そもそも間違っていると思うので、解決方法をご教授して頂けると嬉しいです。
考えているスクリプト
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

public int tsumikiLimit;//限界値
public int tsumikiPoint;//上昇値


void Stat()
 {
  tsumikiPoint = 0;//限界値初期化
 }

void Update()
  {
   tsumiki();
  }

void tsuimiki()
 { 
 tsumikiPoint ++;
  if(tsumikiLimit < tsumikiPoint)
  {
   //生成処理
  }
  else
  {
   Destory(tsumikiObj);//積み木消去
   tsumikiPoint--;
  }
 }

実際に実装してみたスクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;


public class Player : MonoBehaviour
{
    #region Variable Declaration
    [SerializeField]
    public int MAXJumpCounter;//ジャンプ回数制限数設定用変数(固定数)
    public int JumpCounterPoint;//ジャンプ回数上昇値設定用変数
    public float jumpPower;//Player跳躍力変数
    public float DestroyTsumikiTimer;//積み木削除時間計測用変数
    public GameObject tsumikiPrefabs;//積み木Prefabs格納
    public Vector2 tsumikiGeneratePosition = new Vector2();//積み木生成位置
    public float Playerspeed;
    public int MAX_S;
    [Range(0, 100)] public float PlayerMaxspeed;//プレイヤー移動制限最大値変数
    [Range(0, 100)] public int level;
    public bool isGround;
    public int tsumiki_GenerateLimit;//積み木生成限界数変数
    public int tsumiki_GeneratePoint;//積み木生成個数宣言用変数

    private bool tsumikiParentFlag;
    private Rigidbody2D rg2d;//コンポーネント取得用変数
    private float moveX = 1;
    private float moveY;
    private Rigidbody2D rb;
    private GameObject tsumikiObj;
    #endregion
    #region Start
    // Use this for initialization
    void Start()
    {
        tsumiki_GeneratePoint = 0;
        JumpCounterPoint = 0;
        isGround = false;
        rb = GetComponent<Rigidbody2D>();
    }
    #endregion
    #region Update
    private void Update()
    {


        //moveY = Input.GetAxis("Vertical") * Playerspeed;
        //Vector3 direction = new Vector2(moveX, 0);
        tsumiki();
        PlayerMove();
        GameObjectDestroy();
    }
    #endregion
    #region Fixed
    private void FixedUpdate()
    {

        //rb.velocity = new Vector3(moveX, 0);
        //関数呼び出し


    }
    #endregion
    #region playermove
    private void PlayerMove()
    {
        //if(Input.GetAxisRaw("Horizontal")<0)
        //{
        //    Playerspeed = 1;
        //}else
        //{
        //    Playerspeed = -1;
        //}
        //ADキーで移動
        float x = Input.GetAxisRaw("Horizontal") * Playerspeed;
        rb.velocity = (new Vector2(x, rb.velocity.y));
        if (x >= PlayerMaxspeed)
        {
            //MAX値のまま移動する処理
            // Debug.Log("MAX!!");
            x = MAX_S;
        }
        Vector3 scale = transform.localScale;
        if (x >= 0)
        {
            scale.x = 4;//右向き
        }
        else

        {
            scale.x = -4;//左向き
        }
        transform.localScale = scale;

        //Wキーでジャンプする
        if (Input.GetKeyDown(KeyCode.W))
        {
            //
            JumpCounterPoint++;//回数上昇
            //回数制限設定変数が回数値よりも上に達した場合false
            if (MAXJumpCounter > JumpCounterPoint)
            {
                // rb.velocity = Vector2.zero;
                rb.AddForce(Vector2.up * jumpPower);
            }
            // Debug.Log("Jump");
        }
    }
    #endregion
    #region tsumiki
    private void tsumiki()
    {
        // Spaceキーを入力されたら、積み木Prefabを複製する。
        if (Input.GetKeyDown(KeyCode.Space))
        {

            transform.position += new Vector3(0f, 0.5f, 0f);
            Vector2 position = transform.position + transform.up * tsumikiGeneratePosition.y + transform.right * tsumikiGeneratePosition.x;
            tsumiki_GeneratePoint++;//生成時に積み木生成個数増加

            if (tsumiki_GenerateLimit > tsumiki_GeneratePoint)//限界値達成したら通らない
            {
                tsumikiObj = Instantiate(tsumikiPrefabs, position, Quaternion.identity); //積み木Prefabの複製
                            tsumikiParentFlag = true;
            Debug.Log("true");
            var Tsumiki_Pos = transform.localPosition;//Player座標取得

            tsumikiObj.transform.parent = GameObject.Find("Player").transform;//積み木Prefabを親子関係に
            Debug.Log("くっついた!");

            }

        }
        else if (Input.GetKeyUp(KeyCode.Space))
        {
            tsumikiParentFlag = false;
            tsumikiObj.transform.parent = null;//親子関係解除
            Debug.Log("解除");
        }
    }
#endregion
    private void GameObjectDestroy()
    {

        Destroy(tsumikiObj, DestroyTsumikiTimer);//設定時間到達後積み木削除
        tsumiki_GeneratePoint = -1;//積み木生成数を-していく

    }
#region
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.name == "DeadPoint")
        {
            Life.LIFE_SYSTEM -= 3;

           // Destroy(gameObject);
        }
        if(collision.gameObject.name == "ClearPoint")
        {
            SceneManager.LoadScene("GameClear");
        }
        if(collision.gameObject.tag =="Ground")
        {
            JumpCounterPoint = 0;
        }
    }
}
#endregion
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2018/05/30 13:23

    質問は何でしょうか

    キャンセル

  • GOTOken

    2018/05/30 15:44

    あ!ごめんなさい。生成可能回数が回数制限に達したら生成出来なくし、Destroyした後にDestroyした分だけ生成可能回数をマイナスするようにしたいです。

    キャンセル

回答 1

checkベストアンサー

+1

積み木削除タイミングをDestroyの引数で遅らせる代わりに、コルーチンで遅らせるのはどうでしょう。
これなら、積み木数を実際に積み木削除が発生したタイミングで減らすことも可能になるかと思います。

    // 省略

    private void Update()
    {


        //moveY = Input.GetAxis("Vertical") * Playerspeed;
        //Vector3 direction = new Vector2(moveX, 0);
        tsumiki();
        PlayerMove();
        // GameObjectDestroy(); // 削除機能はtsumikiメソッドに組み込む
    }

    // 省略

    // メソッドを追加
    // Destroyの引数で削除を遅延させる代わりに、コルーチン機能で遅延させるようにし、
    // 積み木が実際に削除されたタイミングで積み木数カウンターを減らすことにしました
    // わざわざメソッド引数として削除対象の積み木を渡し、Destroy(tsumiki)としていますが
    // これをDestroy(tsumikiObj)としてしまうとまずいことになるかと思います
    // tsumikiObjは新しい積み木が生成されるたびに、その新しい積み木を参照するよう書き換わるので
    // 削除したい積み木とは別の、新しい方の積み木を削除してしまう可能性があります
    private IEnumerator DestroyTsumikiAfterAWhile(GameObject tsumiki)
    {
        yield return new WaitForSeconds(DestroyTsumikiTimer); // 設定時間経過後再開
        Destroy(tsumiki); // 積み木削除
        tsumiki_GeneratePoint--; // このタイミングで積み木カウンターをデクリメント
    }

    #region tsumiki
    private void tsumiki()
    {
        // Spaceキーを入力されたら、積み木Prefabを複製する。
        if (Input.GetKeyDown(KeyCode.Space))
        {

            transform.position += new Vector3(0f, 0.5f, 0f);
            Vector2 position = transform.position + transform.up * tsumikiGeneratePosition.y + transform.right * tsumikiGeneratePosition.x;
            // tsumiki_GeneratePoint++;//生成時に積み木生成個数増加 // この位置でカウンターを増やすと、個数が限界値に到達していてもカウンターが増えてしまうのでまずいのではないでしょうか?

            if (tsumiki_GenerateLimit > tsumiki_GeneratePoint)//限界値達成したら通らない
            {
                tsumiki_GeneratePoint++;//生成時に積み木生成個数増加 // カウンターインクリメントをこの位置に引っ越し
                tsumikiObj = Instantiate(tsumikiPrefabs, position, Quaternion.identity); //積み木Prefabの複製
                StartCoroutine(DestroyTsumikiAfterAWhile(tsumikiObj)); // 生成された積み木の削除を予約
                tsumikiParentFlag = true;
                Debug.Log("true");
                var Tsumiki_Pos = transform.localPosition;//Player座標取得

                tsumikiObj.transform.parent = GameObject.Find("Player").transform;//積み木Prefabを親子関係に
                Debug.Log("くっついた!");
            }
        }
        else if (Input.GetKeyUp(KeyCode.Space))
        {
            tsumikiParentFlag = false;
            tsumikiObj.transform.parent = null;//親子関係解除
            Debug.Log("解除");
        }
    }
    #endregion

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 06:25

    ありがとうございます!!
    無事解決することが出来ました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    Unityでのナビゲーションラインの実装について

    unityでナビゲーションラインを実装したいと思っています。 画像中央の青いラインみたいなもの、プレイヤーから特定のオブジェクトに対して線を引き、方向を教える。 現在LineRe

  • 解決済

    Unityでベルトコンベア作りたい

    前提・実現したいこと Unityでベルトコンベア上を走り障害物を躱してゴールを目指すゲーム 発生している問題・エラーメッセージ ベルトコンベア上の物体(障害物・Playe

  • 解決済

    Unity3dのTerrain上に作った木の座標の求め方

    前提・実現したいこと Unityを始めたばかりの者です。 HierarchyビューにあるTerrainに、木を作るブラシで木をたくさん作りましたが、それらの木の座標を求める

  • 解決済

    Unity シューティングゲームでの移動について

    前提・実現したいこと Unityの学習でiPhone用シューティングゲームを制作しています。 自機の移動について質問させてください。 以下のサイト様のサンプルコードを参考

  • 解決済

    untiy terrain機能で作った壁が登れてしまう

    unityで、terrainで作った壁を登れなくしたいです。 キャラクターがジャンプ中に移動方向に進むと、terrainで作った急斜面な山や壁を登れてしまいます。 滑り落ち

  • 解決済

    プレイヤーが操作を行った後のゲームオブジェクトの座標の取得

    前提・実現したいこと Unity2Dで、 プレイヤーがゲームオブジェクトを操作して移動させる。 ↓ プレイヤーがスペースキーを押したら、その時のゲームオブジェクトの座標

  • 解決済

    Unityでの線形補間について

    前提・実現したいこと Unity5.6でオブジェクトを持ち、 線形補間で一定間隔スライドさせようとしています。 プレイヤーがオブジェクトを持ち スライドさせるところまで

  • 受付中

    Unity C# でオブジェクトを移動させたい。

    前提・実現したいこと 今、Unityで横スクロール型の2Dゲームを作っています。 ゲームの内容は、Enterを押してゲームスタート、キャラクターがゴールまで自動で走り、 シフトを押

同じタグがついた質問を見る

  • Unity

    3391questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1133questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • Unity2D

    694questions