Visual Studio 如何修复场景重拍后物体重新生成的问题

lnlaulya  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(194)

我期望达到的目标是,一个物体被点击后会被破坏,而刚刚被点击的物体会出现在背包里,但现在的问题是,当物体被破坏后,当我再次回到同一场景时,被破坏的物体又会重新出现,这让我的玩家不停地点击,无数次地捡起同样的物体。
这是我当前的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GetItem : MonoBehaviour
{

    public item thisItem;
    public inventory playerBag;

    private void OnMouseDown()
    {
        AddNewItem();
        Debug.Log(+1);

        DontDestroyOnLoad(gameObject);
        Destroy(gameObject);
    }

    public void AddNewItem()
    {

        if (!playerBag.itemList.Contains(thisItem))
        {
            playerBag.itemList.Add(thisItem);
        }
        else
        {
            thisItem.itemHeld += 1;
        }
        inventorymanager.RefreshItem();
    }

  
}

这个bug困扰我很久了,希望有专业人士能解答这个问题,谢谢。

2guxujil

2guxujil1#

为游戏中的对象创建一个产卵器,让它存储一个预制的对象,并使它看起来像编辑器中的对象。在开始或任何逻辑发生后产卵对象,当玩家离开Map时跟踪产卵时间-将常规的c#对象附加到每个产卵器以跟踪其状态,将这些对象存储在某个地方并在需要时更新)。

ldioqlga

ldioqlga2#

你可以给予每个对象一个唯一的ID,并在PlayerPrefs或任何更高级的数据库等中跟踪它们。
然后你只需检查相应的ID是否已知=〉销毁你的对象。

public class PickableItem : MonoBehaviour
{
    [SerializeField] private string _uniqueID;

if UNITY_EDITOR private void OnValidate(){ if(PrefabUtility.IsPartOfAnyPrefab(this)){ _uniqueID = null;返回; }

if(string.isNullOrWhiteSpace(_uniqueID))
        {
            _uniqueID = Guid.NewGuid().ToString();
        }
    }

    private void Reset()
    {
        OnValidate();
    }

结束编号

// On spawn check if this ID was already picked up earlier
    private void Awake()
    {
        if(PlayerPrefs.HasKey(_uniqueID))
        {
            Destroy(gameObject);
        }
    }

    // Call this when you pick up the item so it is added to the "known" IDs
    public void PickUp()
    {
        PlayerPrefs.SetInt(_uniqueID, 1);
        PlayerPrefs.Save();
    }
}

这是一个非常简单的获取ID的“愚蠢”示例方法,但仍然可能导致冲突,与预制件等有问题。还有更复杂的解决方案like e.g. this one-原理保持不变

相关问题