Unity物体销毁无法成功实现

本人正在尝试制作一个数字华容道的限时模式,意图使玩家在限定时间内尽可能多的复原4*4棋盘,
每完成一次复原后需要销毁本次生成的数字块(数字块为预制件)并重新生成,数字块生成在场景中的画布上,而销毁工作意图通过脚本挂载给场景中的空对象来控制 (该空对象为场景子对象,非画布子对象),但是并没有成功实现,想要知道该如何通过Destroy方法来完成或是采用其他方法?

你可以利用克隆和删除来完成
比如我要克隆游戏物体

public GameObject prefab; // 要克隆的预制体

void Start()
{
    Vector3 position = new Vector3(1.2f, 1f, 1f); // 设置克隆物体的位置,你可以用随机数来进行随机多个指定位置克隆
    GameObject clone = Instantiate(prefab, position, Quaternion.identity); // 将选中的物体克隆到设置好的位置上面
}

克出来的物体他就是你设置克隆的预制体预制体上挂了脚本他也会把脚本克隆过去
删除物体就是通过检测复原后
你可以参考这个代码

public GameObject prefab; // 要克隆的预制体
private GameObject cloneObject; // 存储克隆出来的物体

void Start()
{
    Vector3 position = new Vector3(1.2f, 1f, 1f); // 设置克隆物体的位置
    cloneObject = Instantiate(prefab, position, Quaternion.identity); // 将选中的物体克隆到设置好的位置上面
}

// 在 Update 或者其他适当的地方检测是否需要销毁克隆出来的物体
void CheckDestroy()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Destroy(cloneObject); // 销毁克隆出来的物体
    }
}

上面的代码就是按了空格会销毁克隆出来的物体,但是不会删除要克隆的那个物体,你可以参考我的代码来进行自行添加删改达到你想要的效果
如果有帮助请采纳


using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour
{
    Transform targetPrefab;
    public Transform targetParent;
    public Button resetButton;
    void Start()
    {
        targetPrefab = Resources.Load<Transform>("prewfabs/ImageTarget1");
        resetButton.onClick.AddListener(ResetTargetObj);
        CreateTargetObjPosition(); 
    }
    void ResetTargetObj()
    {
        for (int i = 0; i < targetParent.childCount; i++)
        {
            Destroy(targetParent.GetChild(i).gameObject);
        }
        CreateTargetObjPosition();
    }
    void CreateTargetObjPosition()
    {
        int  targetNum = UnityEngine.Random.Range(3, 6);
        for (int i = 0; i < targetNum; i++)
        {
            Transform _tra = Instantiate(targetPrefab, targetParent);
            _tra.localPosition = Vector3.one * UnityEngine.Random.Range(3, 6);
            _tra.gameObject.SetActive(true);
        }
        Debug.Log("**1**:" + targetParent.transform.GetChild(0).localPosition);
    }
}

来自NewBing和LP的编写:

在Unity中用Destroy()方法来销毁游戏对象。根据描述,希望在完成数字华容道的复原后销毁数字块。以下是一个示例脚本,演示如何在完成复原后销毁数字块:

using UnityEngine;

public class PuzzleManager : MonoBehaviour
{
    public GameObject puzzlePiecePrefab;
    public Transform canvas;

    private GameObject currentPuzzlePiece;

    private void Start()
    {
        GeneratePuzzlePiece();
    }

    private void Update()
    {
        // 假设当完成复原后按下某个按键(例如空格键)销毁当前数字块
        if (Input.GetKeyDown(KeyCode.Space))
        {
            DestroyPuzzlePiece();
            GeneratePuzzlePiece();
        }
    }

    private void GeneratePuzzlePiece()
    {
        currentPuzzlePiece = Instantiate(puzzlePiecePrefab, canvas);
    }

    private void DestroyPuzzlePiece()
    {
        if (currentPuzzlePiece != null)
        {
            Destroy(currentPuzzlePiece);
        }
    }
}

在这个示例中,puzzlePiecePrefab是您的数字块预制件,canvas是数字块生成的父对象(画布)。GeneratePuzzlePiece()方法实例化一个新的数字块,并将其设置为currentPuzzlePiece变量的引用。DestroyPuzzlePiece()方法使用Destroy()方法销毁当前的数字块。

