ここから本文です

Unity(2D)でゲームを制作していますが、ボタンの挙動が おかしいので、以下のコ...

i_a********さん

2018/2/1213:47:09

Unity(2D)でゲームを制作していますが、ボタンの挙動が
おかしいので、以下のコードに問題があるかもしれません。
以下のコードの問題点と改善すべき点を教えてください。

Unityのバージョンは2017.3です。

ゲームは、次のように動作させたいです。

1. 空中にブロック自動生成
(三角形か四角形がランダムで生成)
2. ボタン(uGUI)を左クリックしたらブロック落下
3. 地面に落ちたブロックがスリープ状態になる
4. 1に戻る

しかし、現在の動作は、次のようになっています。

1.空中に ブロック自動生成
(三角形か四角形がランダムで生成)
2. ボタン(uGUI)を左クリックしたらブロック落下
3. 地面に落ちたブロックがスリープ状態になる
4. 空中にブロック自動生成
5. ボタン(uGUI)をクリックしたらブロックが落下
__せずに、新たなブロックが空中に生成される
(生成されたブロックはまれに落下する)
6. 5が繰り返される

以下、C#スクリプトのコードです。

----------------------------------------------------------------------------

C# Script <Create.cs>

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

public class Create : MonoBehaviour
{
__GameObject Tri;
__GameObject Quad;
__public GameObject[] Train;
__public int num;
__public int moving;

__void Start()
__{
____//movingの初期値は-1
____moving = -1;
__}

__void FixedUpdate()
__{
____Tri=GameObject.Find ("Triangle(Clone)");
____Quad=GameObject.Find ("Quadrilateral(Clone)");
____//0から1までのランダムな値を取得
____num = Random.Range (0, 2);
____//ブロックの出現場所などを設定
____Vector3 placePosition = new Vector3 (0.0f, 3.0f, 0.0f);
____Quaternion q = new Quaternion ();
____q = Quaternion.identity;
____//movingが-1なら実行
____if (moving == -1)
____{
______//次に生成されるブロックが落下しないようにする
______Train [num].GetComponent<Rigidbody2D> ().gravityScale = 0.0f;
______//ブロックを生成
______Instantiate (Train [num], placePosition, q);
______//ブロックが生成されたらmovingを0にする
______moving = 0;
____}
__}
}

----------------------------------------------------------------------------

C# Script <FallButton.cs>

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

public class FallButton : MonoBehaviour
{
__GameObject go;
__GameObject Tri;
__GameObject Quad;
__public int moving;

__void Start()
__{
__}

__void Update()
__{
____go = GameObject.Find ("GameObject");
____moving = go.GetComponent<Create> ().moving;
____Tri = GameObject.Find ("Triangle(Clone)");
____Quad = GameObject.Find ("Quadrilateral(Clone)");
__}

__//ボタンクリック時
__public void OnClick()
__{
____//movingが0かつTriが存在していれば実行
____if (moving == 0 && Tri != null)
____{
______//Triに重力を与える
______Tri.GetComponent<Rigidbody2D> ().gravityScale = 0.5f;
______//<Create.cs>のmovingを1にする
______go.GetComponent<Create> ().moving = 1;
____}
____//movingが0かつQuadが存在していれば実行
____else if (moving == 0 && Quad != null)
____{
______//Quadに重力を与える
______Quad.GetComponent<Rigidbody2D> ().gravityScale = 0.5f;
______//<Create.cs>のmovingを1にする
______go.GetComponent<Create> ().moving = 1;
____}
__}

__public void FixedUpdate()
__{
____//movingが1かつTriが存在していて、Triがスリープ状態なら実行
____if (moving == 1 && Tri != null && Tri.GetComponent<Rigidbody2D>().IsSleeping())
____{
______//<Create.cs>のmovingを-1にする
______go.GetComponent<Create> ().moving = -1;
____}
____//movingが1かつQuadが存在していて、Quadがスリープ状態なら実行
____else if (moving == 1 && Quad != null && Quad.GetComponent<Rigidbody2D>().IsSleeping())
____{
______//<Create.cs>のmovingを-1にする
______go.GetComponent<Create> ().moving = -1;
____}
__}
}

閲覧数:
40
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

dea********さん

2018/2/1218:23:18

あんまり精査していませんが、対象となるオブジェクトを
Tri=GameObject.Find ("Triangle(Clone)");
のように名称で指定しています。

1つ目が生成された時はこれでいいですが、2つ目以降に生成されるオブジェクトも同名となります。
同名オブジェクトが複数ある状態でGameObject.Findをすると、どれが選ばれるかは不確定です(Unityが勝手に選ぶ)。なので動作し終わったブロックが対象になり、予期せぬ動きになっているのではないでしょうか。

GameObject.Findの対象となる名前のオブジェクトが常に1つだけになるように、動作終了済みのオブジェクトの名前を変える等してみてください。

質問した人からのコメント

2018/2/16 23:09:36

ご指摘通り、その可能性が高いと思いました。
改善できるように、動作終了済みのオブジェクト名を
変更するように、コードを書き換えます。
ご回答ありがとうございました!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる