gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:07:02 24 4
gpt4 key购买 nike

我有一些 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com