可以根据需求,在适当的时机调用DestroyPuzzlePiece()方法并生成新的数字块。

在场景中,确保脚本已经正确挂载在场景子对象上,并且将正确的预制件和父对象分配给脚本中的变量。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
您可以尝试在数字块生成的脚本中添加销毁逻辑,而不是通过另一个空对象来控制销毁。具体来说,可以在数字块的脚本中添加一个计时器,在时间到达一定值时销毁该数字块。以下是一个简单的示例代码:

public class NumberBlock : MonoBehaviour
{
    public float lifetime = 5.0f; // 数字块的生命周期,单位为秒

    private float timer = 0.0f; // 计时器

    void Update()
    {
        // 更新计时器
        timer += Time.deltaTime;

        // 如果计时器超过了生命周期,销毁数字块
        if (timer >= lifetime)
        {
            Destroy(gameObject);
        }
    }
}

在上面的示例代码中,我们在数字块的脚本中添加了一个计时器timer,并在Update方法中更新计时器的值。当计时器超过了数字块的生命周期lifetime时,我们调用Destroy方法销毁该数字块。

您可以将上面的代码添加到数字块的脚本中,并在生成数字块时将该脚本挂载到数字块的游戏对象上。这样,当时间到达一定值时,数字块将会自动销毁。

希望这个解决方案能够帮助您解决问题。如果您还有其他疑问,请随时提出。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

你可以在生成数字块的脚本中保存生成的数字块对象的引用,在完成复原后通过销毁该引用来销毁数字块。例如:

public GameObject numberBlockPrefab; // 数字块预制件
private GameObject currentNumberBlock; // 当前生成的数字块

void GenerateNumberBlock() {
    // 生成数字块并保存引用
    currentNumberBlock = Instantiate(numberBlockPrefab, canvasTransform);
}

void DestroyNumberBlock() {
    // 销毁数字块
    Destroy(currentNumberBlock);
}

当完成复原后,调用DestroyNumberBlock()方法即可销毁当前生成的数字块。注意确保生成数字块的脚本和销毁数字块的脚本在同一个游戏对象上,以便能够访问到保存的数字块对象引用。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
实现数字块销毁可以使用Unity内置的Destroy函数,例如:

在生成数字块的脚本中,可以增加一个销毁函数,在生成数字块后,将其挂载到空对象下作为子对象(为方便起见,以下称其为空对象),并记录下来,然后通过空对象的销毁函数销毁该数字块:

public class NumberBlockGenerator : MonoBehaviour {
    
    public GameObject numberBlockPrefab;
    public float timeLimit;
    private GameObject currentBlock;
    private GameObject emptyObject;

    void Start() {
        emptyObject = GameObject.Find("EmptyObject");
        GenerateNumberBlock();
    }

    void GenerateNumberBlock() {
        currentBlock = Instantiate(numberBlockPrefab, transform.position, Quaternion.identity);
        currentBlock.transform.SetParent(emptyObject.transform);
    }

    void DestroyNumberBlock() {
        Destroy(currentBlock);
    }

    public void BlockCorrect() {
        DestroyNumberBlock();
        GenerateNumberBlock();
    }

    void Update() {
        if (Time.timeSinceLevelLoad >= timeLimit) {
            //销毁空对象以及其下子对象(即所有数字块)
            Destroy(emptyObject);
            //根据需求进行其他操作,例如重新开始游戏
        }
    }
}

在数字块移动脚本中,当数字块移动完成时,调用数字块生成脚本中的BlockCorrect函数,用于销毁当前数字块并生成新的数字块:

public class NumberBlockMover : MonoBehaviour {

    public float moveSpeed;
    public NumberBlockGenerator numberBlockGenerator;

    private bool isMoving = false;
    private Vector3 targetPosition;

    void Update() {
        if (isMoving) {
            transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
            if (transform.position == targetPosition) {
                isMoving = false;
                numberBlockGenerator.BlockCorrect();
            }
        }
    }

    public void MoveTo(Vector3 target) {
        targetPosition = target;
        isMoving = true;
    }
}

注意,销毁空对象时,其下所有子对象都会被销毁,包括数字块、画布等。如果需要保留其他对象,可以将其放置在空对象之外,或者将数字块放置在独立的子对象中,通过该子对象来控制销毁。
如果我的回答解决了您的问题,请采纳!