不能销毁错误的Transform组件

本文关键字:Transform 组件 错误 不能 | 更新日期: 2023-09-27 18:17:51

我有一些Unity代码,使用c#脚本创建一个预制网格(总共2^维)。在改变"尺寸"值(通过编辑器现在),我希望看到所有的预制件被删除,在Unity使用OnValidate更新之前。Unity似乎并不想删除之前代表空间的对象集,因为这些对象仍然可以在Unity Hierarchy窗格中访问:

无法统一破坏物体。错误提示:

"不能破坏'XXX'的Transform组件。如果你想销毁游戏对象,请在游戏对象上调用"destroy"代替。不允许破坏transform组件。"

(参考函数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);
        }
    }
}

不能销毁错误的Transform组件

你正在用Destroy (transform.GetChild (0));破坏GameObjects

问题是transform.GetChild返回Transform,而您不能破坏Transform。使用最新版本的Unity,你会得到这个错误:

不能破坏"GameObject"的Transform组件。如果你想销毁游戏对象,请在游戏对象上调用"destroy"代替。不允许破坏transform组件。

你需要从Transform访问GameObject,然后销毁它。您还需要在GetChild中使用i而不是0,因为Destroy在for循环中被调用,这可能是您想要做的。

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

我希望看到所有的预制件被删除,在Unity更新之前使用OnValidate

然后调用void OnValidate(){}函数第一行的DeletePoints()

Destroy(Player_RayCasting.LastTower);

更改为

Destroy(Player_RayCasting.LastTower.gameObject);

在我的例子中,我正在访问一个转换所以我必须将其更改为一个游戏对象来删除它