Can't destroy Transform component of error

时间秒杀一切 提交于 2019-12-11 08:31:12

问题


I've got some Unity code that creates a grid (2^dimensions in total) of one prefab using a c# script. Upon changing the 'dimensions' value (via the editor for now), I'd like to see all the prefabs get deleted, before Unity updates using OnValidate. Unity does not seem to want to delete the previous set of objects representing the space, as these objects are still accessible in the Unity Hierarchy Pane:

Having trouble destroying objects in unity. the error says:

"Can't destroy Transform component of 'XXX'. If you want to destroy the game object, please call 'Destroy' on the game object instead. Destroying the transform component is not allowed."

(refer to function DeletePoints/GeneratePoints. Call Graph: 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);
        }
    }
}

回答1:


You are currently destroying the GameObjects with Destroy (transform.GetChild (0));.

The problem is that transform.GetChild returns a Transform and you cannot destroy a Transform. With the lastest version Unity, you will get this error:

Can't destroy Transform component of 'GameObject'. If you want to destroy the game object, please call 'Destroy' on the game object instead. Destroying the transform component is not allowed.

You need to access the GameObject from the Transform then destroy it. You also need to use i in the GetChild instead of 0 since Destroy is being called in the for loop and that's likely what you are trying to do.

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

I'd like to see all the prefabs get deleted, before Unity updates using OnValidate

Then call DeletePoints() in the first line of the void OnValidate(){} function.



来源:https://stackoverflow.com/questions/40602430/cant-destroy-transform-component-of-error

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!