当前位置: 首页 > 知识库问答 >
问题:

生存期变量对于子画面的所有实例都是相同的,而不是在实例化新实例时重置

何聪
2023-03-14

我正在编写一个游戏,当玩家冲进一个盒子时,它应该会破碎,而不是在一定时间后消失的碎片精灵。

using System.Collections;

使用系统。集合。泛型;使用UnityEngine

公共类破碎件:单行为{ // 开始在第一帧更新之前调用

public float moveSpeed = 3f;
private Vector3 moveDirection;

public float deceleration = 5f; 

public float lifetime = 3f;

public SpriteRenderer theSR;
public float fadeSpeed = 2.5f;


void Start()
{
    moveDirection.x = Random.Range(-moveSpeed, moveSpeed);
    moveDirection.y = Random.Range(-moveSpeed, moveSpeed);
}

// Update is called once per frame
async void Update()
{
    transform.position += moveDirection * Time.deltaTime;

    moveDirection = Lerp(moveDirection, Vector3.zero, deceleration * Time.deltaTime);

    lifetime -= Time.deltaTime;

    if(lifetime < 0)
    {
        theSR.color=new Color(theSR.color.r, theSR.color.g, theSR.color.b, Mathf.MoveTowards(theSR.color.a, 0f, fadeSpeed * Time.deltaTime));

        if(theSR.color.a == 0f)
        {
            Destroy(gameObject);
        }

        
    }
}

}

using System.Collections;

使用系统。集合。泛型;使用UnityEngine

public class Breakables:MonoBehaviour { public game object[]broken pieces;

public int maxPieces = 5;

public bool shouldDropItem;

public GameObject[] itemsToDrop;
public float itemDropPercent;
// Start is called before the first frame update
void Start()
{
    
}

// Update is called once per frame
void Update()
{
    
}

private void OnTriggerEnter2D(Collider2D other)
{
    if(other.tag == "Player")
    {
        if(PlayerController.instance.dashCounter > 0)
        {
        Destroy(gameObject);
         // show broken pieces
        int piecesToDrop = Random.Range(1, maxPieces);
       
        for(int i = 0; i < piecesToDrop; i++)
        {
            int randomPiece= Random.Range(0, brokenPieces.Length);

            Instantiate(brokenPieces[randomPiece], transform.position, transform.rotation);
        }

        // drop items
        if(shouldDropItem)
        {
            float dropChance = Random.Range(0f,100f);

            if(dropChance < itemDropPercent)
            {
                int randomItem = Random.Range(0, itemsToDrop.Length);

                Instantiate(itemsToDrop[randomItem], transform.position, transform.rotation);
            }
        }
        }
    }
}

}

共有1个答案

宋昕
2023-03-14

所以你的实际误差与时间无关。

“游戏对象”类型的对象已被销毁,但您仍在尝试访问它。这个错误是在我打破盒子时出现的

这是因为你破坏了你的物体

Destroy(gameObject);

然后在它已经被摧毁后,尝试访问它的转换位置

只需事先缓存位置和旋转

var position = transform.position;
var rotation = transform.rotation;
Destroy(gameObject);
// show broken pieces
int piecesToDrop = Random.Range(0, maxPieces) + 1;
   
for(int i = 0; i < piecesToDrop; i++)
{
    int randomPiece= Random.Range(0, brokenPieces.Length);

    Instantiate(brokenPieces[randomPiece], position, rotation);
}

或确保将

Destroy (gameObject);

这样它就不会在销毁它之后试图访问它的任何属性。

 类似资料:
  • 我想创建一个由TreeNode对象组成的Tree数据结构。根是一个TreeNode。每个TreeNode都有一个父TreeNode和一个子TreeNode列表。树是递归构建的。我简化了代码,使这个例子不太难。函数工作正常。当没有TreeNode的child_values并且返回空列表时,递归结束。这非常好。 每个TreeNode的子节点成员不正确。脚本收集列表(node_list)中的所有Tree

  • 对于这个示例: null 是否有类似这样的语句用于此检查?或者我应该使用

  • 我有三节课。 > 一个抽象类,abstractA有一个受保护的构造函数 一个类扩展了抽象类,父类有两个构造函数 一个类扩展父类,子类有一个构造函数 这是从抽象类扩展而来的父类 这是从父类扩展而来的子类 自定义组件看起来像这样 所以,当spring为特定测试实例化所有bean时,它会正确地实例化子bean。当父bean被实例化时,它得到2个bean[父和子]。所以,我最终会出错, 类型父的多个bea

  • 问题内容: 我对Python 3中的和类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。 我目前的理解是,每个类(除外)都从称为的基类继承。但是每个类(包括)也是该类的一个实例,它是自身的实例,并且也从继承。 我的问题是: 是否有一个原因/设计决策,为什么是的实例并从中继承?对象的/ class是否也可以是对象本身? 类()如何成为其自身的实例? 哪一个是真正的基类或? 我一直认为这将是最“

  • 我有一个类(消息),它有一些实例变量。其中一个变量的类型是interface(MessageContent)。在将这个类序列化为json的过程中,我希望使用依赖于实现的名称序列化这个变量(内容)。下面是详细信息的代码片段: 我的要求是,当消息序列化并且内容类型为VideoMessage时,序列化的json应该是: 如何通过fasterxml Jackson实现?我正在使用ObjectMapper的

  • 问题内容: 目标:实施标准的“设置” GUI窗口。类别位于 ListView左侧,而相应选项位于Pane右侧。 (请忽略具有重复类别的明显错误;仍在处理) 在此处输入图片说明 我有一个用于整体“设置”窗口的主窗口,其中包含 ListView带有所有类别的设置。窗口的右侧 具有AnchorPane, 当从列表中选择一个类别时,用于为每个类别加载单独的FXML文件。 当用户选择类别时,我需要他们能够编