2015-04-03 10:36:20 a3636987 阅读数 3232
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4631 人正在学习 去看看 张刚

异步加载的方法很多,这里我介绍一下我前段时间学到的一个异步加载方法,感觉挺好用,有兴趣的可以看看,下面就直接贴代码:

/// <summary>
/// Async to load.
/// Created By Hong Youwei
/// 2015.3.25
/// </summary>

using UnityEngine;
using System.Collections;

public class AsyncToLoad : MonoBehaviour {
	public GameObject background;			// 获取游戏背景
    public GameObject loadingBar;           // 进度条对象
    UISlider slider;                        // 进度条脚本
    UILabel lable_Percentage;               // 显示进度的百分比的标签

	// Use this for initialization
	void Start () {
		UISprite sprite = background.GetComponent<UISprite> ();
		sprite.spriteName = GameInfo.loadSceneName;
        LoadScene();
	}

    // 调用加载界面的加载协程
    public void LoadScene() {
        slider = loadingBar.GetComponent<UISlider>();
        lable_Percentage = loadingBar.GetComponentInChildren<UILabel>();
        StartCoroutine(StartLoading(GameInfo.loadSceneName));//StartLoading后面括号填的是要加载的界面的名字,我这里填的是我自己的界面名字加载,使用的话,记得设置为你自己的界面名字比如StartCoroutine(StartLoading("Level1"));
    }

    // 异步加载协同程序
    IEnumerator StartLoading(string name) {

        int displayProgress = 0;                // 进度条显示值
        int toProgress = 0;                     // 进度条要达到的值
        AsyncOperation aop = Application.LoadLevelAsync(name);
        aop.allowSceneActivation = false;           // 设置不允许加载完成就进入界面
        // 判断是否进度小于0.9,如果是的话循环输出进度条的值
        while (aop.progress < 0.9f)
        {
            toProgress = (int)(aop.progress * 100);
            while (displayProgress < toProgress)
            {
                ++displayProgress;
                SetLoadingPercentage(displayProgress);
            }
            yield return new WaitForEndOfFrame();// 每次循环结束执行完当前帧才继续下一个循环
        }
        // Unity就只会加载场景到90%,剩下的10%要等到allowSceneActivation设置为true后才加载,所以设置增加进度条效果,让进度条平滑显示达到100%
        toProgress = 100;
        while (displayProgress < toProgress)
        {
            ++displayProgress;
            SetLoadingPercentage(displayProgress);
            yield return new WaitForEndOfFrame();
        }

        yield return new WaitForSeconds(0.2f);//延缓进入游戏时间,如果场景较小加载很快,为了看到进度效果,做了个小小延迟,不需要的可以去掉
        aop.allowSceneActivation = true;            // 设置加载完成可以进入界面
    }

    // 设置加载进度条信息
    void SetLoadingPercentage(int _value)
    {
        slider.value = _value / 100.0f;
        lable_Percentage.text = _value + "%";
    }
}

以上有一部分是直接调用了NGUI插件的UISprite做背景,调用UILable做一个百分比数字显示,调用UISlider作为一个进度条

2018-10-23 10:21:10 tianxiaojie_blog 阅读数 1925
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4631 人正在学习 去看看 张刚

unity 加载场景的方式分为 直接加载和动态加载

 SceneManager.LoadScene(PCLevelName);//直接加载,销毁掉原来的场景
 SceneManager.LoadSceneAsync(PCLevelName);//异步加载,加载完成后销毁原来的场景
 SceneManager.LoadScene(PCLevelName, LoadSceneMode.Additive);//直接加载,把加载的场景叠加到原场景上
 SceneManager.LoadSceneAsync(PCLevelName,LoadSceneMode.Additive); //异步加载,,把加载的场景叠加到原场景上

unity arkit 如何加载场景之后变成一个包裹的场景

