Как удалить или переместить 3D-сборные клоны с тем же именем и тегом при столкновении? - PullRequest
0 голосов
/ 02 февраля 2020

То, чего я пытаюсь достичь, - это когда мои префабы создаются в моей зоне возрождения, когда они сталкиваются, тогда один либо перемещается от другого, либо уничтожается, а другой возрождается заменяет его. Я пытался использовать теги, чтобы другие прикосновения были готовы. Я пытался получить префабы имен. Я не знаю, что я делаю не так. Я просто перетащил свой игровой объект в папку prefabs, чтобы получить prefabs. Вот мой код:

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

public class SpawnArea : MonoBehaviour
{
    int counter = 0;
    public int max;
    //public GameObject objects;
    public GameObject[] objects;
    public GameObject[] objectsPrefabs;

    public Vector3 size;
    public Vector3 center;
    int xRotation = 0;

    // Start is called before the first frame update
    void Start()
    {
        Spawn();
    }

    // Update is called once per frame
    void Update()
    {
        if (counter < max) 
        {
            Spawn();
        }
    }

    //void Spawn() 
    //{
    //    Vector3 pos = center + new Vector3(Random.Range(-size.x / 2, size.x / 2), Random.Range(-size.y / 2, size.y / 2), Random.Range(-size.z / 2, size.z / 2));

    //    Instantiate(objects, pos, Quaternion.Euler(0, xRotation, 0));
    //    xRotation += 45;
    //    counter++;
    //}

    void Spawn()
    {
        objects = new GameObject[objectsPrefabs.Length];

        Vector3 pos = center + new Vector3(Random.Range(-size.x / 2, size.x / 2), Random.Range(-size.y / 2, size.y / 2), Random.Range(-size.z / 2, size.z / 2));

        for (int i = 0; i < objectsPrefabs.Length; i++)
        {
            objects[i] = Instantiate(objectsPrefabs[i], pos, Quaternion.Euler(0, xRotation, 0)) as GameObject;
        }
        xRotation += 45;
        counter++;
    }

    void OnCollisionEnter(Collision collision)
    {

        for (int i = 0; i < objectsPrefabs.Length; i++)
        {
            if (collision.transform.CompareTag("spawnwall"))
            {
                //if (objects[i].gameObject)
                //{
                Destroy(objectsPrefabs[i]);
                counter--;
                Spawn();
                //}
            }
        }

    }



    private void OnDrawGizmosSelected()
    {
        Gizmos.color = new Color(1, 0, 0, 0.5f);
        Gizmos.DrawCube(center, size);
    }
}

1 Ответ

0 голосов
/ 02 февраля 2020

В соответствии с документами о столкновении , вы должны обратиться к collision.gameObject, чтобы ссылаться на другой объект, на который ссылается столкновение. Прямо сейчас вы сравниваете тег spawnwall с тегом игрового объекта, к которому принадлежит этот компонент.

При постановке вопросов было бы также полезно знать следующее: 1. Желаемый результат 2. Текущие симптомы

У меня также есть следующие проблемы: 1. Вы уверены, что у ваших учеников инициализированы правильные данные? Мне кажется, что все они начинаются с C# значений по умолчанию. 2. Вы хотите, чтобы объекты внутри области делали то, что вы описали, когда они (а) касаются друг друга или (б) когда они касаются границ области.

То, как пишется ваш текущий код, заставляет меня думать что у вас есть куча объектов внутри прямоугольной области angular. Затем, когда объекты сталкиваются с границами прямоугольной области angular, они должны быть уничтожены.

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