2017-02-01 9 views
1

いいえ、私は一致を表すpreafabを作った。メインカメラに付属のスクリプトでその製(破壊されてきた私は15試合、unity 3d make prefabオブジェクトを破棄できない/ unclibable

using UnityEngine; 
using System.Collections; 
using System; 
using UnityEngine.UI; 

public class LoadMatches : MonoBehaviour { 
public GameObject match; 

GameObject[] matchArray = new GameObject[15]; 

void Start() { 

    DrawMatches(); 
} 
private void DrawMatches() 
{ 


    int y = 4; 
    int x = -4; 
    int n = 0; 
      for (int i = -4; i < 5; i += 2) 
     { 
      for (int j = x; j < y + 1; j += 2) 
      { 
      matchArray[n]=Instantiate(match, new Vector3(j, i, 0), Quaternion.identity) as GameObject; 
      matchArray[n].name= Convert.ToString(n); 
      n++; 
      } 
      y = y - 1; 
      x = x + 1; 
     } 
} 

}

を作って、私は、オブジェクトのオブジェクトをクリックすると、私はこの

enter image description here

を得ました)しかし、私はいくつかの行のオブジェクトをクリックすると、そのオブジェクトだけが他の行のmatcherは、ボタンが押されるまでundestroyable/unclickabeになっていなければならないことを破壊することができます。

using UnityEngine; 
using System.Collections; 
using System; 
using UnityEngine.UI; 
public class DragDrop : MonoBehaviour { 
float x; 
float y; 
public GameObject match; 
private txtGameOver txtGO; 

private void Awake() 
{ 
    txtGO = GameObject.FindObjectOfType<txtGameOver>(); 
} 

private void Start() 
{ 
    match.GetComponent<Rigidbody2D>().constraints = RigidbodyConstraints2D.FreezeAll; 

} 
void Update(){ 
    x = Input.mousePosition.x; 
    y = Input.mousePosition.y; 
} 
void OnMouseDrag(){ 
    transform.position = Camera.main.ScreenToWorldPoint(new Vector3(x,y,10.0f)); 
} 
void OnMouseDown() 
{ 
    var boxes = GameObject.FindGameObjectsWithTag("Match"); 

    SelectMatches(match); 
    if (boxes.Length == 1) 
    { 
     txtGO.GameOverText(); 
    } 
} 
void SelectMatches (GameObject m) 
{ 
    int n; 
    n = Convert.ToInt32(m.name); 
    if (n>=0 && n<=4) 
    { 

     Destroy(m); 
    } 
    else if (n > 4 && n <= 8) 
    { 
     Destroy(m); 
    } 
    else if (n > 8 && n <= 11) 
    { 
     Destroy(m); 
    } 
    else if (n > 11 && n <= 13) 
    { 
     Destroy(m); 
    } 
    else if (n==14) 
    { 
     Destroy(m); 
    } 
} 

}

私の質問は、スクリプトでunclikable/undestroyableいくつかのオブジェクトを作った方法です。

答えて

2

これを行うことによって。あなたのすべては、ちょうど行う必要がありDontDestroy としてゲームオブジェクトタグであり、それは私が

+0

興味深いaproach。私はその解決策を試みます。 –

+0

この回答が有用な場合は、@IstarEnkiの矢印をクリックしてください。ありがとう – TheGinxx009

+0

私は矢印を入れたが、私のreputaionは15以下であり、私はclikcが記録するmsgを得た。しかしThnks、私は考えを得た。今は私のスクリプトにこのソリューションを採用しようとしています。私はいくつかの問題を抱えています。なぜなら、異なる名前の0〜14のオブジェクトを15個メダルしているからです。今はそれらを手助けする方法を磨いています。 –

0

オブジェクトの特定の場所で入力を取り込まないようにUIを設定できますが、基本的にカーソルがオブジェクトの上にないのでクリックできません。それは私がそれを助けるために見つける/考えられる最も近いものです。その概念/スクリプト^について

public class GraphicIgnoreRaycast : MonoBehaviour, ICanvasRaycastFilter 
{ 
    public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) 
    { 
     return false; 
    } 
} 

詳細情報:破壊されることができないようにオブジェクトを設定するようhttp://answers.unity3d.com/questions/816861/46-ui-image-is-capturing-clicks-how-to-prevent.html

は、それはUnityがないだけではない何か。

1

[OK]を助けた

