2017-02-21 10:02:48 hoxily 阅读数 448

原文地址:https://support.unity3d.com/hc/en-us/articles/206365956-What-is-CS0118-

症状

你在Console窗口看到了如下错误:

error CS0118: `__’ is a `__’ but a `__’ was expected.

原因

这个错误发生的原因是,某个概念没有被正确地使用,或者在一个概念上尝试执行不被允许的操作。

在下面的脚本中,我尝试传递一个命名空间给一个函数。于是它显示了CS0118号错误,因为我错误地使用命名空间,把它传递给一个函数。

CS0118号错误例子

本例的错误信息如下:

error CS0118: `Helper’ is a `namespace’ but a `type’ was expected.

解决方案

解决方案就是使用正确的概念(本例中是一个类型)或者找到另一种方式来使用那个概念(本例中是一个命名空间)。

无需传递进函数,直接访问DisplayCredits,这个例子的错误就修复了。

修复CS0118号错误的例子

更多信息

https://msdn.microsoft.com/en-us/library/fzc6hyft(v=vs.90).aspx

2016-11-17 03:23:51 zhangyx_Xyz 阅读数 1326

在上一篇博客我介绍了Unity新版AssetBundle系统的一些知识点,在这篇博客中,我用一个小小的Demo来实践一下(Demo的开发工具为Unity5.3.5 + VS2015,请注意IDE版本)。

先准备一个Modle,资源结构如下所示

预制体JuShiGuai使用了材质球Mat1,Mat2,而Mat1,Mat2又分别使用了JuShiGuai_01,JuShiGuai_02两个贴图文件。

这里写图片描述

下面就长话短说直接上代码,具体的用法可以参见上一篇博客

1.设置Modle下的资源的AssetBundleName

  • Mat1 : materials/mat1.unity3d
  • Mat2 : materials/mat2.unity3d
  • JuShiGuai_01 : texture/jushiguai_01.unity3d
  • JuShiGuai_02 : texture/jushiguai_02.unity3d
  • JuShiGuai : jushiguai.unity3d

这儿我直接按原有目录设置,具体情况在实际使用中有待商榷

2.编写AssetBundle打包代码

  • 为了方便路径的管理,这儿采用我再 Unity 中管理Tag的方式来管理

创建AssetBundleConfig.cs,管理路径

using UnityEngine;
using System.Collections;

/*****************************************************************************
* @author : zyx
* @date : 2016/11/16 15:15
* @instructions : 设置打包AssetBundle用的的相关路径
*****************************************************************************/
public class AssetBundleConfig : MonoBehaviour {

    //AssetBundle打包后存储的路径
    public static string ASSETBUNDLE_PATH = Application.dataPath + "/StreamingAssets/";

    //资源地址
    public static string APPLICATION_PATH = Application.dataPath + "/";

    //工程根目录地址
    public static string PROJECT_PATH = APPLICATION_PATH.Substring(0, APPLICATION_PATH.Length - 7);

    //AssetBundle打包的后缀名
    public static string SUFFIX = ".assetbundle";
}
  • 2.创建 AssetBundleBuild.cs,打包AssetBundle

这儿我使用了LZ4压缩格式,保证包的大小和加载速度额均衡

using UnityEngine;
using System.Collections;
using UnityEditor;

/*****************************************************************************
* @author : zyx
* @date : 2016/11/16 15:16
* @instructions : AssetBundle打包
*****************************************************************************/
public class AssetBundleBuild : MonoBehaviour {
    [MenuItem("AssetBundle Editor/AssetBundle Build")]
    static void AssetBundlesBuild()
    {
        //注:第一个存放AssetBundle的路径取相对地址
        BuildPipeline.BuildAssetBundles(AssetBundleConfig.ASSETBUNDLE_PATH.Substring(AssetBundleConfig.PROJECT_PATH.Length),
            BuildAssetBundleOptions.DeterministicAssetBundle|BuildAssetBundleOptions.ChunkBasedCompression,
            BuildTarget.StandaloneWindows64
            );
    }
}
  • 代码编译后会在Unity工具栏挂载AssetBundle Editor栏,点击菜单栏AssetBundle Build就会自动对所有设置了assetbundleName的代码进行打包

3.编写AssetBundle加载代码