//需要在arkit场景中的主摄像机下添加一个普通摄像机
SceneManager.LoadSceneAsync(ARLevelName, LoadSceneMode.Additive);//加载包裹场景的
GameObject ARCamera = GameObject.Find("ARCamera");//找到添加的普通摄像机
//屏蔽原摄像机启用添加的摄像机
ARCamera.GetComponent<AudioListener>().enabled = true;
ARCamera.GetComponent<Camera>().enabled = true;
Camera.main.GetComponent<AudioListener>().enabled = false;
Camera.main.GetComponent<Camera>().enabled = false;
2018-12-17 19:12:13 tubugs 阅读数 107
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4631 人正在学习 去看看 张刚

自学笔记,仅供参考。



		string path = "AssetBundles/cubewall.unity3d";

		//本地同步加载
		AssetBundle ab = AssetBundle.LoadFromFile ("AssetBundles/share.unity3d"); //要先加载所依赖的资源
		AssetBundle ab2 = AssetBundle.LoadFromFile (path);
		//本地异步加载,需要协程
		AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync (path);
		yield return request;
		AssetBundle ab = request.assetBundle;

		//内存异步加载,需要协程
		AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync (File.ReadAllBytes (path));
		yield return request;
		AssetBundle ab = request.assetBundle;
		//内存同步加载
		AssetBundle ab = AssetBundle.LoadFromMemory (File.ReadAllBytes (path));

		//通过WWW加载,已被Unity弃用
		while (!Caching.ready)
			yield return null;
		WWW www = WWW.LoadFromCacheOrDownload (@"file:///G:\unity\Project\AssetBundleLearn\AssetBundles\CubeWall.unity3d",1);
		WWW www = WWW.LoadFromCacheOrDownload (@"http://localhost/AssetBundles/CubeWall.unity3d",1);
		yield return www;
		if (!string.IsNullOrEmpty (www.error))
		{
			Debug.Log (www.error);
			yield break;
		}
		AssetBundle ab = www.assetBundle;

		//使用UnityWbeRequest加载
		string uri = @"file:///G:\unity\Project\AssetBundleLearn\AssetBundles\CubeWall.unity3d";
		//服务器端地址
//		string uri = @"http://localhost/AssetBundles/CubeWall.unity3d";
		UnityWebRequest request = UnityWebRequest.GetAssetBundle (uri);
		yield return request.SendWebRequest ();
		//两种方法
//		AssetBundle ab = DownloadHandlerAssetBundle.GetContent (request);
		AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;

		//实例化资源
		GameObject wallPrefab = ab.LoadAsset<GameObject> ("CubeWall");
		Instantiate (wallPrefab);

                //通过Manifest加载依赖资源
		AssetBundle manifestAB = AssetBundle.LoadFromFile ("AssetBundles/AssetBundles");
		AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest> ("AssetBundleManifest");

		string[] strs = manifest.GetAllDependencies ("cubewall.unity3d");
		foreach (string name in strs)
		{
			print (name);
			AssetBundle.LoadFromFile ("AssetBundles/" + name);
		}
		foreach (string name in manifest.GetAllAssetBundles())
			print (name);

2019-08-11 22:23:08 piai9568 阅读数 119
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4631 人正在学习 去看看 张刚

Unity3D加载贴图几种常用的方式

第一种 通过WWW异步加载

通过WWW 加载完成后 ,用www.texture获得贴图,然后 通过Sprite.Create()创建Sprite,赋给相应的Image显示。

  private IEnumerator LoadImageWithWWW(string imageName,Action<int,Sprite> callBack)
   {
      //在editor中或者iOS中,需要添加"file://" ; Android 不需要
      #if UNITY_IOS || UNITY_EDITOR
      var url = "file://"+Application.streamingAssetsPath + "/" + imageName;
      #elif UNITY_ANDROID
      var url = "file://"+Application.streamingAssetsPath + "/" + imageName;
       #endif
      
      WWW www = new WWW(url);
      
      yield return www;

      while (!www.isDone)
      {
         yield return 0;
      }
   
      if (string.IsNullOrEmpty(www.error))
      {
         var texture = www.texture;
         if (texture!=null)
         {
            Sprite sprite = Sprite.Create(texture,new Rect(0,0,texture.width, texture.height),new Vector2(0.5f, 0.5f));
            callBack(0, sprite);
         }
         else
         {
            callBack(-1, null);
         }
      }
      else
      {
         callBack(-1, null);
         Debug.LogError(www.error);
      }
      www.Dispose();
   }

