c# - 无法破坏错误的Transform组件

标签 c# unity3d

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

无法统一销毁对象。错误说:

"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."

(引用函数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);
        }
    }
}

最佳答案

您当前正在使用 Destroy (transform.GetChild (0)); 销毁游戏对象。

问题是 transform.GetChild 返回 Transform并且您不能破坏 Transform。使用最新版本的 Unity,您将收到此错误:

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.

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

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

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

关于c# - 无法破坏错误的Transform组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40602430/

相关文章:

android - 如何解决移动设备上 UDP 的高延迟问题

android - Play 商店错误 "You uploaded an APK that is signed with an insecure certificate"

c# - 在 C++ 中为同一公式获取与在 C# 中不同的值

c# - 有没有更好的方法在 C# 中截断 DateTime?

c# - 使用首选键统一移动玩家

java - Unity3D - 使用 Gradle 构建 Android AppBundle 失败

c# - 是否有用于 C# 的 CSS 解析器?

c# - 将带有对象的集合发送到另一个列表

c# - 使用 SIMD 查找 Span<ushort> 中是否存在 'ushort' 的最快方法?

ios - redirect_uri_mismatch iOS上的Unity Google API