C# 统一脚本:被摧毁后在同一位置繁殖(3秒后)

C# 统一脚本:被摧毁后在同一位置繁殖(3秒后),c#,unity3d,C#,Unity3d,嘿,有人知道如何制作一个C#脚本,让对象在被子弹摧毁后重新生成吗。使用 gameobject.SetActive(false); 您可以使用来执行此操作。如果您使用销毁(您的对象),对象确实会被删除,并且您会失去访问权限。 您可以使用gameobjectobj=Instantiate(…)将对象制作成一个预置,并在您想要的地方生成它 Obj包含对新生成的对象的引用,而不是对预置的引用,这意味着您以后可以再次使用Destroy(Obj)有多种方法可以存档此文件 请注意,您也可以完全不使用协同程序

嘿,有人知道如何制作一个C#脚本,让对象在被子弹摧毁后重新生成吗。使用

gameobject.SetActive(false);
您可以使用来执行此操作。

如果您使用
销毁(您的对象),对象确实会被删除,并且您会失去访问权限。
您可以使用
gameobjectobj=Instantiate(…)将对象制作成一个预置,并在您想要的地方生成它

Obj包含对新生成的对象的引用,而不是对预置的引用,这意味着您以后可以再次使用
Destroy(Obj)

有多种方法可以存档此文件

请注意,您也可以完全不使用协同程序工作,但这通常很糟糕

专用浮点计时器;
私人布尔是秘密的;
私有游戏对象克隆;
私有对象(游戏对象obj)
{
isresponding=true;
定时器=3f;
//首先克隆当前对象
var clone=实例化(obj,obj.transform.position,obj.transform.rotation,objtransform.parent);
//禁用克隆
clone.SetActive(false);
//销毁原件
销毁(obj);
}
私有void更新()
{
如果(数学近似值(计时器,0f))返回;
timer+=Time.deltaTime;
如果(计时器>0)返回;
//将克隆设置为活动
clone.SetActive(true);
定时器=0;
}

更简单的是协同程序:

private void DestroyAndRespawn(GameObject obj)
{
    StartCoroutine(DestroyAndRespawnRoutine(obj));
}

private IEnumerator DestroyAndRespawnRoutine(GameObject obj)
{
    // first make a clone of the current Object
    var clone = Instantiate(obj, obj.transform.position, obj.transform.rotation, objtransform.parent);

    // disable the clone
    clone.SetActive(false);

    // Destroy the original
    Destroy(obj);

    // Wait 3 seconds
    yield return new WaitForSeconds(3f);

    // Set the clone active
    clone.SetActive(true);
}

但是你为什么要摧毁这个物体并使它重生呢?您只需禁用它,然后再重新启用它

private void DestroyAndRespawn(GameObject obj)
{
    StartCoroutine(DestroyAndRespawnRoutine(obj));
}

private IEnumerator DestroyAndRespawnRoutine(GameObject obj)
{
    // disable the obj
    obj.SetActive(false);

    // Wait 3 seconds
    yield return new WaitForSeconds(3f);

    // Set the objactive
    obj.SetActive(true);
}

更新

由于要在碰撞时调用此选项:

您将需要另一个游戏对象作为重新启用/启用的管理器,因为您不能将该脚本附加到您禁用的对象->还将禁用该脚本,并且永远不会重新启用该对象

  • 创建一个新的空游戏对象,如“重生管理器”
  • 创建新脚本RespawnManager.cs:

    public class RespawnManager : MonoBehaviour
    {
        public static RespawnManager Singleton;
    
        private void Awake()
        {
            if(Singleton)
            {
                enabled = false;
                return;
            }
    
            Singleton = this;
        }
    
        private void DestroyAndRespawn(GameObject obj)
        {
            StartCoroutine(DestroyAndRespawnRoutine(obj));
        }
    
        private IEnumerator DestroyAndRespawnRoutine(GameObject obj)
        {
            // disable the obj
            obj.SetActive(false);
    
            // Wait 3 seconds
            yield return new WaitForSeconds(3f);
    
            // Set the objactive
            obj.SetActive(true);
        }
    }
    
  • 你可以在碰撞时这样称呼它

    OnCollisionEnter(Collision obj)
    {
        if (obj.gameObject.name != "bullet") return;
    
        // pass this GameObject to the manager
        RespawnManager.Singleton.DestroyAndRespawn(gameObject);
    }
    

  • 公平地说,这个问题很糟糕。但是OP实际上想让它反过来:摧毁一个对象->记住它的位置->在这个位置(重新)繁殖。。。。无论这意味着什么,如果op想要使用完全相同的obj,那么他需要像其他答案所说的那样使用setActive,他不能使用Destroy。公平地说,这个问题非常糟糕。但是,为了使这篇文章成为一个有效的完整答案,你能详细说明一下吗。目前它介于评论和回答之间:我试过了,但对我的场景不起作用,谢谢
    不起作用
    不是一个很有力的论点。为什么它对你不起作用?它没有任何代码来解释只对我的子弹做出反应并在被摧毁后重新生成时间如何确保它只在被子弹击中后才起作用我把它作为家庭作业留给你。使用系统集合;使用System.Collections.Generic;使用UnityEngine;公共类destroy:monobhavior{//用于初始化void Start(){}//每帧调用一次更新void Update(){}void OnCollisionEnter(Collision obj){if(obj.gameObject.name==“bullet”){destroy(gameObject);}}}我应该将原始代码附加到哪里,对象或空的游戏对象如果你将这个代码附加到对象本身,你要销毁它可能不是一个好主意,对吗?如果您宁愿使用最后一部分来禁用对象,也不愿意将代码直接放入
    OnCollisionEnter
    方法中