第二种 通过UnityWebRequest 异步加载

Unity提供了专门针对加载Texture的UnityWebRequest封装,UnityWebRequestTexture,可以直接使用它来加载贴图。然后通过 DownloadHandlerTexture.GetContent()来获得贴图。

private IEnumerator LoadImageWithWebRequest(string imageName,Action<int,Sprite> callBack)
   {
      //在editor中或者iOS中,需要添加"file://" ; Android 不需要
      #if UNITY_IOS || UNITY_EDITOR
      var url = "file://"+Application.streamingAssetsPath + "/" + imageName;
      #elif UNITY_ANDROID
      var url = "file://"+Application.streamingAssetsPath + "/" + imageName;
       #endif
      
      UnityWebRequest unityWebRequest = UnityWebRequestTexture.GetTexture(url);
      
      yield return unityWebRequest.SendWebRequest();

      if (string.IsNullOrEmpty(unityWebRequest.error))
      {
         var texture = DownloadHandlerTexture.GetContent(unityWebRequest);
         if (texture!=null)
         {
            Sprite sprite = Sprite.Create(texture,new Rect(0,0,texture.width, texture.height),new Vector2(0.5f, 0.5f));
            callBack(0, sprite);
         }
         else
         {
            callBack(-1, null);
         }
      }
      else
      {
         callBack(-1, null);
         Debug.LogError(unityWebRequest.error);
      }
      unityWebRequest.Dispose();
   }

第三种 同步加载

获得文件的byte数组,然后通过Texture2D 的LoadImage函数,讲内容填充到 texture中。texture的宽和高会自动按bytes的内容来相应变化。

  private void LoadTexture(string path,Action<int,Texture> callback)
   {
      Texture2D texture2D = new Texture2D(2,2);
      if (File.Exists(path))
      {
         var bytes = File.ReadAllBytes(Application.streamingAssetsPath+"/1.png");
         texture2D.LoadImage(bytes);
         texture2D.anisoLevel = 8;
         callback(0, texture2D);
      }
      else
      {
         callback(-1, null);
      }
   }

使用代码

 public Image ImagePrefab; //需要再Inspector上赋值

   void Start ()
   {
      string[] imageNames = {"1.png","2.png","3.png","4.png","5.png"};

      foreach (var imageName in imageNames)
      {
         StartCoroutine(LoadImageWithWebRequest(imageName,OnLoadComplete));
      }
   }
   
   /// <summary>
   /// 加载完成的回调
   /// </summary>
   /// <param name="result"></param>
   /// <param name="sprite"></param>
   private void OnLoadComplete(int result,Sprite sprite)
   {
      if (result == 0)
      {
         Image img = GameObject.Instantiate(ImagePrefab);
         img.transform.SetParent(this.transform);
         img.sprite = sprite;
      }
   }

注意Unity的常用路径访问方式:

  • 当使用www或者unitywebrequest 方式异步加载时,在编辑器和ios平台,如果使用的Application.streamingAssetsPath,需要再前面加上“file://”,而ios平台则是不需要的。
  • iOS平台Application.streamingAssetsPath可以使用File.ReadAllBytes 同步加载,但是android 平台不可以。只能使用异步方式,通过www或者unitywebrequest加载。
  • 所有平台的 Application.PersistentPath 可以使用File.ReadAllBytes同步加载。

更多Unity教程请关注微信公众号UnityAsk。
在这里插入图片描述

2016-09-21 00:14:04 Acmer_Sly 阅读数 2911
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4631 人正在学习 去看看 张刚

本文转载自 “android,unity3d” 博客,出处http://mahaile.blog.51cto.com/2891586/771167


首先创建一个新的场景 
 
 
点击菜单栏中的 Terrain-> create Terrain 菜单  

 
 
完成后如 下图
 
 
 
 
 
 