object[] obj = GameObject.FindObjectsOfType(typeof (GameObject)); 
    foreach (object o in obj) { 
     GameObject go = (GameObject) o; 

     //if the GO is tagged with DontDestroy, ignore it. (Cameras, Managers, etc. which should survive loading) 
     //these kind of GO's shouldn't have an ObjectIdentifier component! 
     if(go.CompareTag("DontDestroy")) { 
      Debug.Log("Keeping GameObject in the scene: " + go.name); 
      continue; 

     } 
     Destroy(go); 
    } 

希望undestroyableだ、私はそれが非常に簡単です解決策を作りました。機能選択試合で

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

public class DragDrop : MonoBehaviour { 
float x; 
float y; 
public GameObject match; 
private txtGameOver txtGO; 
public GameObject[] GameObjectArray; 

private void Awake() 
{ 
    txtGO = GameObject.FindObjectOfType<txtGameOver>(); 
} 

private void Start() 
{ 
    GameObjectArray = GameObject.FindGameObjectsWithTag("Match"); 
} 
void Update(){ 
    x = Input.mousePosition.x; 
    y = Input.mousePosition.y; 
} 
void OnMouseDrag(){ 
transform.position = Camera.main.ScreenToWorldPoint(new Vector3(x,y,10.0f)); 
} 
void OnMouseDown() 
{ 
    var boxes = GameObject.FindGameObjectsWithTag("Match"); 

    SelectMatches(match); 
    if (boxes.Length == 1) 
    { 
     txtGO.GameOverText(); 
    } 
} 
void SelectMatches (GameObject m) 
{ 
    int n; 
    n = Convert.ToInt32(m.name); 
    if (n>=0 && n<=4) 
    { 
     if (GameObjectArray[n].CompareTag("Match") && GlobaVariables.Control==false) 
     { 
      ChangeTag(0, 4,n); 

     } 
     else if (GameObjectArray[n].CompareTag("Destroy") && GlobaVariables.Control == true) 
     { 
      GameObjectArray[n].SetActive(false); 
     } 

    } 
    else if (n > 4 && n <= 8) 
    { 
     if (GameObjectArray[n].CompareTag("Match") && GlobaVariables.Control == false) 
     { 
      ChangeTag(5, 8, n); 

     } 
     else if (GameObjectArray[n].CompareTag("Destroy") && GlobaVariables.Control == true) 
     { 
      GameObjectArray[n].SetActive(false); 
     } 
    } 
    else if (n > 8 && n <= 11) 
    { 
     if (GameObjectArray[n].CompareTag("Match") && GlobaVariables.Control == false) 
     { 
      ChangeTag(9, 11,n); 

     } 
     else if (GameObjectArray[n].CompareTag("Destroy") && GlobaVariables.Control == true) 
     { 
      GameObjectArray[n].SetActive(false); 
     } 
    } 
    else if (n > 11 && n <= 13) 
    { 
     if (GameObjectArray[n].CompareTag("Match") && GlobaVariables.Control == false) 
     { 
      ChangeTag(12, 13, n); 

     } 
     else if (GameObjectArray[n].CompareTag("Destroy") && GlobaVariables.Control == true) 
     { 
      GameObjectArray[n].SetActive(false); 
     } 
    } 
    else if (n==14) 
    { 
     if (GameObjectArray[n].CompareTag("Match") && GlobaVariables.Control == false) 
     { 
      ChangeTag(14, 14, n); 

     } 
     else if (GameObjectArray[n].CompareTag("Destroy") && GlobaVariables.Control == true) 
     { 
      GameObjectArray[n].SetActive(false); 
     } 
    } 
} 
void ChangeTag(int p, int z,int n) 
{ 

    for (int i = p; i <z+1; i++) 
    { 

     GameObjectArray[i].tag = "Destroy"; 
     Debug.Log(GameObjectArray[i].tag + " " + GameObjectArray[i]); 


    } 

    GameObjectArray[n].SetActive(false); 
    GlobaVariables.Control = true; 

} 
} 

私は/ Matcesオブジェクトを再生すると、オブジェクトの数/名前を確認しているwhicでゲームオブジェクトの配列を確認してください。私はオブジェクトの位置を知っていて、その上では範囲内のオブジェクトのみを名前に変更します。私はボタンを押すまでタグを変えるブレークブロックであるグローバルスタティックブール変数を作りました。配列のために私はオブジェクトを破壊しないでください、SetActvie truはより良いです。なぜなら、このaproachは配列を混乱させないからです。

関連する問題