Unity 出现error CS0103: The name ‘AssetDatabase‘ does not exist in the current context

Posted 旭God的舔狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 出现error CS0103: The name ‘AssetDatabase‘ does not exist in the current context相关的知识,希望对你有一定的参考价值。

问题描述

在Unity场景中,在进行build操作时出现这种报错,导致资源bundle无法正常生成,出现以下问题:

error CS0103: The name 'AssetDatabase' does not exist in the current context

error CS0234: The type or namespace name 'AssetDatabase' does not exist in the namespace 'UnityEditor' (are you missing an assembly reference?)

ps:上面两种错误都是同一种问题造成的,报错不一样的原因是由于UnityEditor在代码中的位置不同造成的:
前者是在开头声明了using UnityEditor,方法中使用AssetDatabase.LoadAssetAtPath;
后者是未声明using UnityEditor,而是在方法中直接使用了UnityEditor.AssetDatabase.LoadAssetAtPath


原因分析

在非Editor文件夹下的脚本中,存在着有关UnityEditor方法的使用

方法中第一行使用了UnityEditor中的AssetDatabase.LoadAssetAtPath方法,并且该方法所在的文件并非是在Editor文件夹下,导致build操作时出现报错

    private void EditorLoadAsset(string assetName, Action<UnityEngine.Object> action)
    
        UnityEngine.Object obj = UnityEditor.AssetDatabase.LoadAssetAtPath(assetName, typeof(UObject));
        if (obj == null)
            Debug.LogError("asset name is not exist: " + assetName);
        action?.Invoke(obj);
    


解决方案

添加
#if UNITY_EDITOR

#endif

在方法外部,加上#if UNITY_EDITOR #endif,保证该方法只有在Unity编辑器中运行

#if UNITY_EDITOR
    private void EditorLoadAsset(string assetName, Action<UnityEngine.Object> action)
    
        UnityEngine.Object obj = UnityEditor.AssetDatabase.LoadAssetAtPath(assetName, typeof(UObject));
        if (obj == null)
            Debug.LogError("asset name is not exist: " + assetName);
        action?.Invoke(obj);
    
#endif

注意

注:需要把调用该方法的地方也要用#if #endif包括起来
因为该方法时需要被调用的,然后测试的时候出现了以下问题
error CS0103: The name 'EditorLoadAsset' does not exist in the current context
出现问题的原因是调用此方法的地方未用#if #endif包含进去,在正式运行状态下,他会认为该方法不存在,找不到该方法导出出现报错。所以要将调用该方法的地方也要用#if #endif包括进来,让正式运行状态下也不用执行调用该方法的语句

Unity-报错解决error CS0619: ‘XRDevice.isPresent‘ is obsolete

Unity报错解决error CS0619: 'XRDevice.isPresent' is obsolete:

1.问题描述

Assets\\Battlehub\\RTCommon\\Scripts\\RTEBase.cs(690,20): error CS0619: ‘XRDevice.isPresent’ is obsolete: ‘This is obsolete, and should no longer be used. Instead, find the active XRDisplaySubsystem and check that the running property is true (for details, see XRDevice.isPresent documentation).’

这个报错是我在使用Unity的RuntimesEditor插件的时候出现的,大概就是说API过期了需要修改一下。


2.解决办法

在网上查了查没找到相关的,于是就根据报错提示直接去Unity的Api文档查看。看了一下才知道是之前的接口不能用了,重写一下就行。XRDevice.isPresent文档。按照文档中说的重写一个内部类再调用就行。
在代码中添加下面这部分,然后修改一下调用的代码就行。

internal static class ExampleUtil

    public static bool isPresent()
    
        var xrDisplaySubsystems = new List<XRDisplaySubsystem>();
        SubsystemManager.GetInstances<XRDisplaySubsystem>(xrDisplaySubsystems);
        foreach (var xrDisplay in xrDisplaySubsystems)
        
            if (xrDisplay.running)
            
                return true;
            
        
        return false;
    

以上是关于Unity 出现error CS0103: The name ‘AssetDatabase‘ does not exist in the current context的主要内容,如果未能解决你的问题,请参考以下文章

ScriptableObject本地序列化后重启Unity后报The associated script can not be loaded.Please fix any compile errors

Unity-报错解决error CS0619: ‘XRDevice.isPresent‘ is obsolete

ERROR CS0234名称空间名称“编码”不存在

unity error CS0201: 只有赋值、调用、递增、递减、等待和新对象表达式可以作为语句使用

error CS0433: The type global_asax exists in both App_global.asax

错误 CS0103:当前上下文中不存在名称“HttpUtility”