Проблема с повторяющимися объектами в массиве, когда уже в массиве - PullRequest
0 голосов
/ 02 мая 2019

Когда игрок движется вперед, создается экземпляр краски GameObject, который сохраняется в массиве, даже если краска объекта уже находится в массиве.

Как остановить сохранение краски объекта в массивеболее одного раза?

public GameObject[] array;
public GameObject paint;
int temp = 0;
private RaycastHit hit;

public float speed = 10f;                             
public Text levelText;
public GameObject paint;
float maxdistance = 0.51f; 
Vector3 newtargetposition;
bool pos;

private void FixedUpdate()
{

 if(Physics.Raycast(transform.position,transform.TransformDirection(Vector3.forw ard,out hit, maxdistance))
 {
    if (hit.collider.gameObject.tag == "Obstacle")
    {
            move = false;                                                                         
    }

    if (move)
    {
        PlayerMove();                         
    }
 }
}

public void PlayerMove()
{
    if (move)
    {
      vector3 positions = transform.position + new Vector3(0f, -0.5f,0f); //when player move then paint instantiate y position 

        array[temp] = Instantiate<GameObject>(paint, position, Quaternion.identity);
        temp++;

        newtargetposition=position;
        Debug.Log("newtargetposiiton:" + newtargetposition);

        if (temp == 150)    
        {
            if (newtargetposition == position)
            {
                //what can i do here
                //i dont want to paint here because position store in newtargetposition,it is repeat
                //array[temp]--;
                Debug.Log("newtargetpositions:" + newtargetposition);
                //temp--;
            }
            gameOver.SetActive(true);
            SceneManager.LoadScene(1);
        }
    }
}

Как удалить повторяющиеся экземпляры объекта и повторяющиеся объекты в массиве?

1 Ответ

0 голосов
/ 10 мая 2019

Я думаю, что вы бы поступили так, хотя я знаю, что циклы очень неэффективны, возможно, это лучший способ решить вашу проблему на данный момент.

if (move)
        {
         //boolean is created to return if paint is in the array
            bool blnUnique = true;
            foreach (GameObject temp in array)
            {
                if (temp == paint)
                {
                    blnUnique = false;
                }
            }

            if (blnUnique)
            {

                vector3 positions = transform.position + new Vector3(0f, -0.5f, 0f); //when player move then paint instantiate y position 

                array[temp] = Instantiate<GameObject>(paint, position, Quaternion.identity);
                temp++;

                newtargetposition = position;
                Debug.Log("newtargetposiiton:" + newtargetposition);

                if (temp == 150)
                {
                    if (newtargetposition == position)
                    {
                        //what can i do here
                        //i dont want to paint here because position store in newtargetposition,it is repeat
                        //array[temp]--;
                        Debug.Log("newtargetpositions:" + newtargetposition);
                        //temp--;
                    }
                    gameOver.SetActive(true);
                    SceneManager.LoadScene(1);
                }
            }
        }

И удалить все повторяющиеся значения.

    private void CleanArray(ref GameObject[] array)
    {
        GameObject[] goTemp = new GameObject[0];
        bool blnFirst = true;
        bool blnTracker = false;
        foreach (GameObject V in array)
        {
            //This is to make sure that there is some value in temp to test against

            if (blnFirst)
            {

                Array.Resize(ref goTemp, goTemp.Length + 1);
                goTemp[goTemp.Length - 1] = V;
                blnFirst = false;
            }

            blnTracker = true;

            foreach (GameObject T in Temp)
            {
                if (T == V)
                {
                    blnTracker = false;
                    break;
                }
            }

            if(blnTracker)

            {
                Array.Resize(ref goTemp, goTemp.Length + 1);
                goTemp[goTemp.Length - 1] = V;
            }
        }
        array = goTemp;
    }

Лично это было бы так, как я бы поступил, но я обычно не работаю с Unity и GameObjects, поэтому он может работать не так, как задумано, но функция удаления и перехватывать оба работают для целых чисел и меньшеменее сложные типы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...