创建地形系统的时候 unity会按默认的 宽高 图像分辨率,纹理分辨率 等创建一个地形  不过不怕 这些我们都可以修改滴  

  如果需要在game 窗口(即是游戏运行窗口)中看效果 ,需要调整下摄像机的位置和角度  

操作方式  选中  Hierarchy 中的 main camera 摄像机 然后使用 场景编辑器上面那4 个 功能(拖动,移动,旋转,缩放)进行调节即可 调节过程中就可以再game 窗口中看到效果啦,   各位童鞋 多操作几次就可以熟练操作了


 
点击 Terrain ->resolution 菜单 可以设置地形的各个参数
 
 
 
如下图
 
 
 
 
 
 
 
 

 
如上图所示从上到下分别代表的含义是

 
Terrain Width: 地形的宽度

Terrain Height: 地形的高度

Terrain Length:地形的长度
 
HeightMap Resolution:地形高度图的分辨率
 
Detail Resolution:细节分辨率,控制草和细节网格地图的分辨率。数值越高标示效果越好,想对也越消耗机器性能,可能会卡。根据情况适当的调节。
 
Control Texture Resolution:控制不同纹理的分辨率。
 
Base Texture Resolution:控制相对纹理分辨率,这里指一定范围内的。

 
 
设置完毕点击 set Resolution按钮,有兴趣的朋友可以动态的修改一下参数,看看你的地形发生了什么样的改变?

 
修改完后我们来给地形添加点元素吧 

 
选中 Hierarchy 中的 刚刚创建的terrain 地形 右边出现了地形的编辑窗口
 
如图
 
 
 
 
 
 
 
 
 
 
上图中 的红框框 讲解  从上 到下
 
 
1: position 是地形的 位置坐标  
 
   rotation 的旋转坐标
 
   scale   缩放比例
 
   这个位置任何游戏组件都有这 3 个属性
 
 
 
2:  这7 个属性 从左往右 分别是 编辑高度、编辑特定高度、设置平滑、纹理贴图、画树模型、画草模型、其他设置.善用着七个工具可以编辑一个非常不错的游戏地形,稍后我会介绍这七个按钮的具体操作流程。
 
 
 
 2.1 选中编辑高度   下面出现 barusher 和 settings  属性栏

Brushes:地形绘制画笔,这里有很多种画笔的图案可供我们选择。
 
Brush Size :画笔宽度取值范围
Opacity :画笔高度取值范围
 

 
如图 
 
 
 
 
 
各位童鞋 可以修改参数 在地图系统上 绘制 高度 感受这些参数的 意义 
 
 
 
 
 
 
上图是我使用编辑高度拖拽出来的效果  现在有点难看哈 ,,没事滴   我们继续完善它 

 
 
2.2  编辑特定高度
 
 
和编辑高度页面中的信息差不多,只是多了一个Height用来设置最大的高度,编辑高度中Opacity是最大高度,但是在这里Height才是最大高度但是Opacity必需有数值,举个例子Opacity设置为100  Height设置 80 最高的高度就是80   .Opacity设置为20  Height设置 100最高的高度还是20.   
 
 
 
 
2.3 设置平滑
 
用上面拉出来的地形 如果 近距离看 会发现 有些山峰 的边角会有些粗糙, 这时我们就可以使用 设置平滑来 山峰的边角平滑过渡

 
2.4  纹理贴图
 
这个东东呢 ,就是给地图加上图片 ,从而实现 好看的地图 而非像上面光光的  图片资源方面我们可以导入系统标准的资源库,里面有很多好看的地形资源,当然也可以自己添加喜欢的图片做地形资源。
 
导入系统 图片资源  选择  菜单栏中的assets -> import package -> terrain assets   点击导入 ,这里只是导入 地形系统的资源  在此次你也可以导入其他资源   如下图
 
 
 
 
 
 
 
 

 
点击Edit Textures  出现一个下拉列表
 add Textures 添加一个贴图 
 Edit Textures  编辑贴图
 Remove Textures删除贴图
 
点击 addTextures 添加一个贴图 
 
