Nano Hash - криптовалюты, майнинг, программирование

Не удается уничтожить компонент Transform ошибки

У меня есть код Unity, который создает сетку (всего 2 ^ измерения) одного префаба с использованием сценария С#. После изменения значения «размеры» (пока через редактор) я хотел бы, чтобы все префабы были удалены до того, как Unity обновится с помощью OnValidate. Похоже, что Unity не хочет удалять предыдущий набор объектов, представляющих пространство, поскольку эти объекты по-прежнему доступны на панели иерархии Unity:

Возникли проблемы с уничтожением объектов в единстве. ошибка говорит:

«Невозможно уничтожить компонент преобразования« XXX ». Если вы хотите уничтожить игровой объект, вместо этого вызовите« Уничтожить »игровой объект. Уничтожение компонента преобразования не разрешено».

(см. функцию DeletePoints/GeneratePoints. График вызовов: OnValidate --> GeneratePoints(->DeletePoints, ->GeneratePointsHelper)

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

public class BinarySpacePointGenerator : MonoBehaviour {
    private const int UNITY_DRAW_SPACE_DIMENSIONALITY = 3;
    /**
     * These values denote spacings for the three dimensional space between binary points.
     */
    public float xoff, yoff, zoff;
    public float scale;
    public Transform pointPrefab;
    /**
     *  The current dimensionality of binary space to be displayed.
     */
    public int dimensions;

    /* 
     *  The container of points that represent our B space. 
     */
    private List<Transform> points;

    // Use this for initialization
    void Start () {
        xoff = 1.0f;
        yoff = 1.0f;
        zoff = 1.0f;
        scale = 0.25f;
        dimensions = 2;
        points = new List<Transform> ();
        GeneratePoints ();
    }

    void OnValidate() {
        /* ensure dimensionality */
        /* TODO: set up a B^0 space. */
        if (dimensions < 1) {
            dimensions = 1;
        }
        if (dimensions >= 13) {
            dimensions = 12;
        }
        /* ensure that our spacing sizes are valid */
        if (xoff <= 0.0f) {
            xoff = 1.0f;
        }
        if (yoff <= 0.0f) {
            yoff = 1.0f;
        }
        if (zoff <= 0.0f) {
            zoff = 1.0f;
        }
        if (scale <= 0.0f) {
            scale = 0.25f;
        }

        /* now that we've ensured the dimensionality, we can change the space */
        GeneratePoints ();
    }

    private void DeletePoints() {
        for (int i = 0; i < transform.childCount; i++) {
            Destroy (transform.GetChild (0));
        }
        points.RemoveRange(0, points.Count); /* pop off */
    }

    /**
     *  Instantiates the points field based on the value of dimensions at call-time.
     */ 
    private void GeneratePoints() {
        DeletePoints ();

        int[] vectorProto = new int[dimensions];
        for (int i = 0; i < dimensions; i++) {
            vectorProto [i] = 0;

        }
        GeneratePointsHelper(vectorProto, dimensions);
    }

    /** 
     * 
     * GeneratePointsHelper
     * 
     * Description: Recursively builds the binary space B^n.
     * 
     * Parameters:
     *      int[]   vector:  the proto-type of all higher dimensions for the current trail.
     *      int     n:  the number of dimensions left to traverse from this recursion step.
     * 
     * Recursion Termination/Description:  
     *      When n == 0, which means that we have created a unique vector.
     * 
     */
    private void GeneratePointsHelper(int[] vector, int n) {
        if (n == 0) {
            // use vector to set Sphere object
            var point = Instantiate(pointPrefab);
            Vector3 pointPosition = new Vector3 ();
            pointPosition.x = 0;
            pointPosition.y = 0;
            pointPosition.z = 0;
            for (int i = 0; i < dimensions; i++) {

                int d = (i / UNITY_DRAW_SPACE_DIMENSIONALITY);

                if ( i % UNITY_DRAW_SPACE_DIMENSIONALITY == 0) {
                    pointPosition.x += (xoff * vector[i] * Mathf.Pow(2, d));
                } else if (i % UNITY_DRAW_SPACE_DIMENSIONALITY == 1) {
                    pointPosition.y += (yoff * vector[i] * Mathf.Pow(2, d));
                } else if (i % UNITY_DRAW_SPACE_DIMENSIONALITY == 2) {
                    pointPosition.z += (zoff * vector[i] * Mathf.Pow(2, d));
                }
            }
            point.localPosition = pointPosition;
            point.localScale = new Vector3 (scale, scale, scale);
            point.parent = transform;
            points.Add (point);

        } else {
            vector[dimensions-n] = 0;
            GeneratePointsHelper (vector, n - 1);

            vector[dimensions-n] = 1;
            GeneratePointsHelper (vector, n - 1);
        }
    }
}
15.11.2016


Ответы:


1

В настоящее время вы уничтожаете GameObjects с помощью Destroy (transform.GetChild (0));.

Проблема в том, что transform.GetChild возвращает Transform, и вы не можете уничтожить Transform. С последней версией Unity вы получите эту ошибку:

Невозможно уничтожить компонент преобразования «GameObject». Если вы хотите уничтожить игровой объект, вместо этого вызовите «Уничтожить» на игровом объекте. Уничтожение компонента преобразования не допускается.

Вам нужно получить доступ к GameObject из Transform, а затем уничтожить его. Вам также нужно использовать i в GetChild вместо 0, так как Destroy вызывается в цикле for, и это, вероятно, то, что вы пытаетесь сделать.

for (int i = 0; i < transform.childCount; i++)
{
    Destroy(transform.GetChild(i).gameObject);
}

Я бы хотел, чтобы все префабы были удалены до того, как Unity обновится с помощью OnValidate.

Затем вызовите DeletePoints() в первой строке функции void OnValidate(){}.

15.11.2016
  • Я бы хотел, чтобы все префабы были удалены, это то, на чем вы действительно должны сосредоточиться в этой проблеме. Скорее, это проблема неправильного использования Unity API для управления GameObjects. Насколько я понимаю, это действительно не похоже на относительное размещение цикла Destroy (child) (независимо от того, размещен ли у меня этот код цикла в «OnValidate» или в функции, подчиненной «OnValidate»). Я думаю, что в конечном итоге происходит то, что я неправильно приготовил цикл Destroy(child), используя неправильные объекты/функции. Если это не так, пожалуйста, исправьте мое понимание :) 18.11.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..