2301_81303860 2024-04-07 00:03 采纳率: 33.3%
浏览 72
已结题

塔防游戏报错怎么解决

防御塔在打死一个目标的瞬间时不时会报两个错,怎么改都不行,还是报错
昨天非常多问题,今天刚刚调试还有
但是我想录屏的时候每次都不报错了
现在调试了几十次都不会报错了
而且同样的错误是随机发生的,没有规律
这个是unity的问题还是电脑的问题

img


```c#
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class Tower : MonoBehaviour
{
 public List<GameObject> emenys = new List<GameObject>();
    private void OnTriggerEnter(Collider col)
    {
        if (col.tag == "emeny") 
        emenys.Add(col.gameObject);
    }
    private void OnTriggerExit(Collider col)
    {
        if (col.tag == "emeny")
        {
            emenys.Remove(col.gameObject);
        }
    }
    public float attackRateTime;
    private float timer=0;

    public GameObject bulletPrefab;
    public Transform fireposition;

    private void Update()
    {
        timer += Time.deltaTime;
        if(emenys.Count > 0&&timer>attackRateTime) 
        {
            timer = 0;
            Attack();
        }
    }
    void Attack()
    {
        if (emenys[0]==null)
        {
            UpdateEmenys();
        }
        if (emenys.Count > 0 && emenys[0]!=null)
        {
            GameObject bullet = GameObject.Instantiate(bulletPrefab, fireposition.position, fireposition.rotation);
            bullet.GetComponent<bullet>().SetTarget(emenys[0].transform);
        }
        else
        {
            timer = attackRateTime;
        }
    }
    void UpdateEmenys()
    {
        List<int>emptyIndex=new List<int>();
        for(int index=0; index<emenys.Count; index++)
        {
            if (emenys[index]==null)
            {
                emptyIndex.Add(index);
            }
        }
        for(int i=0;i<emptyIndex.Count;i++)
        {
            emenys.RemoveAt(emptyIndex[i] - i);
        }
    }
}


```

  • 写回答

23条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-07 08:36
    关注
    获得0.60元问题酬金

    引自免费微信小程序:皆我百晓生

    针对您提供的Unity游戏开发中的错误信息,我们可以逐条分析并提出相应的解决思路。以下是关于这两个错误的详细解析与可能的解决方案:

    错误1:ObjectDisposedException: SerializedProperty emenys.Array.data[2] has disappeared!

    这个错误表明在访问SerializedProperty对象时,其对应的Unity引擎内部对象已经被销毁(disposed)。具体来说,您尝试访问名为emenys.Array.data[2]的序列化属性,但该对象似乎在被访问前已被释放。

    解决思路:

    1. 检查访问时机:确保您仅在编辑器脚本(例如Inspector定制、EditorWindow等)的适当生命周期内访问序列化属性,避免在对象销毁后仍尝试访问。确认是否在OnEnable()OnInspectorGUI()等适宜的回调方法中进行操作,并在OnDisable()中清理相关引用。

    2. 确保对象有效性:在访问SerializedProperty之前,添加条件判断,确认其所属的SerializedObject是否仍然有效且未被销毁。例如:

      if (serializedObject != null && serializedObject.isEditingMultipleObjects == false && serializedObject.targetObject != null)
      {
          // 安全地访问序列化属性
      }
      
    3. 更新/刷新序列化对象:在访问序列化属性前,调用SerializedObject.Update()方法确保其状态与当前场景同步。这有助于避免因对象状态变化导致的异常。

      serializedObject.Update();
      // 访问序列化属性...
      serializedObject.ApplyModifiedProperties();
      

    错误2:type is not a supported pptr value

    这个错误提示您试图处理的SerializedProperty类型不支持作为对象指针(pptr)值。通常,这意味着您尝试对非对象类型的序列化属性应用了仅适用于对象引用的操作。

    解决思路:

    1. 正确识别属性类型:在访问序列化属性前,先通过SerializedProperty.propertyType检查其实际类型。确保您对不同类型属性执行相应正确的操作。

      switch (property.propertyType)
      {
          case SerializedPropertyType.ObjectReference:
              // 对象引用相关的操作...
              break;
          case SerializedPropertyType.String:
          case SerializedPropertyType.Integer:
          case SerializedPropertyType.Boolean:
          // 其他类型...
          default:
              Debug.LogWarning($"Unsupported property type encountered: {property.propertyType}");
              break;
      }
      
    2. 修正访问逻辑:如果错误出现在访问特定索引(如data[2])的数组元素上,请确保该元素确实是一个对象引用类型(如MonoBehaviour、ScriptableObject等)。检查您的数据结构定义,确保与序列化逻辑一致。

    综上所述,为解决上述两个错误,您应着重检查序列化属性访问的时机、对象有效性以及属性类型匹配性。根据以上提供的解决思路调整相关代码,确保对序列化属性的访问与操作符合Unity引擎的要求。若问题依然存在,可能需要进一步排查具体的序列化逻辑及相关脚本代码。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月15日
  • 修改了问题 4月7日
  • 修改了问题 4月7日
  • 请提交代码 4月7日
  • 展开全部