如图 中的 箭头 标记  选择一个 你喜欢的地形图片  给地形 
 
 
 
 
 

Add Terrain Texture (添加贴图)
splat :选择一个贴图,上面导入了系统自带的地形资源,在这里随便添加两个贴图用于区分资源。也可以添加自己喜欢的图片,拖放在工程中就可以在这里看到图片资源。
 
Tile size x: 设置贴图X轴宽度
Tile size x:设置贴图Y轴宽度
Tile offset x:设置贴图X轴偏移量
 

Tile offset y:设置贴图Y轴偏移量


 

有兴趣的童鞋修改一下参数方可看到效果,这里暂时使用默认数值。。


 
 
现在回头看看 是不是好看多了 , 精彩还在后面的 ,我们继续 ....

 
 
2.5   画树模型 
 
 
既然 是地形 当然是有树啦  
 
 
Hierarchy 标签栏中,点击Create - > Tree 可以创建一个树的模型,设置自己的树木模型,这里我们先导入系统自带的树木模型,以后在讨论自定义模型的制作。

 
因为新建的工程中是没有树木和草地的贴图元素,可以在Unity3D 的标准资源库中导入,导入的方法和纹理贴图介绍的一样。打开Unity3D 在Project标签栏中 鼠标右键 Import package - > Tree Creator 将标准树木资源模型导入工程。
 
 
点击 Add Terrain Texture 添加一个 树模型  过程和 添加纹理贴图 类似 
 
 
如下图  
 
 
 
 
 
在上图中 花树模型的 属性 
 
 
Brush Size : 画笔绘制一次树木添加数量,数值越大越多,越小则越少,取值范围0到100。
Tree Density:树之间的百分比,在一片树中间在放入量一片树就得修改这个数值了,取值范围0到100。
Color Variation:树之间颜色差的范围,取值范围0到1。
TreeHeight:树的高度,它是与场景模型有一定比例,越大树越高,取值范围0到200。
Variation:树与树之间的高度比例,取值范围0到30。
Tree Width:树的宽度,它是与场景模型有一定比例,越大树越宽,取值范围0到200。
Variation: 树与树之间的宽度比例,取值范围0到30。


 
 
 
 
 
 
童鞋可以 调整这些参数 才地形上 花 并观看 效果 

 
我在 地形上 添加了 树 效果如下

 
 
 
 
game 游戏运行时的效果 如图
 
 
 
但我们在 游戏 的 game 窗口中 看 效果 会 发现  地形中 灰暗暗的一片  这是为什么呢 , 这是因为 光线不够 ,   这些unity 都为我们想好了 ,记得我们 前面有一章讲了 game object 吗 ?  现在我们来添加一个 平行光 (如何添加平行光 不知道的童鞋去看 Unity3D游戏开发 创建简单的游戏世界(三)  添加游戏组件 ),给 地形加点 亮度
 
各位童鞋注意哦,平行光的位置对游戏中的亮度是没有关系的, 角度才对亮度有关系, 所以我们添加了 平行光 旋转旋转角度就可以搞定了   

 
如下图 是不是好看多了  
 
 
 
 
画草模型:

起始它不仅能草,还能画一些自定义模型,可以处理一些零碎的小东西丰富游戏场景 它或 画树模型有些类似  这里就不再多啰嗦了 
 
主要设置一些3D游戏地形的一些参数


一下面列出一些主要参数的介绍,盆友们可以自己拖动鼠标修改一下其中的具体数值就可以在游戏视图中清晰的看到效果。

Pixel Error:控制地形密度容差,数值越大越圆滑,越小地形角度越明显。
Base Map Dist:控制地形贴图的距离.
Case shadows: 是否显示地形阴影
Draw:是否绘制绘制场景模型,比如树,草等等。
Wind Settings 地形中风的设置
Speed:风速 
Size:风的范围


 
 
学习了这一章 童鞋们赶快 试试 制作自己的喜欢的游戏地形吧 ,   哈哈 ,, 这章暂时就到这了 ,  有什么不明白的地方或遗漏的地方  欢迎积极留言 , 大家共同学习 共同进步 咔咔 

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