在传统的方法中,我们加载一个资源,总是加载资源的依赖项–>加载资源–>卸载依赖项,但是当一个资源频繁被其他资源依赖,这样无疑会造成性能问题。

一个可行的解决方案是:我们可以把加载好的资源用字典存着,下次如果还需要加载这个依赖项就可以直接从字典里面读取,程序运行结束后在卸载字典中加载的AssetBundle.

当然可能还会有更好的加载方案,比如统计一个资源的被依赖次数和使用频率,然后定义一个时间周期,将不活跃的资源定期销毁

这儿我就采用字典的方案,把加载好的资源用字典存着

  • 创建 AssetBundleLoad.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

/*****************************************************************************
* @author : zyx
* @date : 2016/11/16 15:20
* @instructions : AssetBundle的加载,采用字典存贮依赖项,避免频繁地加载和卸载AssetBundle
*****************************************************************************/
public class AssetBundleLoad : MonoBehaviour
{

    private static AssetBundleManifest manifest = null;
    private static Dictionary<string, AssetBundle> assetBundleDic = new Dictionary<string, AssetBundle>();
    void OnGUI()
    {
        if (GUILayout.Button("Load JushiGuai"))
        {
            StartCoroutine(InstanceAsset("jushiguai"));
        }
    }

    public AssetBundle LoadAssetBundle(string Url)
    {
        if (assetBundleDic.ContainsKey(Url))
            return assetBundleDic[Url];
        if (manifest == null)
        {
            //Debug.Log(AssetBundleConfig.ASSETBUNDLE_PATH);
            AssetBundle manifestAssetBundle = AssetBundle.LoadFromFile(AssetBundleConfig.ASSETBUNDLE_PATH + "StreamingAssets");
            manifest = (AssetBundleManifest)manifestAssetBundle.LoadAsset("AssetBundleManifest");
        }
        if (manifest != null)
        {
            //获取当前加载AssetBundle的所有依赖项的路径
            string[] objectDependUrl = manifest.GetAllDependencies(Url);
            foreach (string tmpUrl in objectDependUrl)
            {
                //通过递归调用加载所有依赖项
                LoadAssetBundle(tmpUrl);
            }
            Debug.Log(AssetBundleConfig.ASSETBUNDLE_PATH + Url);
            assetBundleDic[Url] = AssetBundle.LoadFromFile(AssetBundleConfig.ASSETBUNDLE_PATH + Url);
            return assetBundleDic[Url];
        }
        return null;
    }


    private IEnumerator InstanceAsset(string assetBundleName)
    {
        string assetBundlePath = assetBundleName + AssetBundleConfig.SUFFIX;
        int index = assetBundleName.LastIndexOf('/');
        string realName = assetBundleName.Substring(index + 1, assetBundleName.Length - index - 1);
        yield return LoadAssetBundle(assetBundlePath);
        if (assetBundleDic.ContainsKey(assetBundlePath) && assetBundleDic[assetBundlePath] != null)
        {
            Object tmpObj = assetBundleDic[assetBundlePath].LoadAsset(realName);
            yield return Instantiate(tmpObj);
            assetBundleDic[assetBundlePath].Unload(false);
        }
        yield break;
    }
}

最后一张层序运行截图奉上

这里写图片描述

4.assetbundleName的自动化设置和清除

新版的AssetBundle虽然提出了AssetBundleName这样一个新的方法。但是在实际工程中,如果对于每个资源都手动添加设置Name。一来会十分麻烦,二来容易出错,三来不方便管理。所以在实际项目中,我们需要一个方法对于一些资源进行批量命名。

一个可行的方案就是,在工程中把资源分类的放好,我们直接读取资源的相对路径+名字,设置为它的assetbundleName,这样AssetBundle打包之后就会有和源资源相同的目录层级结构,更便于管理

  • 创建AssetBundleNameEdit.cs动态的设置清除assetbundleName
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;

/*****************************************************************************
* @author : zyx
* @date : 2016/11/16 16:47
* @instructions : 添加工具栏,一键式添加,移除AssetBundleName
*****************************************************************************/
public class AssetBundleNameEdit : MonoBehaviour
{

