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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

6825閲覧

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

GOTOken

総合スコア54

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/05/30 01:40

編集2018/05/30 06:47

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

c#

1public int tsumikiLimit;//限界値 2public int tsumikiPoint;//上昇値 3 4 5void Stat() 6 { 7 tsumikiPoint = 0;//限界値初期化 8 } 9 10void Update() 11 { 12 tsumiki(); 13 } 14 15void tsuimiki() 16 { 17 tsumikiPoint ++; 18 if(tsumikiLimit < tsumikiPoint) 19 { 20 //生成処理 21 } 22 else 23 { 24 Destory(tsumikiObj);//積み木消去 25 tsumikiPoint--; 26 } 27 }

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

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5 6 7public class Player : MonoBehaviour 8{ 9 #region Variable Declaration 10 [SerializeField] 11 public int MAXJumpCounter;//ジャンプ回数制限数設定用変数(固定数) 12 public int JumpCounterPoint;//ジャンプ回数上昇値設定用変数 13 public float jumpPower;//Player跳躍力変数 14 public float DestroyTsumikiTimer;//積み木削除時間計測用変数 15 public GameObject tsumikiPrefabs;//積み木Prefabs格納 16 public Vector2 tsumikiGeneratePosition = new Vector2();//積み木生成位置 17 public float Playerspeed; 18 public int MAX_S; 19 [Range(0, 100)] public float PlayerMaxspeed;//プレイヤー移動制限最大値変数 20 [Range(0, 100)] public int level; 21 public bool isGround; 22 public int tsumiki_GenerateLimit;//積み木生成限界数変数 23 public int tsumiki_GeneratePoint;//積み木生成個数宣言用変数 24 25 private bool tsumikiParentFlag; 26 private Rigidbody2D rg2d;//コンポーネント取得用変数 27 private float moveX = 1; 28 private float moveY; 29 private Rigidbody2D rb; 30 private GameObject tsumikiObj; 31 #endregion 32 #region Start 33 // Use this for initialization 34 void Start() 35 { 36 tsumiki_GeneratePoint = 0; 37 JumpCounterPoint = 0; 38 isGround = false; 39 rb = GetComponent<Rigidbody2D>(); 40 } 41 #endregion 42 #region Update 43 private void Update() 44 { 45 46 47 //moveY = Input.GetAxis("Vertical") * Playerspeed; 48 //Vector3 direction = new Vector2(moveX, 0); 49 tsumiki(); 50 PlayerMove(); 51 GameObjectDestroy(); 52 } 53 #endregion 54 #region Fixed 55 private void FixedUpdate() 56 { 57 58 //rb.velocity = new Vector3(moveX, 0); 59 //関数呼び出し 60 61 62 } 63 #endregion 64 #region playermove 65 private void PlayerMove() 66 { 67 //if(Input.GetAxisRaw("Horizontal")<0) 68 //{ 69 // Playerspeed = 1; 70 //}else 71 //{ 72 // Playerspeed = -1; 73 //} 74 //ADキーで移動 75 float x = Input.GetAxisRaw("Horizontal") * Playerspeed; 76 rb.velocity = (new Vector2(x, rb.velocity.y)); 77 if (x >= PlayerMaxspeed) 78 { 79 //MAX値のまま移動する処理 80 // Debug.Log("MAX!!"); 81 x = MAX_S; 82 } 83 Vector3 scale = transform.localScale; 84 if (x >= 0) 85 { 86 scale.x = 4;//右向き 87 } 88 else 89 90 { 91 scale.x = -4;//左向き 92 } 93 transform.localScale = scale; 94 95 //Wキーでジャンプする 96 if (Input.GetKeyDown(KeyCode.W)) 97 { 98 // 99 JumpCounterPoint++;//回数上昇 100 //回数制限設定変数が回数値よりも上に達した場合false 101 if (MAXJumpCounter > JumpCounterPoint) 102 { 103 // rb.velocity = Vector2.zero; 104 rb.AddForce(Vector2.up * jumpPower); 105 } 106 // Debug.Log("Jump"); 107 } 108 } 109 #endregion 110 #region tsumiki 111 private void tsumiki() 112 { 113 // Spaceキーを入力されたら、積み木Prefabを複製する。 114 if (Input.GetKeyDown(KeyCode.Space)) 115 { 116 117 transform.position += new Vector3(0f, 0.5f, 0f); 118 Vector2 position = transform.position + transform.up * tsumikiGeneratePosition.y + transform.right * tsumikiGeneratePosition.x; 119 tsumiki_GeneratePoint++;//生成時に積み木生成個数増加 120 121 if (tsumiki_GenerateLimit > tsumiki_GeneratePoint)//限界値達成したら通らない 122 { 123 tsumikiObj = Instantiate(tsumikiPrefabs, position, Quaternion.identity); //積み木Prefabの複製 124 tsumikiParentFlag = true; 125 Debug.Log("true"); 126 var Tsumiki_Pos = transform.localPosition;//Player座標取得 127 128 tsumikiObj.transform.parent = GameObject.Find("Player").transform;//積み木Prefabを親子関係に 129 Debug.Log("くっついた!"); 130 131 } 132 133 } 134 else if (Input.GetKeyUp(KeyCode.Space)) 135 { 136 tsumikiParentFlag = false; 137 tsumikiObj.transform.parent = null;//親子関係解除 138 Debug.Log("解除"); 139 } 140 } 141#endregion 142 private void GameObjectDestroy() 143 { 144 145 Destroy(tsumikiObj, DestroyTsumikiTimer);//設定時間到達後積み木削除 146 tsumiki_GeneratePoint = -1;//積み木生成数を-していく 147 148 } 149#region 150 private void OnCollisionEnter2D(Collision2D collision) 151 { 152 if (collision.gameObject.name == "DeadPoint") 153 { 154 Life.LIFE_SYSTEM -= 3; 155 156 // Destroy(gameObject); 157 } 158 if(collision.gameObject.name == "ClearPoint") 159 { 160 SceneManager.LoadScene("GameClear"); 161 } 162 if(collision.gameObject.tag =="Ground") 163 { 164 JumpCounterPoint = 0; 165 } 166 } 167} 168#endregion 169 170

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/05/30 04:23

質問は何でしょうか
GOTOken

2018/05/30 06:44

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

回答1

0

ベストアンサー

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

C#

1 // 省略 2 3 private void Update() 4 { 5 6 7 //moveY = Input.GetAxis("Vertical") * Playerspeed; 8 //Vector3 direction = new Vector2(moveX, 0); 9 tsumiki(); 10 PlayerMove(); 11 // GameObjectDestroy(); // 削除機能はtsumikiメソッドに組み込む 12 } 13 14 // 省略 15 16 // メソッドを追加 17 // Destroyの引数で削除を遅延させる代わりに、コルーチン機能で遅延させるようにし、 18 // 積み木が実際に削除されたタイミングで積み木数カウンターを減らすことにしました 19 // わざわざメソッド引数として削除対象の積み木を渡し、Destroy(tsumiki)としていますが 20 // これをDestroy(tsumikiObj)としてしまうとまずいことになるかと思います 21 // tsumikiObjは新しい積み木が生成されるたびに、その新しい積み木を参照するよう書き換わるので 22 // 削除したい積み木とは別の、新しい方の積み木を削除してしまう可能性があります 23 private IEnumerator DestroyTsumikiAfterAWhile(GameObject tsumiki) 24 { 25 yield return new WaitForSeconds(DestroyTsumikiTimer); // 設定時間経過後再開 26 Destroy(tsumiki); // 積み木削除 27 tsumiki_GeneratePoint--; // このタイミングで積み木カウンターをデクリメント 28 } 29 30 #region tsumiki 31 private void tsumiki() 32 { 33 // Spaceキーを入力されたら、積み木Prefabを複製する。 34 if (Input.GetKeyDown(KeyCode.Space)) 35 { 36 37 transform.position += new Vector3(0f, 0.5f, 0f); 38 Vector2 position = transform.position + transform.up * tsumikiGeneratePosition.y + transform.right * tsumikiGeneratePosition.x; 39 // tsumiki_GeneratePoint++;//生成時に積み木生成個数増加 // この位置でカウンターを増やすと、個数が限界値に到達していてもカウンターが増えてしまうのでまずいのではないでしょうか? 40 41 if (tsumiki_GenerateLimit > tsumiki_GeneratePoint)//限界値達成したら通らない 42 { 43 tsumiki_GeneratePoint++;//生成時に積み木生成個数増加 // カウンターインクリメントをこの位置に引っ越し 44 tsumikiObj = Instantiate(tsumikiPrefabs, position, Quaternion.identity); //積み木Prefabの複製 45 StartCoroutine(DestroyTsumikiAfterAWhile(tsumikiObj)); // 生成された積み木の削除を予約 46 tsumikiParentFlag = true; 47 Debug.Log("true"); 48 var Tsumiki_Pos = transform.localPosition;//Player座標取得 49 50 tsumikiObj.transform.parent = GameObject.Find("Player").transform;//積み木Prefabを親子関係に 51 Debug.Log("くっついた!"); 52 } 53 } 54 else if (Input.GetKeyUp(KeyCode.Space)) 55 { 56 tsumikiParentFlag = false; 57 tsumikiObj.transform.parent = null;//親子関係解除 58 Debug.Log("解除"); 59 } 60 } 61 #endregion

投稿2018/05/30 20:35

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GOTOken

2018/05/30 21:25

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問