2017-02-01 14 views
1

Хорошо, я сделал preafab, представляющий матч. С сценарий прилагается к основной камере я сделал 15 матчей,Единство 3d make prefab object unestroyable/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

Когда я нажимаю на объекте объекта должны быть уничтожены (сделано что), но когда я нажимаю на объект в какой-то строке, я должен сделать, что только этот объект может быть уничтожен, все остальные матчи в другой строке должны стать неубываемыми/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 в сценарии.

ответ

2

Делая это. Вы все просто нужно сделать, это тег геймобжекты, как DontDestroy И это неуничтожимой

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); 
    } 

Надежда я помог

+0

Интересный aproach. Я попробую это решение. –

+0

Пожалуйста, нажмите на стрелку вверх, если этот ответ полезен @IstarEnki. Спасибо – TheGinxx009

+0

Я поставил стрелку, но моя репутация меньше 15, и я получил сообщение, которое clikc запишет. Но Тинкс, у меня появилась идея. Сейчас я пытаюсь принять это решение для своего сценария. У меня есть некоторые проблемы, потому что у меня 15 объектов с разными именами от 0 до 14, и теперь я понимаю, как их приблизить. –

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

Хорошо, я сделал решение очень просто.

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; 

} 
} 

В функции выберите спички проверить массив геймобжектов в whic являются Matces/Воспроизведение объекта и проверьте номер/название объекта. Я знал положение объекта и на этом меняю имя только объекта, который находится в диапазоне. Я сделал глобальную статическую переменную bool, которая прерывает блок, изменяя тег, пока я не нажму кнопку. Из-за массива я не использую объект destroy, SetActvie tru лучше, потому что этот aproach не путается с массивом.

 Смежные вопросы

  • Нет связанных вопросов^_^