    [MenuItem("AssetBundle Editor/SetAssetBundleName")]
    static void SetResourcesAssetBundleName()
    {
        //只读取当前选中的目录,排除子目录
        Object[] SelectedAsset = Selection.GetFiltered(typeof(Object), SelectionMode.Assets | SelectionMode.ExcludePrefab);
        //此处添加需要命名的资源后缀名,注意大小写。
        string[] Filtersuffix = new string[] { ".prefab", ".mat", ".dds" };
        if (SelectedAsset.Length == 0) return;
        foreach (Object tmpFolder in SelectedAsset)
        {
            string fullPath = AssetBundleConfig.PROJECT_PATH + AssetDatabase.GetAssetPath(tmpFolder);
            //Debug.Log(fullPath);
            if (Directory.Exists(fullPath))
            {
                DirectoryInfo dir = new DirectoryInfo(fullPath);
                var files = dir.GetFiles("*", SearchOption.AllDirectories);
                for (var i = 0; i < files.Length; ++i)
                {
                    var fileInfo = files[i];
                    //显示进度条
                    EditorUtility.DisplayProgressBar("设置AssetBundleName名称", "正在设置AssetBundleName名称中...", 1.0f * i / files.Length);
                    foreach (string suffix in Filtersuffix)
                    {
                        if (fileInfo.Name.EndsWith(suffix))
                        {
                            string path = fileInfo.FullName.Replace('\\', '/').Substring(AssetBundleConfig.PROJECT_PATH.Length);
                            //资源导入器
                            var importer = AssetImporter.GetAtPath(path);
                            if (importer)
                            {
                                string name = path.Substring(fullPath.Substring(AssetBundleConfig.PROJECT_PATH.Length).Length + 1);
                                importer.assetBundleName = name.Substring(0, name.LastIndexOf('.')) + AssetBundleConfig.SUFFIX;
                            }
                        }
                    }
                }
            }

        }
        //删除所有未使用的assetBundle资产数据库名称
        AssetDatabase.RemoveUnusedAssetBundleNames();
        EditorUtility.ClearProgressBar();
    }


    //输出所有AssetBundleName
    [MenuItem("AssetBundle Editor/GetAllAssetBundleName")]

    static void GetAllAssetBundleName()
    {

        string[] names = AssetDatabase.GetAllAssetBundleNames();

        foreach (var name in names)
        {
            Debug.Log(name);
        }

    }


    [MenuItem("AssetBundle Editor/ClearAssetBundleName")]

    static void ClearResourcesAssetBundleName()
    {
        UnityEngine.Object[] SelectedAsset = Selection.GetFiltered(typeof(Object), SelectionMode.Assets | SelectionMode.ExcludePrefab);
        //此处添加需要清除的资源后缀名,注意大小写。
        string[] Filtersuffix = new string[] { ".prefab", ".mat", ".dds" };
        if (SelectedAsset.Length == 0) return;
        foreach (Object tmpFolder in SelectedAsset)
        {
            string fullPath = AssetBundleConfig.PROJECT_PATH + AssetDatabase.GetAssetPath(tmpFolder);
            if (Directory.Exists(fullPath))
            {
                DirectoryInfo dir = new DirectoryInfo(fullPath);
                var files = dir.GetFiles("*", SearchOption.AllDirectories);
                for (var i = 0; i < files.Length; ++i)
                {
                    var fileInfo = files[i];
                    EditorUtility.DisplayProgressBar("清除AssetBundleName名称", "正在清除AssetBundleName名称中...", 1.0f * i / files.Length);
                    foreach (string suffix in Filtersuffix)
                    {
                        if (fileInfo.Name.EndsWith(suffix))
                        {
                            string path = fileInfo.FullName.Replace('\\', '/').Substring(AssetBundleConfig.PROJECT_PATH.Length);
                            var importer = AssetImporter.GetAtPath(path);
                            if (importer)
                            {
                                importer.assetBundleName = null;
                            }
                        }
                    }
                }
            }
        }
        EditorUtility.ClearProgressBar();
        AssetDatabase.RemoveUnusedAssetBundleNames();
    }
}

代码编译后会在之前的工具栏AssetBundle Editor下多挂载几个选项,选中某个目录,点击菜单栏选项SetAssetBundleName(ClearAssetBundleName)就会自动对所有选中目录进行assetbundleName的添加(移除)

关于从服务器加载的实现等有空在补上。

最后附上Demo的git地址(Click here!

注:Demo的开发工具为Unity5.3.5 + VS2015,请注意IDE版本

2013-07-23 15:53:28 u010732148 阅读数 2065

刚刚整理项目,重新build时出现一些问题,这些代码在原项目中都是可以运行的。


错误信息如下:

Assets/XXXXX.cs(79,35): error CS0103: The name `NNNNNN' does not exist in the current context

或:

Assets/XXXXX.cs(82,38): error CS1061: Type `NNNNNN(某变量名)' does not contain a definition for `Initialize' and no extension method `Initialize' of type `NNNNNN(某变量名)' could be found (are you missing a using directive or an assembly reference?)


错误信息提示在当前的上下文里找不到某个变量,可事实上变量就在那里,代码也在那里......


解决的过程不说了

原因:是中文的问题,所有这种问题的变量声明上面,都有一行中文注释。

解决办法:可以删除中文注释,也可以在注释后面加一个空格,问题即解决。

2015-12-25 19:25:21 pengdongwei 阅读数 2504

首选去 ulua官网地址上面下载最新的 ulua  下载地址

然后后面的文章都会建立在 Unity3d 5.3.1 + ulua1,24 + UGUI的环境下,下载完了如果集成有问题请参考 我的异常解决方案中的第一条,环境搭建完了,ulua的结构这里不讲,自行去ulua 论坛里面查看。


使用可以参考其他同学的这个文章,用以跑起来demo 

http://blog.csdn.net/adambieber/article/details/47402805


这里主要说下自己遇到的问题,先创建一个c#类 随便去个名字,比如叫demo,然后敲入如下的代码

public class Demo : MonoBehaviour {

    LuaScriptMgr mgr;
	// Use this for initialization
	void Start () {
        mgr = new LuaScriptMgr();
        mgr.Start();
        string path = Util.LuaPath("test.lua");
	mgr.DoFile(path);
	}
然后在工程目录下存放如下的test.lua文件,为何放在这里是有原因的~ 因为LuaScriptMgr.cs 这个脚本封装的lua路径就在这里,test里面的内容可以直接我在lua文章里面的即可



接着运行你会发现 unity 控制台会报错为如下的内容。

Loader lua file failed: F:/XProject_FrameWork/XProject_FrameWork/Assets/uLua/lua/test.lua 


由于是第一次使用所以我就参考了demo里面对file这个的使用,然后把我的脚本修改为如下的内容

	void Start () {
//        mgr = new LuaScriptMgr();
//        mgr.Start();
        string path = Util.LuaPath("test.lua");
//		mgr.DoFile(path);

		//这样是ok 的
		LuaState state = new LuaState ();
		state.DoFile (path);
	}
的确这个时候并没有报错,完整的运行除了结果~~~

这个时候只能自己去调试了(有源码就是好啊,这个时候深深的再次感受到开源是多么的无私)

经过一系列的分析得出了如下的结论




所以以后如果使用LuaScriptMgr的dofile的话就直接传入文件名字即可,在此也可以想象作者其实是在做好事,帮助开发者更方便传入文件路径,只是第一次使用难免会遇到各种各样的问题,这里记录一下~~~以便有相识经历的同学少走弯路。在此感谢ulua的作者~~ 突然感觉我们的动态更新就在眼前了~~


题外话:明天有同事离职了,好忧伤~~一个战壕的队友,一起撸过通宵,一起玩过dota~~再见朋友~~



2019-06-20 15:33:42 caiqimin__ 阅读数 705

背景

  1. VS2017版本:15.4.x
  2. Unity办:Unity2018.4.0

问题

使用VS2017打开项目代码

  1. 出现了很多杂乱的项目
  2. 点击运行是,各种报错,CS2001, 或者没有指定dll文件等
    例如error CS2001: Source file could not be found
    由于文章是错误解决了之后才写的,所以没有截图了。

解决方式

  1. 升级VS2017, 截止到我写下这篇文字时,VS2017最新版本为:15.9.13
    在这里插入图片描述

后记

有问题欢迎交流
QQ: 1969877743

没有更多推荐了,返回首页